Kann ich SSH ausfallen lassen, wenn eine Portweiterleitung fehlschlägt?

11070
Matt Joiner

Wenn ich eine Remote-Port-Weiterleitung durchführe, aa -R 3690:localhost:3690wenn auf dem Port des Remote-Hosts bereits eine Bindung vorhanden ist, erhalte ich die folgende Warnung:

Warning: remote port forwarding failed for listen port 3690 

Gibt es eine Möglichkeit, dass ssh fehlschlägt (dh mit einem Rückgabecode ungleich Null beendet wird), anstatt nur eine Warnung auszugeben?

32
Müssen Sie eigentlich auch einen Terminal-Kanal oder nur die Weiterleitung erstellen? Ignacio Vazquez-Abrams vor 12 Jahren 0
@ IgnacioVazquez-Abrams: Nur die Weiterleitung. Matt Joiner vor 12 Jahren 1

2 Antworten auf die Frage

53
Andrew Schulman

Run

ssh -o "ExitOnForwardFailure yes" ... 

or put

ExitOnForwardFailure yes 

into ~/.ssh/config. See ssh_config(1) using man for details.

Leider habe ich OpenSSH 4. Können Sie mir sagen, wann diese Funktion hinzugefügt wurde? Matt Joiner vor 12 Jahren 0
Nein, das weiß ich nicht. Es kann sich um eine Version 5-Funktion handeln. Version 4 muss jedoch schon viele Jahre alt sein und es gibt ständig [Sicherheitsupdates] (http://openssh.org/security.html). Wenn Sie den Server nicht selbst aktualisieren können, sollten Sie Ihren Serveradministrator fragen, ob er der Meinung ist, dass er diese Version weiterhin verwenden kann. Andrew Schulman vor 12 Jahren 2
Wenn Sie die `bind_address` nicht explizit angeben, kann ssh trotzdem nicht fehlschlagen. Wenn zum Beispiel ein anderer Benutzer bereits auf ipv6 localhost `[:: 1]: 3690` hört, bindet ssh möglicherweise nur ipv4` 127.0.0.1: 3690` und beschwert sich nicht. Ihr svn-Client würde jedoch wahrscheinlich den ipv6-Socket (des Angreifers) bevorzugen. Um sicherzugehen, verwenden Sie `-R [:: 1]: 3690: localhost: 3690 -R 127.0.0.1: 3690: localhost: 3690` rudimeier vor 7 Jahren 0
1
Antti Rytsölä Circles Consult

Ich verwende Bash-Skript auf dem Zielhost, um sicherzustellen, dass die Weiterleitung korrekt geöffnet wurde. Die SSH-Verbindung führt dies aus und wird beendet, wenn ein Problem mit der Portweiterleitung vorliegt, z

clientseitiges Skript: (verwendet .ssh / config für die Portweiterleitungseinstellungen)

#!/bin/bash   while true; do echo -n starting at : " date ssh user@server bin/sshloop.sh echo "got back, sleeping 17 " sleep 17 done  

serverseitiges Skript (bin / sshloop.sh)

#!/bin/bash  while true; do  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client" sleep 17 if ! netstat -an | grep -q ":::1090 " ; then echo "1090 forward missing, bailing out" exit fi done 

Vielleicht führen Sie sogar das clientseitige Skript mit -dmS unter screen aus

Der Fall, den ich zu vermeiden versuche, ist, dass bereits ein Port-Forward existiert und eine Warnung ausgegeben wird. Ich denke, dieses Skript wird eine bestehende Bindung an den Port als Erfolg und nicht als Fehlschlag behandeln. Matt Joiner vor 12 Jahren 1
Das ist wahr. Mein Problem bestand darin, dass derselbe Skript den Port für einige Minuten offen hielt, bevor das Zeitlimit überschritten wurde. Das Skript wurde einige Male beendet und erneut ausgeführt, woraufhin der Port wieder geöffnet wurde. Wenn Sie genau wissen müssen, wem der Port gehört, können Sie netstat -anp mit sudo ausführen und darauf zugreifen. Antti Rytsölä Circles Consult vor 12 Jahren 0