Wie kann man den SSH-Tunnel der Öffentlichkeit zugänglich machen?


174

Nun, unter Bezugnahme auf diese Frage führe ich den Befehl aus

ssh -R 8080:localhost:80 -N root@example.com

auf einem Mac. Der Hafen, der getunnelt wird, funktioniert jedoch nicht öffentlich. Ich führe einen solchen Befehl aus, damit der lokale Port auf dem Remotecomputer geöffnet werden kann. Und es funktioniert, wenn der Port auf localhost auf dem Remotecomputer geöffnet wird, aber wenn ich versuche, von meinem lokalen Computer aus auf die öffentliche IP-Adresse des Remotecomputers zuzugreifen, scheint der Port nicht offen zu sein. Wie würde ich den Tunnel auf der IP für jedermann zugänglich machen?

BEARBEITEN: Es scheint, als ob die Remote-Seite nur auf localhost statt an alle Schnittstellen bindet.

BEARBEITEN 2: Der Client ist Mac OS X 10.6 und der Server ist Linux Mint, aber beide sind OpenSSH.


Was bedeutet öffentliche IP? Wenn Sie versuchen, über den Router und über das Internet eine Verbindung zu einem lokalen Computer herzustellen, lassen die meisten Router ein solches Loopback nicht zu.
Harrymc

Antworten:


351

Wenn Sie die Manpage auf ssh überprüfen, werden Sie feststellen, dass die Syntax für -RFolgendes lautet:

-R [ Bindeadresse :] Port : Host : Hostport

Wenn bind_address(wie in Ihrem Beispiel) weggelassen wird, wird der Port nur an die Loopback-Schnittstelle gebunden. Verwenden Sie, um es an alle Schnittstellen zu binden

ssh -R \*:8080:localhost:80 -N root@example.com

oder

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

oder

ssh -R "[::]:8080:localhost:80" -N root@example.com

Die erste Version ist individuell an alle Schnittstellen gebunden. Die zweite Version erstellt eine allgemeine Nur-IPv4-Bindung, was bedeutet, dass der Port über IPv4 auf allen Schnittstellen zugänglich ist. Die dritte Version ist wahrscheinlich technisch mit der ersten äquivalent, erzeugt aber auch hier nur eine einzige Bindung an ::, was bedeutet, dass der Port von Haus aus über IPv6 und über IPv4 über IPv4-zugeordnete IPv6-Adressen erreichbar ist (funktioniert nicht unter Windows, OpenBSD). . (Sie benötigen die Anführungszeichen, da [::]sie ansonsten als Glob interpretiert werden könnten.)

Beachten Sie, dass bei Verwendung eines OpenSSH- sshdServers die Serveroption GatewayPortsaktiviert (auf yesoder gesetzt clientspecified) sein muss, damit dies funktioniert (Datei /etc/ssh/sshd_configauf dem Server prüfen ). Andernfalls (Standardwert für diese Option ist no) erzwingt der Server immer, dass der Port nur an die Loopback-Schnittstelle gebunden wird.


12
Oh mein Gott, es hat funktioniert !!!!! Ich habe genau das 1 Million Mal getan !! Ich habe nur vergessen, dass *in Bash Dateien geben wird und ich brauchte\*
Trevor Rudolph

4
Ja, genau deshalb bevorzuge ich es immer 0.0.0.0- es ist nur IPv4, aber es wird die meiste Zeit tun :)
Stefan Seidel

34
GatewayPorts hat ja mein Problem gelöst.
Sunry

4
GatewayPorts = yes (in der Remote-SSHD-Konfiguration) hat es auch für mich
behoben

3
"GatewayPorts yes" machte meinen Tag, danke @StefanSeidel
karser

37

Bearbeiten:

-g Funktioniert für lokale weitergeleitete Ports, aber Sie möchten einen umgekehrten / entfernten weitergeleiteten Port, der anders ist.

Was Sie wollen, ist das .

Im Wesentlichen auf example.com, setzen GatewayPorts=clientspecifiedin /etc/ssh/sshd_config.

--- vorherige (falsche) Antwort ---

Verwenden Sie die Option -g. Aus der Manpage von ssh:

-g     Allows remote hosts to connect to local forwarded ports.

scheint nicht zu funktionieren ... es startet, aber ich kann keine Fernverbindung herstellen
Trevor Rudolph

2
Versuchen Sie, netstat -elnptvon einem separaten Tty aus herauszufinden, welche Ports an welche Adresse gebunden sind. Ohne -gsollte ein Port gebunden sein 127.0.0.1:PORT. Mit -gsollte es gebunden sein 0.0.0.0:PORT, was es aus der Ferne zugänglich macht.
Snapshoe


2
GatewayPorts=clientspecifiedoderGatewayPorts clientspecified
Trevor Rudolph

und füge ich das dem Klienten oder der Direktübertragung hinzu?
Trevor Rudolph

14

Hier ist meine Antwort zur Vervollständigung:

Am Ende habe ich ssh -R ...für das Tunneln und socatdarüber hinaus für die Umleitung des Netzwerkverkehrs verwendet, um Folgendes zu erreichen 127.0.0.1:

Tunnel gebunden an 127.0.0.1: ssh -R mitm:9999:<my.ip>:8084 me@mitm

socat: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

Eine andere Möglichkeit ist, einen lokalen Tunnel darüber zu erstellen, aber ich finde das viel langsamer

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost


Ich mag die Tatsache, dass ich mich nicht mit der sshd-Konfiguration auseinandersetzen muss und alles ohne sudo machen kann. Außerdem erfahre ich, dass es socat gibt. Vielen Dank!
BrutusCat

+ Auf geht's, mein Herr. Ich habe versucht, ssh anzuweisen, sich an 0.0.0.0 zu binden, ohne Erfolg. Dann habe ich die * -Syntax gesehen, habe das versucht, keine Würfel. Ich stelle mir vor, es könnte eine Art Sicherheitsfeature in sshd config sein oder etwas, das es nicht zulässt. Endlich diesen Beitrag gesehen und socatsuper gearbeitet. Super nützlich, stecke dies in meine Gesäßtasche;]
Jaime

10

Sie können auch eine doppelte Weiterleitung verwenden, wenn Sie / etc / ssh / sshd_config nicht ändern können.

Leiten Sie zuerst an den temporären Port (z. B. 10080) des Loopback-Geräts auf dem Remote-Computer weiter, und verwenden Sie dann die lokale Weiterleitung, um den Port 10080 an allen Schnittstellen auf 80 umzuleiten:

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"

1
Dies funktioniert tatsächlich, um Weiterleitungsregeln zu umgehen!
Michael Schubert

Ich liebe diese Lösung. Tolle Abhilfe, wenn Sie die Konfiguration auf der Maschine nicht ändern möchten
Grezzo

8

Verwenden Sie die Option "Gateway-Ports".

ssh -g -R REMOTE_PORT:HOST:PORT ...

Um dies zu nutzen, müssen Sie wahrscheinlich " GatewayPorts yes" Ihren Servern hinzufügen /etc/ssh/sshd_config.


Eigentlich hat das geklappt. Ich verwende eine EC2-Instanz als Weiterleitung zu meinem REST-Server. Auf diese Weise muss ich meinen Server nicht in die DMZ stecken und ich brauche keine öffentliche IP. Komischerweise funktionierte ssh -R remote_port: localhost: port xxx @ ec2xxx mit der ersten von mir erstellten EC2-Instanz einwandfrei, aber ich musste später aus irgendeinem Grund eine weitere Instanz erstellen, und von diesem Zeitpunkt an bekam ich immer: connection verweigert. Ich habe tcpdump benutzt, um zu sehen, was ich bekommen habe, und es gab nicht viele Informationen. -g plus GatewayPorts hat ja den Trick gemacht.
ET

1

Jump-Hosts sind eine relativ neue Erweiterung von OpenSSH. Dies erfordert SSH-Zugriff auf das Intermediate, sollte jedoch ohne zusätzliche Konfiguration funktionieren.

ssh -J root@example.com remoteuser@localhost -p 8080

Dieser Befehl weist SSH an root@example.com, localhostunter dem remoteuserBenutzernamen zuerst eine Verbindung zu Port 8080 (dh dem Port, der vom Sprunghost zum Remote-Host getunnelt wird) herzustellen und dann von diesem Computer aus eine Verbindung herzustellen .


0

Wenn Sie die Konfiguration übernehmen möchten, ~/.ssh/configanstatt Befehlszeilenparameter zu verwenden, können Sie Folgendes ausprobieren

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Denken Sie daran, dass die Firewall GatewayPortsIhres Remote-Hosts Verbindungen zu 8080 zulässt, und stellen Sie sicher, dass die Option Ihrer /etc/ssh/sshdKonfiguration nicht auf festgelegt istno

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.