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

39

Wenn ich eine Remote-Portweiterleitung durchführe, a la, -R 3690:localhost:3690wenn bereits eine Bindung für den Port auf dem Remote-Host vorhanden ist, wird folgende Warnung angezeigt:

Warning: remote port forwarding failed for listen port 3690

Gibt es eine Möglichkeit, ssh fehlschlagen zu lassen (dh mit einem Rückkehrcode ungleich Null zu beenden), anstatt nur eine Warnung auszugeben?

Matt Joiner
quelle
Müssen Sie tatsächlich auch einen Terminal-Kanal einrichten oder nur die Weiterleitung?
Ignacio Vazquez-Abrams
1
@ IgnacioVazquez-Abrams: Nur die Weiterleitung.
Matt Joiner

Antworten:

63

Lauf

ssh -o "ExitOnForwardFailure yes" ...

oder setzen

ExitOnForwardFailure yes

in ~/.ssh/config. Siehe man ssh_configfür weitere Einzelheiten.

Andrew Schulman
quelle
Leider habe ich OpenSSH 4. Können Sie mir mitteilen, wann diese Funktion hinzugefügt wurde?
Matt Joiner
2
Nein, das weiß ich nicht. Möglicherweise handelt es sich um ein Feature der Version 5. Aber Version 4 muss jetzt viele Jahre alt sein und es gibt ständig Sicherheitsupdates . Wenn Sie den Server nicht selbst aktualisieren können, können Sie Ihren Serveradministrator fragen, ob er die Verwendung dieser Version für sicher hält.
Andrew Schulman
Beachten Sie, dass bind_addressssh möglicherweise immer noch nicht fehlschlägt , wenn Sie das nicht explizit angeben . Wenn beispielsweise ein anderer Benutzer bereits IPv6-localhost [::1]:3690abhört, bindet ssh möglicherweise nur IPv4 127.0.0.1:3690und beschwert sich nicht. Aber Ihr svn-Client würde wahrscheinlich den ipv6-Socket (des Angreifers) vorziehen. Um sicher zu gehen, besser verwenden-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
Rudimeier
3
Man kann auch ssh -o ExitOnForwardFailure = yes verwenden, um Leerzeichen und das Erfordernis eines Zitierens zu vermeiden.
Freiraum
1

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

clientseitiges Skript: (verwendet .ssh / config für die Einstellungen der Portweiterleitung)

#!/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

Führen Sie möglicherweise sogar das clientseitige Skript unter screen mit -dmS aus

Antti Rytsölä Circles Consult
quelle
2
Ich versuche zu vermeiden, dass bereits eine Portweiterleitung vorhanden ist und eine Warnung ausgegeben wird. Ich denke, dass dieses Skript eine vorhandene Bindung an den Port eher als Erfolg als als als Misserfolg behandelt.
Matt Joiner
1
Das ist wahr. Mein Problem war, dass dasselbe Skript den Port einige Minuten offen hielt, bevor das Zeitlimit überschritten wurde. Dieses Skript wurde einige Male beendet und erneut ausgeführt, wonach der Port wieder geöffnet wurde. Wenn Sie sicher sein müssen, wem der Port gehört, können Sie versuchen, netstat -anp mit sudo auszuführen und dies zu begrüßen.
Antti Rytsölä Circles Consult
@ AnttiRytsöläCirclesConsult: Beachten Sie, dass Sie möglicherweise die Prozess-ID überprüfen müssen, da z. B. eine Übereinstimmung mit "ssh" vorliegt, da der Prozessname Ihnen immer noch nicht sagt, welcher der SSH-Clients diesen Port gerade weiterleitet.
Piskvor