Tcp-keepalive ssh ile nasıl çalışır?


84

"Heartbeats" yapmak için ssh bağlantısı kullanan bir kabuk betiğini kodlamaya çalışıyorum. Belli bir zaman aşımından sonra (bağlantı kesildikten sonra) bu bağlantının istemci ve sunucu tarafını sonlandırmak istiyorum.

Şimdiye kadar ne buldum:

  • TCPKeepAlive ssh ve sshd için evet / hayır
  • ClientAliveCountMax için sshd
  • ClientAliveInterval için sshd
  • Ssh için ServerAliveCountMax
  • Ssh için ServerAliveInterval

"ClientAliveCountMax" ı değiştirmek için her hedef makinedeki sshd_config dosyasını değiştirmem gerekecek (bu seçenek varsayılan olarak devre dışı bırakılmış).

Öyleyse sorum şu - "TCPKeepAlive" yi kendi amaçlarım için de kullanabilir miyim (kaynak / hedef makinelerde başka hiçbir şey değiştirmeden)?

Hedef işletim sistemi SLES11 SP2'dir - ancak bunun burada önemli olduğunu sanmıyorum.


Bu parametrelerin tümü, bağlantı boyunca bir güvenlik duvarı veya aracı cihazın bağlantıyı sonlandıracağı durumlar içindir. Bu parametreler, bağlantıyı canlı tutmak için periyodik veri göndermek ve ayrıca X bekleyen yanıt olduğunda bağlantıyı kapatmak içindir. Ne yaptığınız hakkında biraz daha ayrıntılı bilgi verebilir misiniz? Kullandığınız ControlMasterseçeneği ve köle bağlantılarını kullanarak?
Patrick

Sadece başka bir düğümün birkaç fiziksel hatla birkaç ssh-network bağlantısı kullanarak "aşağı" olup olmadığını belirlemek için bir araç oluşturmak istiyorum. Bunu sadece bir ssh-oturumu açarak yapıyorum (bu aşağı yukarı sonsuz bir döngü yapar). Bağlantılar koparsa o oturumun sonlandırılmasını istiyorum. TCPKeepalive için aralık / sayının ne olduğunu merak ediyorum.
Nils

Yanıtlar:


103

Muhtemelen bunun için ServerAlive ayarlarını kullanmak istersiniz. Sunucuda herhangi bir yapılandırma gerektirmezler ve isterseniz komut satırında ayarlanabilirler.

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

Bu, her 5 saniyede bir ssh keepalive mesajı gönderir ve başka bir keepalive gönderme zamanı gelirse, ancak sonuncusuna yanıt alınmadıysa, bağlantı sonlandırılır.

Kritik ServerAliveIntervalve arasındaki fark TCPKeepAlive, çalıştıkları katman.

  • TCPKeepAliveTCP katmanında çalışır. Boş bir TCP ACK paketi gönderir. Güvenlik duvarları bu paketleri yoksaymak üzere yapılandırılabilir, bu nedenle boşta kalan bağlantıları kesen bir güvenlik duvarından geçerseniz, bunlar bağlantıyı canlı tutmayabilir.
  • ServerAliveIntervalssh katmanında çalışır. Aslında ssh aracılığıyla veri gönderir, bu yüzden TCP paketi şifrelenmiş veridir ve bir güvenlik duvarı bir saklayıcı mı yoksa meşru bir paket mi olduğunu söyleyemez, bu yüzden bunlar daha iyi çalışır.

1
Bence bu doğru yön. İlk testler bunun işe yarayacağını göstermiştir - bağlantı düştükten en geç 5 saniye sonra ssh / sshd alt işlemlerini gönderip almayı sonlandıracaktır. Ben TCPKeepalive sadece TCP-stack-defaults kullanıyor - bu yüzden de yapılandırmak daha zordur.
Nils

Bu aynı zamanda hayalet kullanıcı problemini de çözer. Bunun PuTTY ayarlarında da yapılabileceğine inanıyorum , Seconds between keepalivesAyarlar | Bağ.
Bob Stein,

7

Bu TCPKeepAliveseçenek aslında bağlantıları ClientAlive benzeri veya ServerAlive benzeri seçeneklerden canlı tutmak için çok farklı bir yöntemdir.

Başına Are BSD SSH manuel sayfasında , bunu okuyabilir:

Canlı müşteri mesajları şifreli kanaldan gönderilir ve bu nedenle taklit edilemez. Etkin olan TCP keepalive seçeneği TCPKeepAlivesahtedir. İstemci canlı mekanizması, istemci veya sunucu bir bağlantının ne zaman etkin olamayacağını bilmeye bağlı olduğunda değerlidir.

TCPKeepAliveSistem diğer tarafa TCP canlı tutma mesajları göndermek gerekip gerekmediğini emin olun. Varsayılan seçenek her zaman etkindir.

Kullanıyorsanız ClientAliveIntervaldevre dışı bırakabilirsiniz TCPKeepAlive. Bu seçenek, istemciden bir yanıt istemek için şifreli kanal üzerinden bir mesaj gönderir (varsayılan 0'dır, bu nedenle istemciye hiçbir mesaj gönderilmez) ve ClientAliveCountMaxsshd istemcinin bağlantısını kesmeden önce, canlı yaşayan mesajların sayısını ayarlar. oturum, toplantı, celse.

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.