Follow-up: Es sieht so aus, als ob die schnelle Reihe von Verbindungsabbrüchen, die mit einigen Monaten der Ausführung jedes Servers zusammenfällt, wahrscheinlich zufällig ist und nur dazu dient, das eigentliche Problem aufzudecken. Der Grund, warum die Verbindung nicht wiederhergestellt werden konnte, liegt mit ziemlicher Sicherheit an den AliveInterval-Werten (kasperds Antwort). Wenn Sie die Option ExitOnForwardFailure verwenden, sollte das Zeitlimit vor dem erneuten Herstellen der Verbindung korrekt angezeigt werden. In den meisten Fällen sollte dies das Problem beheben. Der Vorschlag von MadHatter (das Kill-Skript) ist wahrscheinlich der beste Weg, um sicherzustellen, dass der Tunnel wieder verbunden werden kann, auch wenn alles andere fehlschlägt.
Ich habe einen Server (A) hinter einer Firewall, der an mehreren Ports einen Reverse-Tunnel zu einem kleinen DigitalOcean-VPS (B) initiiert, damit ich über die IP-Adresse von B eine Verbindung zu A herstellen kann. Der Tunnel ist seit ungefähr 3 Monaten durchgehend in Betrieb, ist jedoch in den letzten 24 Stunden plötzlich viermal ausgefallen. Dasselbe geschah vor einiger Zeit bei einem anderen VPS-Anbieter - Monate des einwandfreien Betriebs, dann plötzlich mehrere schnelle Ausfälle.
Ich habe ein Skript auf Maschine A, das den Tunnelbefehl automatisch ausführt ( ssh -R *:X:localhost:X address_of_B
für jeden Port X), aber wenn es ausgeführt wird, heißt es Warning: remote port forwarding failed for listen port X
.
Wenn Sie /var/log/secure
auf dem Server auf sshd zugreifen, werden die folgenden Fehler angezeigt :
bind: Address already in use
error: bind: Address already in use
error: channel_setup_fwd_listener: cannot listen to port: X
Das Lösen erfordert einen Neustart des VPS. Bis dahin wird bei allen Versuchen, die Verbindung wiederherzustellen, die Meldung "Remote-Portweiterleitung fehlgeschlagen" angezeigt und funktioniert nicht. Es ist jetzt so weit, dass der Tunnel vor dem Anhalten nur noch etwa 4 Stunden dauert.
Am VPS hat sich nichts geändert, und es handelt sich um einen Einbenutzer-Einzelplatzrechner, der nur als Reverse-Tunnel-Endpunkt dient. Es läuft OpenSSH_5.3p1 unter CentOS 6.5. Es scheint, dass sshd die Ports nicht an seinem Ende schließt, wenn die Verbindung unterbrochen wird. Ich bin nicht in der Lage zu erklären, warum oder warum es nach Monaten eines nahezu perfekten Betriebs plötzlich passieren würde.
Um dies zu verdeutlichen, muss ich zuerst herausfinden, warum sshd es ablehnt, die Ports zu überwachen, nachdem der Tunnel ausfällt. Dies scheint darauf zurückzuführen zu sein, dass sshd die Ports offen lässt und sie niemals schließt. Das scheint das Hauptproblem zu sein. Ich bin mir nur nicht sicher, was dazu führen würde, dass es sich nach Monaten des erwarteten Verhaltens so verhält (dh, die Ports werden sofort geschlossen und das Skript kann erneut verbunden werden).