risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come funziona il tunneling SSH inverso?

A quanto ho capito, i firewall (presupponendo le impostazioni predefinite) negano tutto il traffico in entrata che non ha traffico in uscita corrispondente precedente.

Sulla base di Inversione di una connessione ssh e SSH Tunneling Made Easy , il tunneling SSH inverso può essere utilizzato per aggirare le fastidiose restrizioni del firewall.

Vorrei eseguire i comandi Shell su una macchina remota. La macchina remota ha il proprio firewall ed è protetta da un firewall aggiuntivo (router). Ha un indirizzo IP come 192.168.1.126 (o qualcosa di simile). Non sono protetto da un firewall e conosco l'indirizzo IP della macchina remota visto da Internet (non l'indirizzo 192.168.1.126). Inoltre, posso chiedere a qualcuno di eseguire prima ssh (something) come root sul computer remoto.

Qualcuno potrebbe spiegarmi, passo dopo passo, come funziona il tunneling SSH inverso per aggirare i firewall (i firewall delle macchine locali e remote e il firewall aggiuntivo tra di loro)?

Qual è il ruolo degli switch (-R, -f, -L, -N)?

376
Ali

Adoro spiegare questo tipo di cose attraverso la visualizzazione. :-)

Pensa alle tue connessioni SSH come a tubi. Grandi tubi Normalmente, raggiungi questi tubi per far funzionare Shell su un computer remoto. Shell funziona in un terminale virtuale (tty). Ma conosci già questa parte.

Pensa al tuo tunnel come a un tubo all'interno di un tubo. Hai ancora la grande connessione SSH, ma l'opzione -L o -R ti consente di impostare un tubo più piccolo al suo interno.

Ogni tubo ha un inizio e una fine. Il big tube, la tua connessione SSH, è iniziato con il tuo client SSH e finisce sul server SSH a cui ti sei connesso. Tutti i tubi più piccoli hanno gli stessi endpoint, tranne per il fatto che il ruolo di "inizio" o "fine" è determinato dal fatto che tu abbia usato -L o -R (rispettivamente) per crearli.

(Non lo hai detto, ma suppongo che il computer "remoto" che hai citato, quello dietro il firewall, possa accedere a Internet usando Network Address Translation (NAT). Questo è un po 'importante, quindi si prega di correggere questo assunto se è falso.)

Quando si crea un tunnel, si specifica un indirizzo e una porta su cui risponderà e un indirizzo e una porta a cui verrà consegnato. Il -L L'opzione indica al tunnel di rispondere sul lato locale del tunnel (l'host che esegue il client). Il -R L'opzione dice al tunnel di rispondere sul lato remoto (il server SSH).

ssh tunnel directions

Quindi ... Per poter accedere a SSH da Internet in una macchina dietro un firewall, è necessario che la macchina in questione apra una connessione SSH al mondo esterno e includa un -R tunnel il cui punto di "ingresso" è il lato "remoto" della sua connessione.

Dei due modelli mostrati sopra, vuoi quello a destra.

Dall'host con firewall:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

Questo dice al tuo cliente di stabilire un tunnel con un -Remote entry point. Tutto ciò che si collega alla porta 22222 all'estremità del tunnel raggiungerà effettivamente la "porta localhost 22", dove "localhost" si trova dalla prospettiva del punto di uscita del tunnel (cioè il client ssh).

Le altre opzioni sono:

  • -f dice a ssh di mettersi in background dopo l'autenticazione, quindi non è necessario rimanere in esecuzione eseguendo qualcosa sul server remoto affinché il tunnel rimanga attivo.
  • -N dice che vuoi una connessione SSH, ma in realtà non vuoi eseguire alcun comando remoto. Se tutto ciò che stai creando è un tunnel, l'inclusione di questa opzione consente di risparmiare risorse.
  • -T disabilita l'allocazione pseudo-tty, il che è appropriato perché non stai provando a creare una Shell interattiva.

Ci sarà una sfida con la password a meno che tu non abbia impostato le chiavi DSA o RSA per un accesso senza password.

Nota che si raccomanda vivamente di utilizzare un account usa e getta (non il tuo login) che hai impostato solo per questo tunnel/cliente/server.

Ora, da Shell su yourpublichost , stabilire una connessione all'Host con firewall attraverso il tunnel:

ssh -p 22222 [email protected]

Riceverai una sfida chiave per l'host, poiché probabilmente non hai mai colpito questo host prima. Quindi riceverai una richiesta di password per l'account username (a meno che tu non abbia impostato le chiavi per l'accesso senza password).

Se accederai regolarmente a questo host, puoi anche semplificare l'accesso aggiungendo alcune righe al tuo ~/.ssh/config file:

Host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

Regola remotehostname e remoteusername per adattarlo. Il campo remoteusername deve corrispondere al tuo nome utente sul server remoto, ma remotehostname può essere qualsiasi nome host adatto a te, non deve corrispondere a nulla di risolvibile.

Guarda anche:

433
ghoti

Ho disegnato alcuni schizzi

La macchina, in cui viene digitato il comando ssh tunnel, si chiama "your Host".

ssh tunnel starting from local


ssh tunnel starting from remote

Introduzione

  1. local: -L Specifies that the given port on the local (client) Host is to be forwarded to the given Host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHost Significa: connettiti con ssh a connectToHost e inoltra tutti i tentativi di connessione a localsourcePort alla porta onPort sul macchina chiamata forwardToHost, che può essere raggiunta dalla macchina connectToHost.

  2. remoto: -R Specifies that the given port on the remote (server) Host is to be forwarded to the given Host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHost Significa: connettiti con ssh a connectToHost e inoltra tutti i tentativi di connessione a remotosourcePort alla porta onPort sul macchina chiamata forwardToHost, che può essere raggiunta dalla tua macchina locale.

Opzioni aggiuntive

  • -f Dice a ssh di autodidattarsi dopo che si è autenticato, quindi non devi rimanere in esecuzione eseguendo qualcosa sul server remoto perché il tunnel rimanga attivo.
  • -N Dice che vuoi una connessione SSH, ma in realtà non vuoi eseguire alcun comando remoto. Se tutto ciò che stai creando è un tunnel, l'inclusione di questa opzione consente di risparmiare risorse.
  • -T Disabilita l'allocazione pseudo-tty, il che è appropriato perché non stai provando a creare una Shell interattiva.

Il tuo esempio

La terza immagine rappresenta questo tunnel. Ma il computer blu chiamato "il tuo Host" rappresenta il computer in cui qualcuno avvia il tunnel ssh, in questo caso la macchina con firewall .

Quindi, chiedi a qualcuno di avviare una connessione tunnel ssh alla tua macchina. Il comando dovrebbe sostanzialmente apparire come

ssh -R 12345:localhost:22 YOURIP

Ora il tunnel è aperto. Ora puoi connetterti via ssh alla macchina firewall attraverso il tunnel con il comando

ssh -p 12345 localhost

che si collegherà al tuo localhost (il tuo computer) sulla porta 12345, ma la porta 12345 viene inoltrata attraverso il tunnel alla porta 22 dell'host locale del computer firewall (ad es. il computer firewall stesso).

389
erik

tunneling ssh funziona utilizzando la connessione ssh già stabilita per l'invio di traffico aggiuntivo.

Quando ti connetti a un server remoto, di solito hai solo 1 canale per la normale interazione dell'utente (o 3 canali se consideri STDIN/STDOUT/STDERR separati). In qualsiasi momento, il processo ssh locale o remoto può aprire canali aggiuntivi sulla connessione esistente. Questi canali quindi inviano/ricevono il traffico del tunnel. Quando si invia o si riceve traffico, il processo ssh dice semplicemente "questo traffico è per foobar di canale".

Funziona essenzialmente così:

  1. Dite a ssh di iniziare l'ascolto sulla porta XXXX e che tutto il traffico ricevuto dovrebbe essere tunnelato e quindi impostato su Y.Y.Y.Y sulla porta ZZZZ.
  2. L'ssh locale inizia l'ascolto sulla porta XXXX (generalmente su 127.0.0.1, ma può essere modificato).
  3. Alcune applicazioni aprono una connessione alla porta XXXX sul computer locale.
  4. Ssh locale apre un canale su ssh remoto e dice "qualsiasi traffico su questo canale va a Y.Y.Y.Y: ZZZZ
  5. L'ssh remoto si collega a Y.Y.Y.Y: ZZZZ e restituisce "OK, il canale è aperto"
  6. Ora tutto il traffico inviato lungo la connessione alla porta XXXX sul computer locale viene inoltrato da ssh a Y.Y.Y.Y: ZZZZ.

Questo processo è identico per il tunneling sia in avanti che indietro (basta scambiare le parole "locale" e "remoto" nella procedura sopra descritta). Entrambe le parti possono avviare il tunnel. Non è nemmeno necessario quando si avvia ssh per la prima volta. Puoi aprire i tunnel mentre ssh è già in esecuzione (vedi ESCAPE CHARACTERS, in particolare ~C).

Per il ruolo di -R, -f, -L, e -N, dovresti davvero consultare la pagina man, ti dà la migliore spiegazione possibile. Ma citerò -R e -L.
-R dice a ssh remoto di ascoltare le connessioni e che ssh locale dovrebbe connettersi alla destinazione reale. -L dice a ssh locale di ascoltare le connessioni e che ssh remoto dovrebbe connettersi alla destinazione reale.

Nota, questa è una descrizione molto rozza, ma dovrebbe darti abbastanza informazioni per sapere cosa sta succedendo

24
Patrick

Questo è spiegato nel manuale SSH, in particolare le differenze tra -L (locale) e -R (a distanza).


-L

-L [bind_address:]port:Host:hostport

Specifica che la porta fornita sull'host (client) locale deve essere inoltrata all'host e alla porta dati sul lato remoto .

Funziona assegnando un socket per ascoltare la porta sul lato locale, facoltativamente associato al bind_address specificato.

Ogni volta che viene stabilita una connessione a questa porta, la connessione viene inoltrata sul canale protetto e viene stabilita una connessione a Host port hostport dalla macchina remota .

Il seguente esempio esegue il tunneling di una IRC dal computer client 127.0.0.1 (localhost) utilizzando la porta 1234 al server remoto server.example.com:

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

Notare la -f opzione sfondi ssh e il comando remoto sleep 10 viene specificato per consentire un periodo di tempo per l'avvio del servizio da sintonizzare.

Esempio:

ssh `-N` -L 22000:localhost:11000 remote.server.com
  • -N Dopo esserti connesso, resta lì (non riceverai un prompt Shell)

    Non eseguire un comando remoto.

  • -L 22000 La connessione avrà origine sulla porta 22000 della tua macchina personale [~ # ~] l [~ # ~] ocal

  • localhost:11000 - remote.server.com si assicurerà che l'altra estremità del tunnel sia localhost, porta 11000

ssh -N -L 22000:192.168.1.2:11000 remote.server.com

Fonte: na guida illustrata, tutorial, come fare, su tunneling ssh .


-R

-R [bind_address:]port:Host:hostport

Specifica che la porta specificata sull'host (server) remoto deve essere inoltrata all'host e alla porta dati sul lato locale .

Funziona assegnando un socket per ascoltare port sul lato remoto e ogni volta che viene stabilita una connessione a questa porta, la connessione viene inoltrata sul canale sicuro e viene stabilita una connessione a Host port hostport dal computer locale .

Esempio:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N Dopo esserti connesso, resta lì (non riceverai un prompt Shell)

    Non eseguire un comando remoto.

  • -R 22000 La connessione avrà origine sulla porta 22000 del computer emote [~ # ~] r [~ # ~] (in questo caso, remoto. server.com)

  • localhost:11000 il tuo computer personale locale assicurerà che l'altra estremità del tunnel sia localhost, porta 11000

ssh -N -R 22000:localhost:11000 remote.server.com

Fonte: na guida illustrata, tutorial, come fare, su tunneling ssh .

18
kenorb