Klingt so, als ob Sie Autossh brauchen. Dadurch wird ein SSH-Tunnel überwacht und bei Bedarf neu gestartet. Wir verwenden es seit einigen Jahren und es scheint gut zu funktionieren.
autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C
Weitere Details zum Parameter -M hier
Alle zustandsbehafteten Firewalls vergessen eine Verbindung, nachdem sie für einige Zeit kein Paket für diese Verbindung gesehen haben (um zu verhindern, dass die Zustandstabellen voller Verbindungen werden, bei denen beide Enden gestorben sind, ohne die Verbindung zu schließen). Die meisten TCP-Implementierungen senden ein Keepalive-Paket nach langer Zeit, ohne etwas von der anderen Seite zu hören (2 Stunden ist ein üblicher Wert). Wenn es jedoch eine Stateful-Firewall gibt, die die Verbindung vergisst, bevor die Keepalive-Pakete gesendet werden können, wird eine langlebige, aber inaktive Verbindung sterben.
Wenn dies der Fall ist, besteht die Lösung darin, zu verhindern, dass die Verbindung in den Leerlauf gerät. OpenSSH hat eine Option namens ServerAliveInterval, die verwendet werden kann, um zu verhindern, dass die Verbindung zu lange im Leerlauf ist (als Bonus erkennt es früher, wenn der Peer stirbt, selbst wenn die Verbindung im Leerlauf ist).
Ich habe das folgende Bash-Skript verwendet, um immer wieder neue SSH-Tunnel zu erzeugen, wenn der vorherige stirbt. Die Verwendung eines Skripts ist praktisch, wenn Sie keine zusätzlichen Pakete installieren oder den Compiler verwenden möchten oder können.
while true
do
ssh <ssh_options> [[email protected]]hostname
sleep 15
done
Beachten Sie, dass dies eine Schlüsseldatei erfordert, um die Verbindung automatisch herzustellen, aber das ist auch bei Autossh der Fall.