Warum sagt ssh -g, dass die Adresse bereits verwendet wird?

7

Ich habe eine SSH-Verbindung mit Portweiterleitung eingerichtet, mit der Remote-Hosts wie folgt eine Verbindung zu den lokal weitergeleiteten Ports herstellen können:

ssh -g -L 5115:localhost:5115 <server>

Die Verbindung funktioniert einwandfrei, obwohl folgende Fehlermeldung angezeigt wird:

bind: Adresse wird bereits verwendet

Ich erhalte diese Nachricht, egal welche Ports ich wähle. Ich frage mich, warum ich diese Nachricht erhalte, obwohl die Verbindung einwandfrei zu funktionieren scheint. Mache ich etwas falsch?

Curt
quelle
Was ist (auf beiden Systemen) die Ausgabe von netstat --inet --inet6 -nlp | grep 5115?
Hauke ​​Laging
@HaukeLaging Es gibt keine Ausgabe auf beiden Boxen, bevor ich den SSH-Befehl ausführe
Curt
Es sei denn, ich vermisse etwas ... -germöglicht Remote-Hosts die Verbindung zu einem weitergeleiteten Port. 'localhost' weist es an, an eine IP zu binden, die von einem Remote-Host nicht erreicht werden kann. Ändern Sie localhost in die IP-Adresse des lokalen Systems (nicht 127.0.0.1) und sehen Sie, was Sie erhalten.
Yoonix
Das ist komisch. Zum besseren Verständnis des Problems können Sie laufen sshdurch straceund einen Blick auf den letzten syscalls vor der Fehlermeldung haben: strace -o ssh.strace ssh -g -L 5115:localhost:5115 <server>. Beenden Sie sshdie Verbindung, sobald die Verbindung hergestellt ist, und sehen Sie sich die Datei an ssh.strace.
Hauke ​​Laging
1
@yoonix nein, der Host in der Mitte -L cport:shost:sportist der Host, mit dem der Server für Tunnelverbindungen spricht. Das Client- Ende lauscht standardmäßig auf Loopback (127.1), wodurch nur Prozesse auf localhost eine Verbindung herstellen können. -gbewirkt, dass stattdessen ANYADDR (0 oder :: 0) abgehört wird, wodurch auch Remote-Prozesse möglich sind. Alternativ können Sie vier Teile angeben : -L cbind:cport:shost:sport. Wenn -L cport:cIP:sportdies funktionieren würde, würde der Datenverkehr vom Client zum Server verschlüsselt und dann direkt an den Client zurückgesendet, wodurch die beabsichtigte Sicherheit zerstört würde.
dave_thompson_085

Antworten:

2

Der Befehl:

ssh -g -L 5115:localhost:5115 <server>

sshDies würde dazu führen, dass der lokale Prozess an den 0.0.0.0-Port 5115 gebunden wird, um auf die Weiterleitung von Verbindungen zu warten. Die Fehlermeldung, die Sie erhalten, zeigt an, dass ein anderer Prozess bereits an diese Adresse und diesen Port gebunden ist und daher sshnicht ausgeführt werden kann.

Sie sollten dies überprüfen können, indem Sie netstat ausführen:

netstat -an | grep 5115

Möglicherweise sehen Sie eine Zeile wie diese:

tcp4       0      0  *.22                   *.*                    LISTEN

"HÖREN" bedeutet, dass etwas auf Verbindungen wartet. " .22" ist die Adresse und der Port; 0.0.0.0 oder " " bedeutet "jede Schnittstelle".

Hier haben Sie die Möglichkeit, das andere Programm zu finden, das Port 5115 verwendet, und es anzuhalten, oder einen anderen lokalen Port für Ihren SSH-Tunnel zu verwenden.

Kenster
quelle
1
I get this message no matter what ports I choose.
Michael
2

Wenn Sie Linux ausführen, können Sie die Warnung löschen, indem Sie Folgendes ausführen (als Root):

Echo 1> / proc / sys / net / ipv6 / bindv6only

Was los ist, ist, dass ssh einen PF_INET6-Socket [::]:5115bindet , bevor es einen PF_INET-Socket bindet 0.0.0.0:5115. Der PF_INET6-Socket ist an beide Protokolle gebunden, sodass der Versuch, den zweiten Socket zu binden, fehlschlägt. Durch Einschalten bindv6onlyhalten Sie die Hände des PF_INET6-Sockets von der IPv4-Adresse fern.

Eine weniger störende Möglichkeit, dorthin zu gelangen, ist die Verwendung der Vier-Argumente-Form von -L, bei der Sie die Bindungsadresse explizit angeben (Verwendung 0.0.0.0).

Aecolley
quelle