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

Come rendere il tunnel ssh aperto al pubblico?

Bene, riferendomi a questa domanda, sto eseguendo il comando

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

su un Mac. Eppure la porta che viene tunnelata non funziona pubblicamente. Sto eseguendo tale comando per fare in modo che la porta locale possa essere aperta sul computer remoto. E funziona quando si apre la porta su localhost sul computer remoto, ma quando provo ad accedere all'indirizzo IP pubblico del computer remoto dal mio computer locale la porta non sembra essere aperta. Come potrei rendere il tunnel pubblico sull'IP per chiunque possa accedere?

EDIT: Sembra che il lato remoto si leghi solo a localhost invece che a tutte le interfacce.

EDIT 2: Il client è Mac OS X 10.6 e il server è Linux Mint, ma sono entrambi OpenSSH.

Risposte (7)

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

Se controllate la pagina man di ssh, troverete che la sintassi per -R dice:

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

Quando `bindaddress`_ è omesso (come nel tuo esempio), la porta è legata solo all'interfaccia di loopback. Per farla legare a tutte le interfacce, usa

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

o

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

o

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

La prima versione si lega a tutte le interfacce individualmente. La seconda versione crea un binding generale IPv4-only, il che significa che la porta è accessibile su tutte le interfacce tramite IPv4. La terza versione è probabilmente tecnicamente equivalente alla prima, ma di nuovo crea solo un singolo bind a ::, il che significa che la porta è accessibile via IPv6 nativamente e via IPv4 attraverso indirizzi IPv6 mappati IPv4 (non funziona su Windows, OpenBSD).   (Hai bisogno delle virgolette perché altrimenti [::] potrebbe essere interpretato come un glob.)

Nota che se usi OpenSSH sshd server, l'opzione GatewayPorts del server deve essere abilitata (impostata su yes o clientspecified) perché questo funzioni (controlla il file /etc/ssh/sshd_config sul server). Altrimenti (il valore predefinito per questa opzione è no), il server forzerà sempre la porta ad essere legata solo sull'interfaccia di loopback.

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

Edit:

-g funziona per le porte inoltrate locali, ma quello che vuoi è una porta inoltrata inversa/remota, che è diversa.

Quello che vuoi è questo .

Essenzialmente, su example.com, imposta GatewayPorts=clientspecified in /etc/ssh/sshd_config.

— risposta precedente (errata) —

Usa l'opzione -g. Dalla pagina man di ssh:

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

Ecco la mia risposta per il completamento:

Ho finito per usare ssh -R ... per il tunneling, e usando socat sopra questo per reindirizzare il traffico di rete a 127.0.0.1:

tunnel legato a 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

L'altra opzione è quella di fare un tunnel solo locale, ma lo trovo molto più lento

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

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

Potete anche usare un doppio inoltro se non volete o potete cambiare /etc/ssh/sshd\fig.

Prima inoltra alla porta temporanea (ad esempio 10080) sul dispositivo di loopback sulla macchina remota, poi usa l'inoltro locale per reindirizzare la porta 10080 a 80 su tutte le interfacce:

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

Usa l'opzione “porte gateway”.

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

Per poterlo usare, probabilmente dovrete aggiungere “GatewayPorts yes” a /etc/ssh/sshd_config del vostro server.

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

Jump hosts sono un'aggiunta abbastanza recente a OpenSSH. Questo richiede l'accesso SSH all'intermediario, ma dovrebbe funzionare senza ulteriori configurazioni.

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

Questo comando istruisce SSH a connettersi prima a root@example.com, e poi, da quella macchina, ad iniziare una connessione alla porta 8080 a localhost (cioè, la porta che è tunnelata dall'host di salto all'host remoto) sotto il nome utente remoteuser.

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

Se vuoi mettere la configurazione nel tuo ~/.ssh/config invece di usare parametri della linea di comando, puoi provare qualcosa come

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Ricorda di avere il firewall del tuo host remoto che permetta connessioni a 8080 e assicurati che l'opzione GatewayPorts del tuo config /etc/ssh/sshd non sia impostata su no