Wie kann ich verhindern, dass meine SSH-Sitzungen einfrieren?

66

Ich habe ServerAliveIntervalund bei wenigen Rechnern auch ClientAliveIntervalin SSH-Client / Server-Konfigurationsdateien auf 540 gesetzt (ich nehme an, es wäre keine gute Idee, mehr zu setzen). Ich arbeite mit vielen SSH-Sitzungen, die derzeit nach wenigen Minuten einfrieren.

Wie kann ich es reparieren? Ich möchte, dass eine Sitzung überhaupt nicht einfriert. Wenn ich also eine Sitzung um 8 Uhr eröffne und sie beispielsweise 4 Stunden lang nicht benutze, um sie um 12 Uhr immer noch zu verwenden, ohne dass ich mich erneut anmelden muss .

syntagma
quelle
Wie lange können Sie derzeit angemeldet bleiben (vorausgesetzt, dies liegt nicht an einer Trennung des Netzwerks)? TCPKeepAlive yes?
Iyrin
Ich bin nicht sicher, aber 10 min. maximal. Wie für TCPKeepAlive yes- hängt von der Maschine ab.
syntagma
11
Verwenden Sie einfach mosh ?
Vi.
1
Oder Sie könnten autossh...
ThoriumBR
Ich würde sagen, eine Verbindung für 4 Stunden offen zu lassen, ist ein Sicherheitsrisiko, und Sie sollten screenstattdessen verwenden. Aber ich stimme Ihrer Frage immer noch zu, weil ich nach ein oder zwei Minuten das gleiche Problem habe.
Dale Anderson

Antworten:

80

Die Änderungen, die Sie vorgenommen haben /etc/ssh/ssh_configund /etc/ssh/sshd_configdie korrekt sind, haben jedoch keine Auswirkungen.

Nehmen Sie die folgenden Konfigurationsänderungen auf dem Client vor, damit Ihre Konfiguration funktioniert:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval Der Client sendet alle 100 Sekunden ein Null-Paket an den Server, um die Verbindung aufrechtzuerhalten

NULL-Paket Wird vom Server an den Client gesendet. Das gleiche Paket wird vom Client an den Server gesendet. Ein TCP-NULL-Paket enthält kein Steuerungsflag wie SYN, ACK, FIN usw., da der Server keine Antwort vom Client benötigt. Das NULL-Paket wird hier beschrieben: https://tools.ietf.org/html/rfc6592

Konfigurieren Sie dann den sshd-Teil auf dem Server.

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval Der Server wartet 60 Sekunden, bevor er ein Nullpaket an den Client sendet, um die Verbindung aufrechtzuerhalten

TCPKeepAlive Stellt sicher, dass bestimmte Firewalls keine inaktiven Verbindungen trennen .

ClientAliveCountMax Server sendet lebendige Nachrichten an den Client, obwohl er keine Nachricht vom Client zurückerhalten hat.

Starten Sie zum Schluss den ssh server

service ssh restart oder service sshd restartabhängig davon, auf welchem ​​System Sie sich befinden.

Valentin Bajrami
quelle
Ich denke, ein High ServerAliveCountMaxist auch nötig, um so zuverlässig wie möglich zu sein. Und wenn beide ServerAliveIntervalund ClientAliveIntervalniedrig genug sind, glaube ich nicht, dass es irgendeinen Bedarf dafür geben wird TCPKeepAlive. Darüber hinaus können Middleboxen ihren Status verlieren, auch wenn alle zuvor genannten Einstellungen genau richtig konfiguriert wurden. Es kann hilfreich sein, MPTCP zu verwenden (wenn es sowohl vom Client als auch vom Server unterstützt wird).
Kasperd,
Am Anfang ist nicht klar, ob Sie die Konfiguration auf der Client-Seite oder auf der Server-Seite meinen (letztendlich schließe ich, auf der Client-Seite). Dann sagen Sie in der Beschreibung von ServerAliveInterval "Client sendet ... an den Server", aber im nächsten Absatz " NULL-Paket wird vom Server an den Client gesendet". Ich finde das etwas verwirrend.
Craig McQueen
1
Nach dem Hinzufügen zum Server erhalte ich: / etc / ssh / ssh_config: Zeile 57: Ungültige Konfigurationsoption: clientaliveinterval / etc / ssh / ssh_config: Zeile 59: Ungültige Konfigurationsoption: clientalivecountmax
Anders
2
@Anders Du bekommst den Fehler weil ClientAliveIntervalund ClientAliveCountMaxssh Serveroptionen sind, also dafür gedacht sshd_configund nichtssh_config
Valentin Bajrami
1
@ Chandresh müssen Sie nicht. Nach dem Ändern ssh_configder neuen Sitzungen wird diese Datei gelesen. Die /etc/environmentDatei ist eine andere Sache, deren Format VAR="value" ohne Leerzeichen somit VAR = "value"ungültig wäre. Die Beschaffung auf /etc/ssh/ssh_configdiese Weise lautet also: Port 22oder Host * sie wird als Befehle behandelt
Valentin Bajrami,
13

Persönlicher Vorschlag: screenauf dem Remote-Host verwenden; Ihre Verbindung bleibt so lange bestehen, wie sie in einem Terminal aktiv ist.

Folgendes füge ich normalerweise hinzu, /etc/screenrcum meine Bildschirmsitzungen schnell zu identifizieren:

hardstatus alwayslastline
hardstatus string "%{= kG}[ %{G}%H %{g}][ %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]"
defscrollback 8192

EDIT: Hinweise.

Die hardstatusZeichenfolge zeigt eine untere Statuszeile wie diese: Beispiel für eine Bildschirmsitzung mit drei offenen Registerkarten

Der Scrollback-Puffer wird statt der üblichen 1000-1500 (je nach Verteilung) auch auf 8192 Zeilen erweitert.


quelle
Danke, zwei Fragen: 1. Können Sie die Optionen in Ihrer screenrcDatei erklären ? Wie konfiguriere ich das System den Startbildschirm / tmux direkt nach der Anmeldung?
syntagma
8
Nur um zu verdeutlichen, screenhält Ihre SSH-Verbindung nicht am Leben. Es führt Prozesse in einem virtuellen Terminal aus, unabhängig von dem Benutzerterminal, mit dem Sie eine Verbindung herstellen, sshsodass der Prozess nicht von Ihrer Verbindung abhängt. Sie verlieren weiterhin Ihre sshVerbindung, bis sie behoben ist.
Iyrin
1
Mit " Verbindung am Leben erhalten " meine ich im Wesentlichen " Verhindert, dass die Verbindung inaktiv wird ", was dasselbe Ergebnis hat. Wenn es für 4 Stunden keine Eingabe ist, SSH wird im Leerlauf gehen und schließlich die Verbindung schließen, alle untergeordneten Prozesse auch weg.
2
So sehr ich es auch geliebt habe screen, ich rate neuen Benutzern, damit zu beginnen tmux.
Dotancohen
2

Mit OpenSSH:

Sie müssen aktivieren

TCPKeepAlive yes

Sowohl in Ihrem Client ssh_config (z. B. /etc/ssh/ssh_configoder in ~/.ssh/config) als auch auf Ihrem Ziel-SSH-Server, auf dem OpenSSH ausgeführt wird (z. B. / etc / ssh / sshd_config).

Jedes Mal, wenn Ihre Verbindung inaktiv ist, sendet OpenSSH ein Dummy-Paket an Ihren Zielhost ...

Martin Allert
quelle
Dies kann auch dazu führen, dass die Verbindung unter The default is ''yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. ...this means that connections will die if the route is down temporarily, and some people find it annoying. linux.die.net/man/5/sshd_config
iyrin
Ehrlich gesagt, sind aber "[…] network goes down […] client host crashes […] route is down […]"gravierende Fehler, die keine SSH-Konfiguration abfangen kann. Das Hauptproblem sind inaktive SSH-Sitzungen, keine Netzwerkfehler. Um es zusammenzufassen: - Aktivieren Sie TCPKeepAlive yessowohl den Server als auch den Client. - Set ClientAliveInterval auf dem Server - Set IdleTimeoutauf dem Server - Set ClientAliveCountMax Das sollte den Trick machen ...
Martin Allert
2

Wenn das Problem ein hibernated Laptop oder eine weniger als Präfekt Netzwerkverbindung ist, würde ich empfehlen , mit moshwelcher läuft über sshund ermöglicht die automatische Wiederverbindung.

Von der Website :

Mosh (mobile Schale)

Remote-Terminal-Anwendung, die Roaming ermöglicht, intermittierende Konnektivität unterstützt und intelligentes lokales Echo und Leitungsbearbeitung von Benutzertastenanschlägen bietet.

Mosh ist ein Ersatz für SSH. Es ist robuster und reaktionsschneller, insbesondere über Wi-Fi, Mobilfunk und Fernverbindungen.

Mosh ist freie Software für GNU / Linux, BSD, MacOS, Solaris, Android, Chrome und iOS.

In Kombination mit tmux(oder älteren screen) ermöglicht dies mir, eine Verbindung sshvon meinem Laptop zu einem Server herzustellen und tagelang in Verbindung zu bleiben, selbst wenn ich die WLAN-Verbindung ändere und mobile Datenausfälle überlebe.

Tom Hale
quelle
Hier ist ein Link zu mosh.org und zu mosh auf Github
joeytwiddle 26.10.17
1

Überprüfen Sie Ihre SSHD-Konfiguration auf dem Host-Computer /etc/sshd_configfür die IdleTimeoutEinstellung .

IdleTimeout time
Sets idle timeout limit to time in seconds (s or nothing afternumber), 
in minutes (m), in hours (h), in days (d), or in weeks (w).If the 
connection have been idle (all channels) for that long time thechild 
process is killed with SIGHUP, and connection is closed down.
Iyrin
quelle