SSH-Verbindungen mit der Fritz!Box dauerhaft aufrechterhalten

Seit einiger Zeit gehe ich über die Fritz!Box Fon 5050 von AVM ins Netz, ein insgesamt eigentlich sehr empfehlenswertes Gerät.

Relativ kurz, nachdem ich die Box eingesetzt habe, ist mir allerdings aufgefallen, dass SSH-Verbindungen zu Remoteserver nach einer Weile – ungefähr 10-20 Minuten – getrennt werden, sobald man auf der Shell inaktiv ist.

benjamin@om ~ $ ssh genetsis.de
Last login: Thu Oct 13 13:27:18 2005 from p57822107.dip0.t-ipconnect.de
benjamin@bilbo ~ $ Read from remote host genetsis.de: Connection reset by peer
Connection to genetsis.de closed.

Das ist aus drei Gründen lästig: Erstens muss man sich ständig neu am Fremdsystem anmelden – auch wenn das dank Key-Authentifizierung schnell und ohne Passworteingabe funktioniert. Zweitens laufen die zugehörigen Serverprozesse (ssh, bash, und was sonst noch dazugehört) recht lange weiter, und verbrauchen dabei Ressourcen, ohne dass sie weiter benutzt werden können. Und nicht zuletzt ist es sehr ärgerlich, wenn man gerade in einem Editor arbeitet und die Verbindung plötzlich weg ist. Wichtige Änderungen sind so schnell mal verloren, wenn man sie nicht rechtzeitig gespeichert hat.

Nach einiger Zeit hat mich das so sehr gestört, dass ich mich deswegen an den AVM-Support wandte. Sehr erfreut war ich über die schnelle Antwort, die ich hier mal im Wortlaut zitiere:

„Die Fritz!Box trennt inaktive Verbindungen nach ca. 15 Minuten. Bitte konfigurieren Ihren ssh-Client so, dass regelmäßig Keep-Alive Pakete gesendet werden. Dadurch wird verhindert, dass die Fritz!Box die Verbindung als inaktiv erkennt und die Verbindung nach einem Timeout trennt.“

Also habe ich mich erstmal in die ssh_config-Manpage vertieft, um festzustellen, dass die KeepAlive-Pakete bereits standardmäßig gesendet werden. Trotzdem wurde die Verbindung immer wieder nach einer Viertelstunde getrennt. Glücklicherweise haben mich Christian Kruse und Henryk Plötz darauf gebracht, dass das Sendeintervall für die Pakete wahrscheinlich heruntergeschraubt werden muss.

Und so funktioniert's:

Wie man der Kerneldokumentation in /usr/src/linux/Documentation/networking/ip-sysctl.txt entnehmen kann, steuert der Wert tcp_keepalive_time, in welchem Zeitabstand TCP-KeepAlive-Pakete gesendet werden. Der Standardwert ist auf 2 Stunden gestellt, was nun auch endlich das Problem erklärt.

Wie hoch der Wert auf dem eigenen System eingestellt ist, lässt sich durch sysctl net.ipv4.tcp_keepalive_time oder cat /proc/sys/net/ipv4/tcp_keepalive_time herausfinden.

Mittels eines einfachen Befehls lässt sich tcp_keepalive_time deutlich verringern, beispielsweise auf 10 Minuten: echo "600" > /proc/sys/net/ipv4/tcp_keepalive_time

Wichtig: Der Wert wird in Sekunden angegeben.

Nicht viel komplizierter ist es, diese Einstellung dauerhaft, also über einen Systemneustart hinweg, vorzunehmen. In der Datei /etc/sysctl.conf muss dazu einfach nur als root eine Zeile hinzugefügt werden: echo "net.ipv4.tcp_keepalive_time = 600" >> /etc/sysctl.conf