Tunneling della porta inversa


59

Domani devo mostrare a qualcuno un sito Web in esecuzione sul mio computer locale. Normalmente lo farei port forwarding sul mio router locale ma grazie al guasto dell'hardware e alla sua sostituzione terribile, il mio router attuale non mi permette di fare il port forwarding.

Così bloccato da questo ritardo e non volendo trasferire tutto su un server adeguato, ho avuto un'idea folle: posso semplicemente inoltrare la mia porta a un server esterno su SSH?

Ho già eseguito il tunneling delle porte, ma di solito lo faccio nel modo giusto:

  • Mi collego a una casella remota e chiedo che la porta 12345 venga visualizzata sul mio computer locale sulla porta 12345.
  • Avvio qualcosa su P12345 sul computer remoto
  • Posso accedervi tramite localhost: 12345

Cosa voglio fare:

  • Collegati a un PC remoto e chiedi che il suo P12345 locale recuperi cose dal mio P12345 locale (sul tunnel)
  • Avvio qualcosa sul mio computer locale su P12345
  • Altre persone possono accedere al telecomando: 12345 e vedere il mio localhost: 12345

Risposte:


97

Il comando per l'inoltro della porta 80 dal computer locale ( localhost) all'host remoto sulla porta 8000 è:

ssh -R 8000:localhost:80 oli@remote-machine

Ciò richiede una modifica aggiuntiva sul server SSH, aggiungere le righe a /etc/ssh/sshd_config:

Match User oli
   GatewayPorts yes

Successivamente, ricaricare la configurazione eseguendo il server sudo reload ssh.

L'impostazione GatewayPorts yesfa sì che SSH associ la porta 8000 all'indirizzo jolly, quindi diventa disponibile all'indirizzo pubblico di remote-machine( remote-machine:8000).

Se è necessario disporre dell'opzione per non associare tutto sull'indirizzo jolly, passare GatewayPorts yesa GatewayPorts clientspecified. Poiché si sshassocia all'indirizzo di loopback per impostazione predefinita, è necessario specificare un vuoto bind_addressper l'associazione dell'indirizzo jolly:

ssh -R :8000:localhost:80 oli@remote-machine

Il :prima 8000è obbligatorio se GatewayPortsè impostato su clientspecifiede si desidera consentire l'accesso pubblico a remote-machine:8000.

Estratti manuali pertinenti:

ssh (1)

-R [indirizzo_indirizzamento:] porta: host: hostport
Specifica che la porta specificata sull'host remoto (server) deve essere inoltrata all'host e alla porta indicati sul lato locale. Funziona assegnando un socket per ascoltare la porta sul lato remoto e ogni volta che viene stabilita una connessione a questa porta, la connessione viene inoltrata sul canale protetto e viene stabilita una connessione per ospitare l'hostport della porta dal computer locale. Per impostazione predefinita, il socket di ascolto sul server sarà associato solo all'interfaccia di loopback. Questo può essere sovrascritto specificando un bind_address. Un bind_address vuoto o l'indirizzo '*' indica che il socket remoto deve essere in ascolto su tutte le interfacce. La specifica di bind_address remoto avrà esito positivo solo se l'opzione GatewayPorts del server è abilitata (vedere sshd_config (5)).

sshd_config (5)

GatewayPorts
Specifica se agli host remoti è consentito connettersi alle porte inoltrate per il client. GatewayPorts può essere utilizzato per specificare che sshd dovrebbe consentire il port forwarding remoto da associare a indirizzi non loopback, permettendo così ad altri host di connettersi. L'argomento potrebbe essere "no" per forzare i port forwarding remoti a essere disponibili solo per l'host locale, "yes" per forzare i port forwarding remoti a legarsi all'indirizzo jolly o "clientpecified" per consentire al client di selezionare l'indirizzo a cui l'inoltro è vincolato. L'impostazione predefinita è "no".

Guarda anche:


7
GatewayPortsera il proiettile magico qui. Mi piace il fatto che tu abbia trovato una versione che può permettermi di limitare questa tecnica abbastanza potente a determinati utenti.
Oli

1
Ciò che mi confondeva era che GatewayPorts doveva essere impostato sulla macchina che eseguiva l'effettivo comando ssh per avviare il tunnel inverso (locale). Nella mia mente era in qualche modo più logico che l'altra estremità (remota) si occupasse di dove accettare le connessioni, poiché è lì che ci si collega e da cui si viene reindirizzati. Mi ci sono voluti anni per aggirare quello.
Ars Magika,

2
@ArsMagika Non sono sicuro di capirti. GatewayPorts deve essere impostato sul server SSH, non sul computer locale che esegue il sshcomando. Configura se altri client possono comunicare con le porte inoltrate sul server.
Lekensteyn,

Unico inconveniente di questa soluzione: si perde la capacità di determinare l'indirizzo IP del client nel registro di accesso del web server. Qualche modo per risolvere anche questo fastidio?
Twonky,

@Twonky Se non hai bisogno di conoscere l'indirizzo IP esatto del client (solo che era remoto e non "localhost") e il tuo server locale è in ascolto sull'indirizzo jolly (cioè accettando connessioni da qualsiasi indirizzo), quindi potresti provare a inoltrare a -R :8000:127.0.1.1:80(o qualsiasi altro 127.x.x.xindirizzo). Altrimenti, no, non sarai in grado di imparare l'indirizzo IP remoto.
Lekensteyn,

14

Se il server ha GatewayPorts no, è possibile ottenere lo stesso risultato eseguendo ssh -g -L 8001:localhost:8000 oli@remote-machinesul server dopo aver eseguito il ssh -Rcomando sul client. Ciò renderà la porta di loopback 8000 sul server accessibile su tutte le interfacce sulla porta 8001.

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.