Stabile Reverse-Port-Weiterleitung in SSH- und veralteten Sitzungen

6059
Vi.

Verwenden von VPS zum Weiterleiten von Ports hinter NAT:

for((;;)) { ssh -R 2222:127.0.0.1:22 vi@vi-server.org; sleep 10; } 

Wenn die Verbindung irgendwie unterbrochen ist und die Verbindung wieder hergestellt wird.

Warning: remote port forwarding failed for listen port 2222 Linux vi-server.no-ip.org 2.6.18-92.1.13.el5.028stab059.3 #1 SMP Wed Oct 15 13:33:44 MSD 2008 i686 

Ich tippe:

vi@vi-server:~$ killall sshd Connection to vi-server.org closed by remote host. Connection to vi-server.org closed. Linux vi-server.no-ip.org 2.6.18-92.1.13.el5.028stab059.3 #1 SMP Wed Oct 15 13:33:44 MSD 2008 i686 vi@vi-server:~$  

Jetzt ist es ok.

Wie ist es einfacher, dies automatisch zu machen?

6
Kannst du etwas mehr darüber sagen, was du damit erreichen willst? Doug Harris vor 14 Jahren 0
Weiterleiten des Remote-Ports an den lokalen Computer über SSH, auch wenn die Verbindung fehlschlägt. Alte SSH-Verbindung wird vom Server immer noch als lebendig angesehen und verhindert, dass der Remote-Port für das Abhören festgelegt wird. Daher muss ich die Stall-Verbindung ("killall sshd") explizit beenden. Vi. vor 14 Jahren 0
Now added -t sh -c "kill \`pidof sshd -o $PPID\` 2> /dev/null && echo "Retrying" >&2 && exit 0; exec bash -il" to the command, looks like the hack works. Are there cleaner ways of doing this? Vi. vor 14 Jahren 0
@Vi. Ich bin nur neugierig, ob Sie den Hack immer noch benutzt haben oder eine saubere Alternative gefunden haben. Ich bin auf das gleiche Problem gestoßen und würde nicht gerne alle offenen SSH-Verbindungen bei jedem Reconnect beenden. Alan Christopher Thomas vor 12 Jahren 0
Ich verwende derzeit verschiedene Arten des Hacks (einschließlich dem Senden von Keep-Alives und dem Wiederherstellen der Verbindung, wenn sie nicht erhalten werden). (Bedeutet nicht, dass ich raten sollte, Hacks anstelle von richtigen Lösungen zu verwenden). Vi. vor 12 Jahren 0

3 Antworten auf die Frage

8
vaab

Ich denke, Sie haben die falsche Seite genommen: In Ihrem Fall sshd(Server-Seite) schlägt wahrscheinlich weder eine Sitzung fehl, noch haben sie abgestandene Sitzungen . Wenn Sie sie beenden, sollte dies nicht helfen, abgesehen von dem Nebeneffekt, dass etwa alle verbundenen sshClient-Verbindungen abgebrochen werden.

Es ist der sshClient, der die Verbindung nicht beendet, wenn der Portweiterleitungsmechanismus nicht erstellt wurde. Und dieses Verhalten ist kein Fehler.

Sie müssen sich die ExitOnForwardFailureOption im ssh-Handbuch ansehen .

Ihr Skript wäre:

 for ((;;)) 

Zusätzlich sollten Sie straffen ServerAliveIntervalund ServerAliveCountMaxfür den Kunden früher deconnections zu erkennen. (Und Sie sollten sicherstellen, dass TCPKeepAliveist ondie der Standardwert ist). Beachten Sie, dass autosshSie nicht mehr helfen werden, wenn Sie diese Optionen festgelegt haben.

ExitOnForwardFailure ist eine gute Option, aber sie verhindert meine Sitzung, anstatt die veraltete Sitzung zu starten. Wahrscheinlich so etwas wie `ssh ... -o ExitOnForwardFailure = yes || ssh ... "kill the stale session" `kann verwendet werden. Vi. vor 13 Jahren 0
Falls ein separater Benutzer für einen Tunnel zugewiesen wird, kann ein veralteter Tunnel durch das von diesem Benutzer verarbeitete kill -HUP sshd entfernt werden. Weitere Hinweise finden Sie unter http://serverfault.com/questions/566501/reverse-ssh-tunnel-failing-looking-for-debug-advice. Außerdem gibt netstat --listen -lnp die PID des interessierenden sshd-Prozesses an. Wäre immer noch interessant, wie kann man das richtig automatisieren? Roman Susi vor 9 Jahren 0
2
Sunday

I see there already is a good answer refering to an existing piece of software (autossh) that automatically maintains reverse port forwarding through ssh.

I still want to share my own little bash script doing the same thing and is trivial to set up.

#!/bin/bash while true do START=$(date +%s) ssh -NR rport:host:lport -o ServerAliveInterval=10 -o ExitOnForwardFailure=yes user@host END=$(date +%s) DIFF=$(( $END - $START )) if (( $DIFF < 3 )) then sleep 60 fi done 

If forwarding fails repeatedly it should suffice to retry once a minute, if connection breaks after it was up for a while it will retry immediately.

I use it on archlinux with systemd (wrote a little .service-file) and it works like a charm.

Besser kann es sein, wenn auch abgestandene Session-Tritte implementiert werden. Vi. vor 11 Jahren 0
1
Vi.

Sieht so aus, als wäre AutoSSH das Richtige.

Autossh ist ein Programm, um eine Kopie von SSH zu starten und zu überwachen. Falls nötig, wird es erneut gestartet, falls es stirbt oder der Datenverkehr stoppt. Die ursprüngliche Idee und der Mechanismus wurden von RSTunnel (Reliable SSH Tunnel) inspiriert.

Mit Version 1.2 änderte sich die Methode: autossh begann SSH zu verwenden, um eine Schleife von SSH-Weiterleitungen (eine vom lokalen Computer zum Remote-Computer und eine vom Remote-Computer zum lokalen Computer) zu erstellen. Anschließend wurden Testdaten gesendet, von denen erwartet wird, dass sie zurückgegeben werden . (Die Idee war dank Terrence Martin.)

Mit der Version 1.3 wurde eine neue Methode hinzugefügt (dank Ron Yorston): Für einen Remote-Echo-Service kann ein Port angegeben werden, der die Testdaten zurücksendet. Dies vermeidet die Überlastung und die Verschärfung der Sicherstellung, dass nicht alle Portnummern auf dem Remote-Computer kollidieren. Die Methode der Weiterleitungsschleife bleibt für Situationen verfügbar, in denen die Verwendung eines Echodienstes möglicherweise nicht möglich ist.

Eigenschaften

  • autossh ist ein Programm, mit dem eine Kopie von ssh gestartet und überwacht werden kann. Falls nötig, wird sie erneut gestartet, falls sie stirbt oder den Datenverkehr stoppt. Die Idee stammt von rstunnel (Reliable SSH Tunnel), wurde aber in C implementiert.
  • Der Autor ist der Ansicht, dass es nicht so fummelig ist wie ein Tunnel, um an die Arbeit zu gelangen.
  • Verbindungsüberwachung mit einer Schleife von Portweiterleitungen oder einem Remote-Echo-Service.
  • Die Geschwindigkeit der Verbindungsversuche wird abgebrochen, wenn schnelle Ausfälle auftreten, z. B. eine abgelehnte Verbindung.
  • Kompiliert und getestet unter OpenBSD, Linux, Solaris, Mac OS X, Cygwin und AIX. sollte auf anderen BSDs arbeiten.
  • Freeware
(Aber ich habe bereits ein Schema für "ghost" stale SSH-Sitzungen eingerichtet, so dass ich wahrscheinlich autossh verwenden werde, wenn ich etwas zuverlässigeres brauche.) Vi. vor 14 Jahren 0
Ich lese überall, dass AutoSSH genau die richtige Wahl dafür ist - aber ich erhalte immer noch die Warnung "Remote Port Forwarding Failed", wenn die Verbindung wieder hergestellt wird. Sieh nicht, was hier schief läuft. con vor 10 Jahren 0