Warum variiert mein SSH-Timeout mit dem Netzwerkstandort?

15

Wenn ich von zu Hause aus auf einen unserer Office-Server (auf denen Fedora 10 ausgeführt wird) ssh'ed, läuft meine Sitzung nach einer relativ kurzen Aktivitätsdauer (ca. 5 Minuten) ab. Ich habe versucht, TcpKeepAliveauf der Client-Seite zu verwenden, ohne Wirkung.

Das, was ich nicht verstehe, ist, dass ich, wenn ich im LAN des Unternehmens im Büro bin, eine Sitzung den ganzen Tag inaktiv lassen kann, ohne dass das Zeitlimit überschritten wird. Das Verhalten scheint also von meinem Standort abhängig zu sein.

Irgendwelche Ideen, warum dies geschieht und wie Sie Zeitüberschreitungen verhindern, wenn ich nicht im LAN bin? Ich verwende den Terminal-Client unter Mac OS X, wenn das hilft.

UPDATE - Dave Dragers Vorschlag, den ServerAliveIntervalSatz auf einen Wert ungleich Null zu setzen, TcpKeepAlive=nohat für mich funktioniert. Bei einigen anderen Antworten werden die ClientAliveEinstellungen ... vom Mac OSX SSH-Client nicht akzeptiert.

gareth_bowles
quelle

Antworten:

6

Zu diesem Problem gibt es hier eine gute Beschreibung .

Sie empfehlen:

ssh -o TCPKeepAlive=yes

oder:

ssh -o TCPKeepAlive=no -o ServerAliveInterval=15

Ich habe jedoch ein Problem an meiner Arbeitsstelle, bei dem ich von Sitzungen getrennt werde, bei denen sie zu Hause in Ordnung sind. Ich glaube, meine Firewall (SonicWall) hat möglicherweise Probleme mit TCPKeepAlive, möglicherweise aufgrund von NAT.

Mein SSH-Client, SecureCRT, hat glücklicherweise eine Option für ein "NO-OP" -Protokoll, das meines Erachtens im Grunde genommen einen Befehl sendet, der nichts mit dem Server zu tun hat. Durch manuelles Aktivieren kann ich verbunden bleiben. Ich bin mir nicht sicher, ob der MacOSX-Terminal-Client so ähnlich ist. Es wird beschrieben, wie "NO-OP" in der Befehlszeile implementiert werden kann.

Schließlich möchten Sie möglicherweise Wireshark oder einen anderen Sniffer verwenden, um Ihre tatsächliche TCP-Verbindung zu überwachen und herauszufinden, was damit los ist. Das wäre der letzte Weg, um zu sehen, warum die Verbindung gelegentlich immer noch getrennt wird.

Dave Drager
quelle
Danke, Dave - die ServerAliveInterval-Option hat großartig funktioniert.
gareth_bowles
@ Dave Ich hatte gehört, dass einige Serveradministratoren diese Vorgehensweise missbilligen, da dies entweder ein (a) Sicherheitsrisiko oder eine (b) ungerechtfertigte Serverlast sein kann. Ist eine dieser Bedenken berechtigt, IYHO?
Jonathan Day
Dies ist eine Einstellung auf dem Client-Endpunkt. Wenn Sie sich also in einer feindlichen Umgebung befinden, kann dies möglicherweise dazu führen, dass jemand Sie fälscht. Es ist jedoch sehr unwahrscheinlich, dass sich dies auf die Sicherheit der Verbindung auswirkt. Ich kann nicht wirklich sehen, dass dies zusätzliche Last verursacht.
Dave Drager
@ Dave: Ich habe diesen Befehl eingegeben, erhalte aber den folgenden Befehl: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b Bindeadresse] [-c Verschlüsselungsspezifikation] [-D [Bindeadresse:] Port] [-e Escape-Zeichen] [-F Konfigurationsdatei] [- I pkcs11] [-i identitätsdatei] [-L [bindeadresse:] port: host: hostport] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-R [ bind_address:] port: host: hostport] [-S ctl_path] [-W host: port] [-w local_tun [: remote_tun]] [user @] hostname [befehl]
user1050619
Dieser Fix funktionierte auch für PuTTY. Die einzige Option, die ich einstellen musste, war in Verbindung -> Sekunden zwischen Keepalive: 15. Die SSH-Sitzung war länger als 8 Stunden aktiv (Comcast), während die Verbindung normalerweise in <30 Minuten getrennt wurde.
Dan Dascalescu
2

Dies liegt wahrscheinlich daran, dass Sie beim Herstellen einer Verbindung von zu Hause aus eine Firewall passieren, durch die die TCP-Sitzung nach kurzer Zeit geschlossen wird. TcpKeepAlive sollte dies jedoch vermeiden. Haben Sie TcpKeepAlive auf Client- oder Serverseite aktiviert?

Radius
quelle
Ich habe das TcpKeepAlive auf der Client-Seite ausgeführt (in meiner ~ / .ssh / config) - Ich dachte, dies würde lokale Firewall-Probleme beheben, aber es tritt immer noch eine Zeitüberschreitung auf.
gareth_bowles
Standardmäßig ist es auf der Serverseite "Ein", aber überprüfen Sie die sshd_config, um festzustellen, ob es nicht deaktiviert wurde.
Radius
Einige Firewalls trennen eine TCP-Verbindung nach einer bestimmten Zeit, AUCH wenn sie nicht inaktiv sind.
TomOnTime
Einige Firewalls trennen eine TCP-Verbindung nach einer bestimmten Zeit, AUCH wenn sie nicht inaktiv sind. Um dies zu erkennen, müssen Sie feststellen, ob die Verbindung ständig unterbrochen wird.
TomOnTime
Hier sind die Einstellungen, die ich verwendet habe, um zu beheben: TCPKeepAlive nein, ClientAliveInterval 300, ClientAliveCountMax 3
Matt Simmons
2

Ich bekomme das die ganze Zeit über auf meiner Comcast-Verbindung. Das Problem ist, dass das Keep-Alive-Intervall Ihres SSH-Clients für das in Ihrem Netzwerkpfad konfigurierte Timeout zu lang ist. Wenn Sie auf Linux sind, können Sie die ändern ServerAliveIntervalund ServerAliveCounterWerte niedriger zu sein als die Standardwerte. Dieser Wert wird in Sekunden eingestellt. Die systemweite Konfigurationsdatei befindet sich (allgemein) in /etc/ssh/ssh_config. Wenn Sie diese beiden UND-Verknüpfungen TcpKeepAlivefestlegen, bleibt Ihre Verbindung bestehen.

sysadmin1138
quelle
1

Wie der Radius sagt, "vergessen" einige Firewalls mit vollem Status eine Verbindung nach einer bestimmten (normalerweise konfigurierbaren) Zeit und lassen keine weitere Kommunikation für die Verbindung zu. Sie erwarten, dass die Verbindung mit einem TCP-SYN beginnt (ich beziehe mich hier auf Ihre SSH-Kommunikation).

Es gibt noch eine andere Möglichkeit. Der Netzwerkpfad zwischen Ihrem Zuhause und Ihrem Büro kann Verluste aufweisen (von der Art eines Pakets). Wenn Sie versuchen, auf dem SSH-Client zu tippen, gibt der Client möglicherweise auf und schlägt fehl, wenn Ihr Link für eine Weile blockiert ist.

Die Keepalive-Konfiguration auf dem Client behandelt hier den ersten Fall, kann jedoch im zweiten Fall nicht helfen. Die Firewall befindet sich normalerweise in Ihrem Büro und kann daher konfiguriert werden. Das würde auch im ersten Punkt helfen.

Um zu überprüfen, ob zeitweise Verbindungsverluste auftreten, können Sie im Hintergrund einen Ping-Befehl von Ihrem Client-Computer aus aktivieren.

nik
quelle
0

Sie können auch die von anderen vorgeschlagenen Einstellungen als Standardeinstellungen in Ihre ~/.ssh/configDatei einfügen , damit Sie sie nicht bei sshjedem Verbindungsaufbau erneut übergeben müssen:

nano ~/.ssh/config und füge hinzu:

TCPKeepAlive=no
ServerAliveInterval=15
Dan Dascalescu
quelle