2013-04-27 22:14:51 +0000 2013-04-27 22:14:51 +0000
189
189

Wie kann man den ssh-Tunnel für die Öffentlichkeit zugänglich machen?

Nun, zurückkommend auf diese Frage, führe ich den Befehl

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

auf einem Mac aus. Doch der Port, der getunnelt wird, funktioniert nicht öffentlich. Ich führe einen solchen Befehl aus, damit der lokale Port auf dem entfernten Computer geöffnet werden kann. Und es funktioniert, wenn ich den Port auf localhost auf dem entfernten Computer öffne, aber wenn ich versuche, von meinem lokalen Computer auf die öffentliche IP-Adresse des entfernten Computers zuzugreifen, scheint der Port nicht geöffnet zu sein. Wie kann ich den Tunnel auf der IP-Adresse öffentlich machen, damit jeder darauf zugreifen kann?

EDIT: Es scheint, als ob die entfernte Seite nur an localhost bindet, anstatt an alle Schnittstellen.

EDIT 2: Der Client ist Mac OS X 10.6 und der Server ist Linux Mint, aber beide arbeiten mit OpenSSH.

Antworten (7)

368
368
368
2013-05-06 06:11:42 +0000

Wenn Sie in der Manpage für ssh nachsehen, werden Sie feststellen, dass die Syntax für -R lautet:

-R [_bind\_address_:]_port_:_host_:_hostport_

Wenn `bindaddress`_ weggelassen wird (wie in Ihrem Beispiel), wird der Port nur an die Loopback-Schnittstelle gebunden. Um ihn an alle Schnittstellen zu binden, verwenden Sie

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 bindet an alle Schnittstellen einzeln. Die zweite Version erzeugt einen allgemeinen IPv4-only-Bind, was bedeutet, dass der Port auf allen Schnittstellen über IPv4 erreichbar ist. Die dritte Version ist wahrscheinlich technisch äquivalent zur ersten, aber auch sie erzeugt nur einen einzelnen Bind an ::, was bedeutet, dass der Port über IPv6 nativ und über IPv4 durch IPv4-gemappte IPv6-Adressen erreichbar ist (funktioniert nicht unter Windows, OpenBSD).   (Sie brauchen die Anführungszeichen, weil [::] sonst als glob interpretiert werden könnte.)

Beachten Sie, dass wenn Sie einen OpenSSH sshd-Server verwenden, die Option GatewayPorts des Servers aktiviert sein muss (auf yes oder clientspecified gesetzt), damit dies funktioniert (überprüfen Sie die Datei /etc/ssh/sshd_config auf dem Server). Andernfalls (Standardwert für diese Option ist no) erzwingt der Server immer, dass der Port nur an die Loopback-Schnittstelle gebunden wird.

40
40
40
2013-04-28 03:34:48 +0000

Bearbeiten:

-g funktioniert für lokale weitergeleitete Ports, aber was Sie wollen, ist ein umgekehrter/entfernter weitergeleiteter Port, der anders ist.

Was Sie wollen, ist dies .

Im Wesentlichen, auf example.com, setzen Sie GatewayPorts=clientspecified in /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.
15
15
15
2013-10-29 12:09:40 +0000

Hier ist meine Antwort zur Vervollständigung:

Am Ende habe ich ssh -R ... für das Tunneln verwendet und socat darüber hinaus für die Umleitung des Netzwerkverkehrs auf 127.0.0.1 verwendet:

tunnel binded to 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 nur lokalen Tunnel darüber zu legen, aber ich finde das viel langsamer

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

10
10
10
2016-08-01 22:37:07 +0000

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

Leiten Sie zuerst auf einen temporären Port (z. B. 10080) auf dem Loopback-Gerät des entfernten Rechners weiter, dann verwenden Sie dort einen lokalen Forward, um den Port 10080 auf 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"
8
8
8
2013-04-28 13:58:50 +0000

Verwenden Sie die Option “gateway ports”.

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

Um das zu verwenden, müssen Sie wahrscheinlich “GatewayPorts yes” an das /etc/ssh/sshd_config Ihres Servers anhängen.

2
2
2
2019-06-03 20:09:02 +0000

Jump hosts sind eine relativ neue Ergänzung zu OpenSSH. Dies erfordert SSH-Zugriff auf den Zwischenrechner, sollte aber ohne zusätzliche Konfiguration funktionieren.

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

Dieser Befehl weist SSH an, sich zuerst mit root@example.com zu verbinden und dann von diesem Rechner aus eine Verbindung zu Port 8080 bei localhost (d. h. der Port, der vom Sprung-Host zum entfernten Host getunnelt ist) unter dem Benutzernamen remoteuser zu initiieren.

0
0
0
2018-08-26 15:50:49 +0000

Wenn Sie die Konfiguration in Ihrem ~/.ssh/config statt mit Befehlszeilenparametern vornehmen möchten, können Sie etwas wie

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

ausprobieren. Denken Sie daran, dass die Firewall des entfernten Hosts Verbindungen zu 8080 zulassen muss, und stellen Sie sicher, dass die Option GatewayPorts Ihrer /etc/ssh/sshd-Konfiguration nicht auf no gesetzt ist