Ich habe eine unzuverlässige Netzwerkverbindung zwischen zwei Computern: Manchmal werden aktive TCP-Verbindungen aus Gründen unterbrochen, die außerhalb meiner Kontrolle liegen. Ich möchte eine zuverlässige TCP-Verbindung zwischen den beiden Maschinen herstellen.
Wenn das Netzwerk zuverlässig wäre, würde ich einfach laufen ssh -L 1234:localhost:1234 remotehost
, während der Server Port 1234 überwacht remotehost
, und den Client auf zeigen localhost:1234
. Wenn die SSH-Verbindung jedoch unterbrochen wird, wird auch die weitergeleitete Verbindung unterbrochen. Wie kann ich veranlassen, dass die Verbindung zwischen dem Client und dem Server automatisch wiederhergestellt wird?
Nichtlösungen:
- Dies gilt nicht für interaktive Anwendungen, daher gilt der Bildschirm nicht.
- Hier geht es nicht nur darum, einen SSH-Tunnel automatisch wieder anzuschließen, la autossh . Ich möchte weiterhin dieselbe getunnelte TCP-Verbindung verwenden und keine neue starten.
- Im Prinzip würde ein VPN den Trick tun. Aber es scheint übertrieben, wenn ich nur eine TCP-Verbindung möchte, und ich möchte eine Lösung, die auch dann funktioniert, wenn ich auf beiden Seiten keine Root-Berechtigungen habe.
Ich habe eine schwache Erinnerung an ein Programm namens rocks
, das genau das getan hat, aber es scheint vom Web gefallen zu sein. Ich interessiere mich hauptsächlich für Linux auf beiden Seiten (obwohl ich erwarten würde, dass ein Programm auf dieser Ebene auf andere Unices portierbar ist), aber wenn Sie ein Programm kennen, das zwischen QNX und VMS funktioniert, umso besser.
scp
. Ich habe mit ssh keepalives basierend auf Ihrem Beispiel für die Portweiterleitung geantwortet. Re: flockig Downstream - Hop, gibt es nicht viel Sie tun können, andere als eine SSH - Sitzung mit Keep Alive erstellen, die mehr tolerant (dh erlaubt mehr gefallen Keep Alive mitServerAliveInterval > 0
undServerAliveCountMax > 3
). NAT erfordert niedrigere Keepalives-Intervalle. Das Hauptproblem besteht darin, das Problem zu identifizieren und entsprechend anzupassen. Geben Sie die Optionen ein,.ssh/config
damit sie immer für Sie da sindrocks
Implementierung zu hoffen ... obwohl dies offensichtlich ein echter Kludge istAntworten:
Ist der alte ein nicht gewarteter zuverlässiger Sockel ( Rocks ), wonach Sie suchen?
quelle
Das einzige mir bekannte Standardprotokoll mit dieser Funktion ist MPTCP . Es ist für die Anwendungsschicht transparent, sodass SSH über MPTCP einfach funktionieren sollte. Es kann die zugrunde liegenden TCP-Verbindungen über verschiedene Pfade mit unterschiedlichen IPs ausführen, sodass es im Prinzip verwendet werden kann, um Ihre SSH-Verbindung in die VPN-Verbindung hinein und aus dieser heraus zu migrieren, je nachdem, ob die VPN-Verbindung besteht.
Ich weiß nicht viel über die Reife von MPTCP-Implementierungen, aber das Design des Protokolls sieht ziemlich robust aus.
Es sollte Ihre SSH-Verbindungen vor Verlust durch unzuverlässige Netzwerkkonnektivität schützen. Es schützt Sie nicht vor einem Mitm, der Ihre SSH-Verbindung unterbrechen möchte. Ein Mitm kann weiterhin beschädigte Daten einspeisen, die von SSH erkannt und die Verbindung unterbrochen werden.
Eine MPTCP-ähnliche Methode zum erneuten Verbinden, die in das SSH-Protokoll integriert ist, ist die Methode, die ich mir vorstellen kann, um eine Verbindung so lange wie möglich aufrechtzuerhalten. Ich glaube jedoch nicht, dass eine solche Funktion für das SSH-Protokoll entwickelt wurde.
quelle
Sie können verwenden
daemontools
, um den SSH-Port vorwärts zu halten; Es wird nicht unbedingt Programme abhängig von der Verbindung am Leben halten, während sie unterbrochen ist (wie vermutlich, wenn ssh die Verbindung trennt, wird der lokale Port beginnen, ihre Verbindungen abzulehnen), aber es ist ein Start.Ich vermute, es gibt einige
iptables
Tricks, wie das Verursachen, dass dieser Port Pakete DROPT, sobald die SSH-Weiterleitung verschwindet, sodass die Verbindungsprogramme nur wissen, dass Pakete verschwinden und nicht abgelehnt werden. Ich lernedaemontools
mich nur (wieder), daher bin ich mir nicht sicher, ob Sie ein benutzerdefiniertes Skript ausführen können, wenn ein Dienst ausfällt, aber ich vermute, dass Sie dies können.quelle
TCP macht das automatisch. Sie müssen nur die typischen praktischen Bereinigungs-Hacks deaktivieren oder schwächen, die zum Beenden sterbender TCP-Verbindungen verwendet werden. Deaktivieren Sie TCP Keepalive für Ihre Verbindung und erhöhen Sie das Limit für übermäßige Neuübertragungen erheblich. Schreiben Sie beispielsweise unter Linux eine große Anzahl in
/proc/sys/net/ipv4/tcp_retries2
.In einem modernen Netzwerk vergisst eine Stateful Packet Inspection-Firewall jedoch wahrscheinlich eine TCP-Verbindung, die keine regelmäßigen Pakete austauscht, sodass es auf Ihrer Parade regnen kann.
quelle
reasons beyond my control
, was ich als dynamische IP oder Stateful Middleboxes lese. In solchen Szenarien kann TCP Keepalive ein wenig helfen. Unabhängig davon, wie Sie TCP Keepalive konfigurieren, reicht es nicht aus, die Verbindung aufrechtzuerhalten, wenn eine Middlebox aufgrund eines Neustarts den Status verliert.