Come rendere pubblico il tunnel ssh?


174

Bene, riferendomi a questa domanda, sto eseguendo il comando

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

su un Mac. Tuttavia il porto che viene scavato non funziona pubblicamente. Sto eseguendo un comando del genere per farlo in modo che la porta locale possa essere aperta sul computer remoto. E funziona quando apro 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 renderei pubblico il tunnel sull'IP per consentire a chiunque di accedervi?

EDIT: sembra che il lato remoto si leghi solo su localhost invece che su tutte le interfacce.

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


Cosa significa IP pubblico? Se si sta tentando di connettersi a un computer locale tramite il router e tramite Internet, la maggior parte dei router non consentirà tale loopback.
harrymc,

Risposte:


351

Se controlli la pagina man per ssh, scoprirai che la sintassi per -Rlegge:

-R [ indirizzo_indirizzamento :] porta : host : hostport

Quando bind_addressviene omesso (come nell'esempio), la porta è associata solo all'interfaccia di loopback. Per associarlo a tutte le interfacce, utilizzare

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 singolarmente. La seconda versione crea un bind generale solo IPv4, il che significa che la porta è accessibile su tutte le interfacce tramite IPv4. La terza versione è probabilmente tecnicamente equivalente alla prima, ma crea nuovamente un solo bind ::, il che significa che la porta è accessibile tramite IPv6 in modo nativo e tramite IPv4 tramite indirizzi IPv6 mappati su IPv4 (non funziona su Windows, OpenBSD) . (Hai bisogno delle virgolette perché [::]altrimenti potrebbero essere interpretate come glob.)

Si noti che se si utilizza il sshdserver OpenSSH , l' GatewayPortsopzione del server deve essere abilitata (impostata su yeso clientspecified) affinché funzioni (controllare il file /etc/ssh/sshd_configsul server). Altrimenti (il valore predefinito per questa opzione è no), il server imporrà sempre che la porta sia vincolata solo sull'interfaccia di loopback.


12
Oh mio Dio, ha funzionato !!!!! L'ho fatto esattamente 1 milione di volte !! Ho appena dimenticato che *in bash fornirà file e di cui avevo bisogno\*
Trevor Rudolph

4
Sì, è esattamente per questo che preferisco sempre 0.0.0.0- è solo IPv4, ma lo farà per la maggior parte del tempo :)
Stefan Seidel,

34
GatewayPorts sì ha risolto il mio problema.
Sunry,

4
GatewayPorts = yes (sul telecomando sshd config) risolto anche per me
Phil_1984_

3
"GatewayPorts yes" ha reso la mia giornata, grazie @StefanSeidel
karser,

37

Modificare:

-g funziona per le porte inoltrate locali, ma ciò che si desidera è una porta inoltrata inversa / remota, che è diversa.

Quello che vuoi è questo .

Essenzialmente, il example.com, impostare GatewayPorts=clientspecifiedin /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.

non sembra funzionare ... si avvia ma non riesco a collegarmi in remoto
Trevor Rudolph,

2
Prova a correre netstat -elnptda un tty separato per capire quali porte sono associate a quale indirizzo. Senza -g, una porta dovrebbe essere vincolata a 127.0.0.1:PORT. Con -g, dovrebbe essere associato 0.0.0.0:PORT, il che lo rende accessibile da remoto.
istantanea


2
GatewayPorts=clientspecifiedoppureGatewayPorts clientspecified
Trevor Rudolph,

e lo aggiungo al client o al telecomando?
Trevor Rudolph,

14

Ecco la mia risposta per il completamento:

Ho finito per usare il ssh -R ...tunneling e usare socatquello per reindirizzare il traffico di rete a 127.0.0.1:

tunnel associato 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

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

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


Mi piace il fatto che non ho a che fare con la configurazione sshd e che posso fare tutto senza sudo. Inoltre apprendo che esiste socat. Grazie!
Brutus Cat

+ su vai bene signore. Ho provato a dire a ssh di legare a 0.0.0.0 senza successo .. poi ho visto la sintassi *, ho provato, senza dadi. Immagino che potrebbe essere una sorta di funzionalità di sicurezza su sshd config o qualcosa che non lo consente. Finalmente ho visto questo post e ha socatfunzionato alla grande. Super utile, mettendolo nella mia tasca posteriore;]
Jaime

10

Puoi anche usare un doppio forward se non puoi o puoi cambiare / etc / ssh / sshd_config.

Prima inoltra alla porta temporanea (ad es. 10080) sul dispositivo di loopback sulla macchina remota, quindi usa l'inoltro locale lì per reindirizzare la porta da 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"

1
Questo in realtà funziona per aggirare le regole di inoltro!
Michael Schubert,

Adoro questa soluzione. Ottima soluzione quando non vuoi cambiare la configurazione sulla macchina
Grezzo,

8

Utilizzare l'opzione "porte gateway".

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

Per usarlo, probabilmente dovrai aggiungere " GatewayPorts yes" al tuo server /etc/ssh/sshd_config.


In realtà ha funzionato. Quello che faccio è che uso un'istanza EC2 come server d'inoltro sul mio server REST. In questo modo, non ho bisogno di inserire il mio server nella DMZ e non ho bisogno di un IP pubblico. Abbastanza divertente, con la prima istanza di EC2 che ho creato, ssh -R remote_port: localhost: la porta xxx @ ec2xxx ha funzionato bene ma poi ho dovuto creare un'altra istanza in seguito per qualche motivo e da quel momento in poi ho sempre ricevuto: connessione rifiutato. Ho usato tcpdump per vedere cosa stavo ottenendo e non c'erano molte informazioni. -g plus GatewayPorts sì, ha fatto il trucco.
ET,

1

I Jump Host sono un'aggiunta abbastanza recente a OpenSSH. Ciò richiede l'accesso SSH all'intermedio, ma dovrebbe funzionare senza ulteriore configurazione.

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

Questo comando indica a SSH di connettersi prima a root@example.com, quindi, da quella macchina, per avviare una connessione alla porta 8080 localhost(ovvero, la porta che è tunnel dall'host di salto all'host remoto) sotto il remoteusernome utente.


0

Se desideri inserire la configurazione in te ~/.ssh/configanziché utilizzare i parametri della riga di comando, puoi provare qualcosa del genere

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Ricorda di avere il firewall dell'host remoto che consente le connessioni a 8080 e assicurati che l' GatewayPortsopzione di /etc/ssh/sshdconfigurazione non sia impostata suno

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.