पहले ssh कनेक्शन में कई मिनट लगते हैं


1

मैं Ubuntu 17.04 पर openssh-client==7.4p1-10, कर्नेल पर चल रहा हूं 4.10.0-33-generic

मुझे ssh कमांड निष्पादित करने में समस्या आ रही है, जैसे:

rsync -t -e ssh -p 22 script.sh root@remote.server:/var/lib/script.sh
\_ ssh -p 22 -l root root@remote.server rsync --server -te.LsfxC . /var/lib/script.sh

यह लेता है rsync6 मिनट है कि स्क्रिप्ट जो 4kB है सिंक करने के लिए। समस्या सिर्फ ssh के साथ rsyncभी नहीं है git pushकभी-कभी चूसा जाता है।

मजेदार बात यह है कि इस प्रक्रिया को बाधित करने और इसे फिर से निष्पादित करने के बाद यह तुरंत काम करता है:

^Crsync error: unexplained error (code 130) at rsync.c(638) [sender=3.1.2]
rsync: [sender] write error: Broken pipe (32)

यह एक DNS मुद्दा नहीं लगता, यहाँ है /etc/resolv.conf:

nameserver 8.8.8.8
nameserver 8.8.4.4
options single-request-reopen
options attempts:2
options rotate
options timeout:2

मैंने पहले ही GSSAPI अक्षम कर दिया है:

/etc/ssh/ssh_config:

   GSSAPIAuthentication no
   GSSAPIDelegateCredentials no

बिना किसी प्रभाव के, मैंने -4बिना किसी सफलता के साथ IPv4 कनेक्शन के लिए मजबूर करने की कोशिश की है । कोई अंदाजा क्या गलत हो सकता है?

यहाँ उस प्रक्रिया की धारा है:

strace: Process 7610 attached
select(8, [3 5], [], NULL, NULL)        = 1 (in [3])
clock_gettime(CLOCK_BOOTTIME, {42870, 893598449}) = 0
read(3, "\372oyu\331J\20\327\264\325\357\274\vn\233\nG\207\207c\251\230\341NzUk\261\351v\23\353"..., 8192) = 44
clock_gettime(CLOCK_BOOTTIME, {42870, 894108136}) = 0
clock_gettime(CLOCK_BOOTTIME, {42870, 894258960}) = 0
select(8, [3 5], [6], NULL, NULL)       = 1 (out [6])
clock_gettime(CLOCK_BOOTTIME, {42870, 894325845}) = 0
write(6, "\3\0\0\7\0\0\0", 7)           = 7
clock_gettime(CLOCK_BOOTTIME, {42870, 894439661}) = 0
clock_gettime(CLOCK_BOOTTIME, {42870, 894473071}) = 0
select(8, [3 5], [], NULL, NULL)        = 1 (in [5])
clock_gettime(CLOCK_BOOTTIME, {42870, 894558087}) = 0
read(5, "\2\0\0\7\0\0\1\0\0\7\0", 16384) = 11
clock_gettime(CLOCK_BOOTTIME, {42870, 894661575}) = 0
clock_gettime(CLOCK_BOOTTIME, {42870, 894699595}) = 0
select(8, [3 5], [3], NULL, NULL)       = 1 (out [3])
clock_gettime(CLOCK_BOOTTIME, {42870, 894780961}) = 0
write(3, "\f\16\6UF|B\1\315\nYP\355\f|\177|\234v\371\322\236*)\32`\3214\225$u\337"..., 52) = 52
clock_gettime(CLOCK_BOOTTIME, {42870, 894852781}) = 0
clock_gettime(CLOCK_BOOTTIME, {42870, 894874370}) = 0
select(8, [3 5], [], NULL, NULL)        = 1 (in [3])
clock_gettime(CLOCK_BOOTTIME, {42870, 923152465}) = 0
read(3, "\310\3258\332\212)\re\262\322^\f\275\324X{\361\23f\211mk'\213\224\v\0\204\322\n\25\221"..., 8192) = 44
clock_gettime(CLOCK_BOOTTIME, {42870, 923618233}) = 0
clock_gettime(CLOCK_BOOTTIME, {42870, 923845130}) = 0
select(8, [3 5], [6], NULL, NULL)       = 1 (out [6])
clock_gettime(CLOCK_BOOTTIME, {42870, 923946992}) = 0
write(6, "\1\0\0\7\0", 5)               = 5
clock_gettime(CLOCK_BOOTTIME, {42870, 924002335}) = 0
clock_gettime(CLOCK_BOOTTIME, {42870, 924027449}) = 0
select(8, [3 5], [], NULL, NULL)        = 1 (in [3])
clock_gettime(CLOCK_BOOTTIME, {42870, 943180384}) = 0
read(3, "\326U\32\20\246\374\201K\246\177!z\265\302^\252\371\255\215\355\265\356\313\322W\2341`%\215\20P"..., 8192) = 176
close(6)                                = 0
close(5)                                = 0
clock_gettime(CLOCK_BOOTTIME, {42870, 943307191}) = 0
clock_gettime(CLOCK_BOOTTIME, {42870, 943334146}) = 0
close(7)                                = 0
select(8, [3], [3], NULL, NULL)         = 1 (out [3])
clock_gettime(CLOCK_BOOTTIME, {42870, 943414987}) = 0
write(3, "0\236\27\233p\303\324\302\222mD\242Y_\34S\365\366p\214z\320\367.sN\252\337\322S\202("..., 36) = 36
rt_sigaction(SIGWINCH, NULL, {0x5639600b7460, [], SA_RESTORER, 0x7f7046de37f0}, 8) = 0
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7f7046de37f0}, NULL, 8) = 0
write(3, "F\226\207\7\243\207\33\316\37\1U$\326Y\314\253\310p\210\354\240\247\322n\32\272A\312\312:\252\324"..., 60) = 60
ioctl(0, TCGETS, 0x7ffc20de6720)        = -1 ENOTTY (Inappropriate ioctl for device)
fcntl(0, F_GETFL)                       = 0x802 (flags O_RDWR|O_NONBLOCK)
fcntl(0, F_SETFL, O_RDWR)               = 0
ioctl(1, TCGETS, 0x7ffc20de6720)        = -1 ENOTTY (Inappropriate ioctl for device)
fcntl(1, F_GETFL)                       = 0x802 (flags O_RDWR|O_NONBLOCK)
fcntl(1, F_SETFL, O_RDWR)               = 0
ioctl(2, TCGETS, {B38400 opost isig icanon echo ...}) = 0
shutdown(3, SHUT_RDWR)                  = 0
close(3)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

दूसरी चीज़ जो मैंने देखी है, वह अपेक्षाकृत अधिक संख्या में रेट्रांसमिट्स (सिस्टम को बूट करने के कुछ ही मिनटों बाद) - उसी नेटवर्क के अन्य डिवाइस ठीक काम करते हैं। एक खराबी नेटवर्क कार्ड?

$ netstat -s | egrep -i 'loss|retran'
    421 segments retransmitted
    TCPLostRetransmit: 6
    1 timeouts in loss state
    47 fast retransmits
    137 retransmits in slow start
    TCPLossProbes: 7
    TCPRetransFail: 3
    TCPSynRetrans: 12

संपादित करें :

मैंने पहले ही बिना किसी सफलता के प्रयास किया है:

  • नेटवर्क केबल को बदलना (सीधे राउटर पर जाता है)
  • एनआईसी कार्ड की जगह (बोर्ड पर ब्रॉडकॉम द्वारा Realtek गीगाबिट कार्ड)

ज्यादातर मामलों में जब मुझे यह समस्या होती है - फ़ायरवॉल / iptables कॉन्फ़िगरेशन इसका कारण है। आप दोनों सिरों पर एक क्षण के फ़ायरवॉल को अक्षम करके इसकी जाँच कर सकते हैं।
रास

@ मुझे नहीं लगता कि जब एक ही कमांड दो बार एक ही आउटपुट में चल रहा हो तो कनेक्शन फ़ायरवॉल द्वारा ब्लॉक किया जा सकता है। पहले रन को छोड़कर 6 मिनट और दूसरे को 3 सेकंड लगते हैं।
टॉम्बार्ट

पृष्ठभूमि में कुछ और हो रहा है जब ssh कनेक्शन स्थापित कर रहा है और इसमें कभी-कभी (विशेषकर शुरुआत में) कुछ मिनट लगते हैं। तो कुछ समय के लिए यह ठीक काम करता है। यह रहस्यमय दिखता है, लेकिन जैसा कि मैंने कहा, जब मुझे पहली बार यह समस्या आती है तो मैं फ़ायरवॉल कॉन्फिगर करता हूँ (न केवल ssh, बल्कि dns आदि नियम भी)। एक पल के लिए दोनों सिरों पर फायरवॉल को निष्क्रिय करना सबसे सरल परीक्षण है।
RSM

@rsm मैंने फ़ायरवॉल को निष्क्रिय करने की कोशिश की है यह कुछ भी नहीं बदलता है
टॉमबार्ट

कैसे SSH सर्वर स्तर पर और क्लाइंट स्तर के बारे में नहीं? आप इस स्तर पर क्या नियंत्रण और रखरखाव करते हैं? क्या आप SSH रिमोट सर्वर लॉग देख सकते हैं? क्या आप नेटवर्क पर एफडब्ल्यू के नियमों या अन्य लागू एसीएल नियमों, फिल्टर, या प्रॉक्सी को निष्क्रिय कर सकते हैं? मैं एक लिनक्स नोब हूं इसलिए शायद मैं ऊपर कुछ देख रहा हूं जो आपके उल्लेख पर है कि दूरस्थ सर्वर स्तर की वस्तुओं पर चला जाता है।
दलाल जूस आईटी

जवाबों:


1

आप ssh -vvvसर्वर पर एक सरल प्रयास करके अधिक डिबग जानकारी प्राप्त कर सकते हैं और क्लाइंट प्रक्रिया से आने वाले संदेशों को देख सकते हैं।

इसके अलावा ssh पोर्ट (डिफ़ॉल्ट रूप से 22) को टेलनेट करने की कोशिश करें और देखें कि यह कितनी तेजी से प्रतिक्रिया देगा।

जैसा कि दूसरों ने सुझाव दिया है कि यह एक फ़ायरवॉल समस्या हो सकती है (आने वाले कनेक्शन के लिए सीमा की तरह लगता है) हालांकि, चूंकि आपने इसे अक्षम कर दिया है और इसने बहुत मदद नहीं की, इस बार ऐसा नहीं हो सकता है।

एक अन्य विकल्प उपयोगकर्ता / समूह की जानकारी है जो काफी समय तक कनेक्शन रखती है, उदाहरण के लिए रिमोट एलडीएपी सर्वर का उपयोग करने वाली मशीन से जुड़ने पर और यह व्यस्त है या एलडीएपी तक पहुंचने में परेशानी हो रही है (जिसे आपके यूआईडी / जीआईडी ​​को हल करने की आवश्यकता है) कनेक्शन में देरी भी करेगा। (यदि संभव हो तो ssh कुंजी के साथ रूट खाते में लॉगिंग की कोशिश करें क्योंकि इसे बाहरी सर्वर का उपयोग नहीं करना चाहिए)

अभी तक जाँच करने के लिए एक और चीज़ है दूरस्थ अंत पर DNS सर्वर, ssh सर्वर DNS होस्ट में आपके आईपी पते को हल करने की कोशिश कर सकता है और अगर यह DNS सर्वर अविश्वसनीय है तो इसे करने में कुछ समय भी लग सकता है।

पहले एक के बाद के कनेक्शन के लिए और बहुत तेज़ होने के कारण यह समस्या किसी तरह के कैशिंग मैकेनिज़्म (DNS, LDAP, netfilter RELATED, ESTABLISHED राज्य) में होने का संकेत दे सकती है, या बस यह कि आपके ssh क्लाइंट ने मानसून का उपयोग किया है (और यह उन्हें बनाए रखता है) प्रारंभिक कनेक्शन के बाद खुला)


मैंने पहले ही कोशिश की है ssh -vvv, rsyncबिना किसी परिणाम के लिए भी। यह रैंडम फाइल पर अटक जाता है। यह डीएनएस मुद्दा नहीं हो सकता है (मैंने जोड़ा है resolv.conf) कोई रास्ता नहीं है DNS लुकअप के साथ 2 मिनट के समय और 2 रिट्रीस के साथ 6 मिनट लगेंगे। मैं किसी भी तरफ एलडीएपी का उपयोग नहीं कर रहा हूं। sshप्रमाणीकरण आरएसए कुंजी का उपयोग करके किया जाता है।
टॉम्बर्ट

0

कुछ असफल प्रयासों के बाद, मैंने निम्नलिखित मानों के/etc/sysctl.conf साथ नेटवर्क से संबंधित पैरामीटर को ट्यून किया है :

net.core.netdev_max_backlog = 5000
# allow testing with buffers up to 64MB
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
# increase Linux autotuning TCP buffer limit to 32MB
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
# recommended default congestion control is htcp
net.ipv4.tcp_congestion_control=htcp
# recommended for hosts with jumbo frames enabled
net.ipv4.tcp_mtu_probing=1
net.core.default_qdisc = fq

सिर्फ टीसीपी बफ़र्स बढ़ाने से मदद नहीं मिली। अब नेटवर्क उम्मीद के मुताबिक व्यवहार कर रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.