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

Hoe maak ik een ssh tunnel open voor het publiek?

Nou, terugverwijzend naar deze vraag, ik voer het commando

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

uit op een Mac. Maar de poort die getunneld wordt, werkt niet publiekelijk. Ik voer zo'n commando uit om ervoor te zorgen dat de lokale poort geopend kan worden op de computer op afstand. En het werkt wel bij het openen van de poort op localhost op de computer op afstand, maar wanneer ik vanaf mijn lokale computer toegang probeer te krijgen tot het publieke IP-adres van de computer op afstand, lijkt de poort niet open te zijn. Hoe kan ik de tunnel openbaar maken op het IP zodat iedereen er toegang toe heeft?

EDIT: Het lijkt erop dat de remote kant alleen op localhost bindt in plaats van op alle interfaces.

EDIT 2: De client is Mac OS X 10.6 en de server is Linux Mint, maar ze zijn allebei OpenSSH.

Antwoorden (7)

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

Als u de man page voor ssh bekijkt, zult u zien dat de syntaxis voor -R luidt:

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

Wanneer `bindaddress`_ is weggelaten (zoals in uw voorbeeld), is de poort alleen gebonden aan de loopback interface. Om hem aan alle interfaces te laten binden, gebruik je

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

of

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

of

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

De eerste versie bindt aan alle interfaces afzonderlijk. De tweede versie creëert een algemene IPv4-only binding, wat betekent dat de poort toegankelijk is op alle interfaces via IPv4. De derde versie is waarschijnlijk technisch gelijkwaardig aan de eerste, maar creëert wederom slechts een enkele binding naar ::, wat betekent dat de poort toegankelijk is via IPv6 en via IPv4 via IPv4-gemapte IPv6 adressen (werkt niet op Windows, OpenBSD).   (U hebt de aanhalingstekens nodig omdat [::] anders als een glob zou kunnen worden geïnterpreteerd.)

Merk op dat als u OpenSSH sshd server gebruikt, de GatewayPorts optie van de server moet zijn ingeschakeld (ingesteld op yes of clientspecified) om dit te laten werken (controleer bestand /etc/ssh/sshd_config op de server). Anders (standaardwaarde voor deze optie is no), zal de server altijd forceren dat de poort alleen aan de loopback interface wordt gebonden.

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

Edit:

-g werkt voor lokale forwarded poorten, maar wat u wilt is een reverse/remote forwarded poort, wat anders is.

Wat u wilt is deze .

In wezen, op example.com, stel GatewayPorts=clientspecified in /etc/ssh/sshd_config.

— vorig (onjuist) antwoord —

Gebruik de -g optie. Van ssh’s man page:

-g Allows remote hosts to connect to local forwarded ports.
15
15
15
2013-10-29 12:09:40 +0000

Hier is mijn antwoord voor de voltooiing:

Ik eindigde met het gebruik van ssh -R ... voor tunneling, en het gebruik van socat daarbovenop voor het omleiden van netwerkverkeer naar 127.0.0.1:

tunnel gebonden aan 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

Andere optie is om daar bovenop een local-only tunnel te doen, maar ik vind dit veel langzamer

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

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

U kunt ook een dubbele forward gebruiken als u /etc/ssh/sshd_config niet wilt of kunt veranderen.

Eerst forward naar tijdelijke poort (bijv. 10080) op loopback apparaat op de machine-op-afstand, gebruik dan local forward daar om poort 10080 om te leiden naar 80 op alle interfaces:

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

Gebruik de “gateway ports” optie.

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

Om dat te gebruiken, moet u waarschijnlijk “GatewayPorts yes” toevoegen aan de /etc/ssh/sshd_config van uw server.

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

Jump hosts ](https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_–_Passing_Through_a_Gateway_or_Two) zijn een vrij recente toevoeging aan OpenSSH. Dit vereist SSH toegang tot de tussenpersoon, maar zou moeten werken zonder bijkomende configuratie.

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

Dit commando instrueert SSH om eerst verbinding te maken met root@example.com, en dan, vanaf die machine, een verbinding te starten naar poort 8080 op localhost (d.w.z., de poort die getunneld is van de jump host naar de remote host) onder de gebruikersnaam remoteuser.

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

Als je de configuratie in je ~/.ssh/config wilt zetten in plaats van commandoregelparameters te gebruiken, kun je iets proberen als

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Vergeet niet om de firewall van je host op afstand verbindingen naar 8080 te laten toestaan en zorg ervoor dat de GatewayPorts optie van je /etc/ssh/sshd configuratie niet op no staat ingesteld.