Wie funktioniert tcp-keepalive in ssh?

84

Ich versuche, ein Shell-Skript zu programmieren, das eine ssh-Verbindung verwendet, um "Heartbeats" auszuführen. Ich möchte die Client- und Serverseite dieser Verbindung nach einem bestimmten Timeout (nachdem die Verbindung getrennt wurde) beenden.

Was ich bisher gefunden habe:

  • TCPKEEPALIVE ja / nein für ssh und sshd
  • ClientAliveCountMax für sshd
  • ClientAliveInterval für sshd
  • ServerAliveCountMax für ssh
  • ServerAliveInterval für ssh

Um "ClientAliveCountMax" zu ändern, müsste ich die sshd_config auf jedem Zielcomputer ändern (diese Option ist standardmäßig deaktiviert).

Meine Frage ist also: Kann ich "TCPKeepAlive" auch für meine Zwecke verwenden (ohne etwas anderes auf den Quell- / Zielcomputern zu ändern)?

Zielbetriebssystem ist SLES11 SP2 - aber ich halte das hier nicht für relevant.

Nils
quelle
Diese Parameter sind alle für Situationen gedacht, in denen eine Firewall oder ein zwischengeschaltetes Gerät entlang der Verbindung die Verbindung beendet. Diese Parameter dienen zum Senden periodischer Daten, um die Verbindung am Leben zu erhalten, und zum Beenden der Verbindung, wenn X Antworten ausstehen. Können Sie uns etwas näher erläutern, was Sie tun? Verwenden Sie die ControlMasterOption und verwenden Sie Slave-Verbindungen?
Patrick
Ich möchte nur ein Mittel aufbauen, um festzustellen, ob ein anderer Knoten über mehrere SSH-Netzwerkverbindungen mit mehreren physischen Leitungen "ausgefallen" ist. Ich mache das, indem ich einfach eine ssh-Sitzung öffne (die mehr oder weniger eine Endlosschleife macht). Ich möchte, dass diese Sitzung beendet wird, wenn die Verbindungen unterbrochen werden. Ich frage mich, was das Intervall / die Zählung für TCPKeepalive ist.
Nils

Antworten:

103

Wahrscheinlich möchten Sie hierfür die ServerAlive-Einstellungen verwenden. Sie erfordern keine Konfiguration auf dem Server und können auf Wunsch in der Befehlszeile festgelegt werden.

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

Dadurch wird alle 5 Sekunden eine ssh-Keepalive-Nachricht gesendet. Wenn eine weitere Keepalive-Nachricht gesendet werden muss, aber keine Antwort auf die letzte eingegangen ist, wird die Verbindung beendet.

Der kritische Unterschied zwischen ServerAliveIntervalund TCPKeepAliveist die Schicht, auf der sie arbeiten.

  • TCPKeepAlivearbeitet auf der TCP-Ebene. Es sendet ein leeres TCP-ACK-Paket. Firewalls können so konfiguriert werden, dass diese Pakete ignoriert werden. Wenn Sie also eine Firewall durchlaufen, die inaktive Verbindungen unterbricht, wird die Verbindung möglicherweise nicht aufrecht erhalten.
  • ServerAliveIntervalarbeitet auf der SSH-Ebene. Es sendet tatsächlich Daten über ssh, sodass das TCP-Paket verschlüsselte Daten enthält und eine Firewall nicht erkennen kann, ob es sich um ein Keepalive- oder ein legitimes Paket handelt, sodass diese besser funktionieren.
Patrick
quelle
1
Ich denke, das ist die richtige Richtung. Erste Tests haben gezeigt, dass dies funktionieren wird - es wird das Senden und Empfangen von ssh / sshd-Unterprozessen spätestens 5 Sekunden nach dem Trennen der Verbindung beenden. Ich denke, dass TCPKeepalive einfach die TCP-Stack-Standardeinstellungen verwendet - daher ist es auch schwieriger zu konfigurieren.
Nils
Dies löst auch das Ghost-User-Problem. Ich glaube, dass dies auch in PuTTY-Einstellungen möglich ist Seconds between keepalives, indem Sie unter Einstellungen | auf 1800 wechseln Verbindung.
Bob Stein
7

Die TCPKeepAliveOption ist eine ganz andere Methode, um Verbindungen am Leben zu erhalten, als die ClientAlive- oder ServerAlive-ähnlichen Optionen.

Sind pro BSD SSH Handbuchseite , können wir lesen, dass:

Die Client-Alive-Nachrichten werden über den verschlüsselten Kanal gesendet und sind daher nicht fälschbar. Die von TCPKeepAliveaktivierte TCP-Keepalive-Option ist fälschbar. Der Client-Alive-Mechanismus ist nützlich, wenn der Client oder Server wissen muss, wann eine Verbindung inaktiv geworden ist.

Das TCPKeepAlivestellen Sie sicher , ob das System TCP Keep - Alive - Nachrichten an der anderen Seite senden. Die Standardoption ist immer aktiviert.

Wenn Sie verwenden ClientAliveInterval, können Sie deaktivieren TCPKeepAlive. Diese Option sendet eine Nachricht über den verschlüsselten Kanal, um eine Antwort vom Client anzufordern (die Standardeinstellung ist 0, sodass keine Nachrichten an den Client gesendet werden). Sie ClientAliveCountMaxlegt die Anzahl der aktiven Client-Nachrichten fest, bevor sshd den Client durch Beenden von trennt Session.

Kenorb
quelle