İlk ssh bağlantısı birkaç dakika sürer


1

Ubuntu 17.04'te çalışıyorum openssh-client==7.4p1-10, çekirdek 4.10.0-33-generic.

Gibi ssh komutları yürütme ile ilgili sorunlar yaşıyorum:

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

rsync4kB olan komut dosyasını senkronize etmek 6 dakika sürer . Sorun sadece ssh ile değil, bazen rsyncde git pushemiliyor.

İşin komik yanı, işlemi durdurduktan ve tekrar uyguladıktan hemen sonra çalıştığıdır:

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

DNS sorunu gibi görünmüyor, işte /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'yi zaten devre dışı bıraktım:

/etc/ssh/ssh_config:

   GSSAPIAuthentication no
   GSSAPIDelegateCredentials no

hiçbir etki olmadan, IPv4 bağlantısını -4da başarı ile zorlamaya çalıştım . Sorunun ne olduğu hakkında bir fikrin var mı?

İşte bu sürecin sağlamlığı:

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 +++

Fark ettim diğer şey nispeten yüksek sayıda yeniden iletimi (sistemi başlattıktan sadece birkaç dakika sonra) - aynı ağdaki diğer cihazlar iyi çalışıyor. Arızalı bir ağ kartı?

$ 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

EDIT :

Ben zaten hiç başarı olmadan denedim:

  • ağ kablosunu değiştirme (doğrudan yönlendiriciye gider)
  • NIC kartının değiştirilmesi (teknede Broadcom, Realtek gigabit kartı ile)

çoğu zaman bu problemim olduğunda - firewall / iptables konfigürasyonunun nedeni budur. Bunu her iki uçta bir an güvenlik duvarını devre dışı bırakarak kontrol edebilirsiniz.
rsm

@ rsm Aynı komutu iki kez çalıştırdığınızda aynı çıktının bağlantının güvenlik duvarı tarafından engellenebileceğini sanmıyorum. İlk çalıştırma 6 dakika, diğeri 3 saniye sürüyor.
Tombart

ssh bağlantı kurarken arka planda daha çok şey oluyor ve bazen (özellikle başında) birkaç dakika sürüyor. o zaman bir süre için tamam çalışıyor. gizemli görünüyor, ama dediğim gibi, bu sorun ilk olduğunda kontrol ettiğimde firewall config (sadece ssh değil, dns etc kuralları da var). Her iki uçtaki güvenlik duvarlarını bir an için devre dışı bırakmak en basit testtir.
rsm

@rsm Güvenlik duvarını devre dışı bırakmayı hiçbir şey değiştirmeyeceğini denedim
Tombart

İstemci düzeyinde değil, SSH sunucu düzeyinde? Bu seviyede neyi kontrol ediyor ve sürdürüyorsunuz? SSH uzak sunucu kayıtlarını görebiliyor musunuz? Sunucudaki FW kurallarını veya ağdaki diğer geçerli ACL kurallarını, filtreleri veya proxy'leri devre dışı bırakabilir misiniz? Ben bir Linux noob'um, belki de uzaktaki sunucu seviyesindeki öğelerin üzerinden geçen, yukarıda bahsettiğim bir şeyi göz ardı ediyorum.
Pezevenk Suyu BT

Yanıtlar:


1

ssh -vvvSunucuya basit bir deneyerek daha fazla hata ayıklama bilgisi edinebilir ve istemci işleminden gelen mesajları görebilirsiniz.

Ayrıca ssh portuna telnet yapmaya çalışın (varsayılan olarak 22) ve ne kadar hızlı yanıt vereceğini görün.

Diğerlerinin de belirttiği gibi, güvenlik duvarı sorunu olabilir (gelen bağlantılar için sınırlar gibi görünüyor), ancak bunu devre dışı bıraktığınızdan ve bu sefer böyle olamayacağına çok yardımcı olmadığından.

Başka bir seçenek, bağlantıyı uzun süre tutar tutan kullanıcı / grup bilgileridir, örneğin uzak LDAP sunucusu kullanan bir makine ile bağlanırken ve meşgul veya LDAP'ye ulaşmada sorun yaşıyorsa (bunun için kimliğinizi / gidonuzu çözmeniz gerekir) bağlantıyı da geciktirir. (mümkünse, harici sunucuları kullanmaması gerektiği için ssh anahtarıyla kök hesaba giriş yapmayı deneyin)

Kontrol edilmesi gereken başka bir şey de uzak uçtaki DNS sunucusu, ssh sunucusu IP adresinizi DNS ana bilgisayarına çözmeyi deneyebilir ve eğer DNS sunucusu güvenilir değilse, bunu yapmak biraz zaman alabilir.

İlki takip eden ve çok daha hızlı olan bağlantılara gelince, bir tür önbellekleme mekanizmasında (DNS, LDAP, İLGİLİ net filtre, KURULAN durumda) veya yalnızca ssh istemcinizin kontrol yuvalarını kullanması sorununu gösterebilir (ve bunları tutar. ilk bağlantıdan sonra aç)


Ben zaten denedim ssh -vvv, rsyncsonuç vermeden de aynı şekilde . Rastgele dosyada sıkışıp kalıyor. DNS sorunu olamaz (ekledim resolv.conf), DNS aramasının 2s zaman aşımı ile 6 dakika ve sadece 1 sorgulama yapması için 2 deneme yapması mümkün değil. Hiçbir tarafta LDAP kullanmıyorum. sshKimlik doğrulama, RSA anahtarı kullanılarak yapılır.
Tombart

0

Birkaç başarısız denemeden sonra ben ağ ilgili parametreleri ayarlanmış ettik /etc/sysctl.confile değerleri aşağıdaki :

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

Sadece TCP tamponlarını arttırmak işe yaramadı. Şimdi ağ beklendiği gibi davranıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.