Introduzione

Il tunneling SSH o il port forwarding SSH è un metodo per creare una connessione SSH crittografata tra un client e una macchina server attraverso la quale è possibile inoltrare le porte dei servizi.

L'inoltro SSH è utile per trasportare dati di rete di servizi che utilizzano un protocollo non crittografato, come VNC o FTP, accedere a contenuti con restrizioni geografiche o bypassare i firewall intermedi. Fondamentalmente, è possibile inoltrare qualsiasi porta TCP e tunnelizzare il traffico su una connessione SSH sicura.

Esistono tre tipi di port forwarding SSH:

  • Local Port Forwarding (locale). - Inoltra una connessione dall'host client all'host del server SSH e quindi alla porta host di destinazione.
  • Remote Port Forwarding (remoto). - Inoltra una porta dall'host del server all'host del client e quindi alla porta dell'host di destinazione.
  • Dynamic Port Forwarding (dinamico). - Crea un server proxy SOCKS che consente la comunicazione attraverso una gamma di porte.

In questo articolo, parleremo di come impostare tunnel SSH crittografati locali, remoti e dinamici.

Local Port Forwarding

Il port forwarding locale consente di inoltrare una porta sul computer locale (client ssh) a una porta sul computer remoto (server ssh), che viene quindi inoltrata a una porta sul computer di destinazione.

In questo tipo di inoltro il client SSH è in ascolto su una determinata porta e esegue il tunneling di qualsiasi connessione a quella porta sulla porta specificata sul server SSH remoto, che quindi si connette a una porta sul computer di destinazione. La macchina di destinazione può essere il server SSH remoto o qualsiasi altra macchina.

Il port forwarding locale viene utilizzato principalmente per connettersi a un servizio remoto su una rete interna come un database o un server VNC.

In Linux, macOS e altri sistemi Unix per creare un port forwarding locale utilizzano l'opzione -L al client ssh:

ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [[email protected]]SSH_SERVER

Le opzioni utilizzate sono le seguenti:

  • [LOCAL_IP:]LOCAL_PORT- L'IP della macchina locale e il numero di porta. Quando LOCAL_IP viene omesso, il client ssh si collega a localhost.
  • DESTINATION:DESTINATION_PORT - L'IP o il nome host e la porta della macchina di destinazione.
  • [[email protected]]SERVER_IP - L'utente SSH remoto e l'indirizzo IP del server.

È possibile utilizzare qualsiasi numero di porta maggiore di 1024 come LOCAL_PORT. Le porte con un numero inferiore a 1024 sono porte privilegiate e possono essere utilizzate solo da root. Se il server SSH è in ascolto su una porta diversa da 22 (impostazione predefinita), utilizzare l'opzione -p [PORT_NUMBER].

Il nome host di destinazione deve essere risolvibile dal server SSH.

Supponiamo che tu abbia un server di database MySQL in esecuzione sul computer db001.host su una rete interna (privata), sulla porta 3306 che è accessibile dal computer pub001.host e che desideri connetterti utilizzando il client mysql del computer locale al server del database. Per fare ciò puoi inoltrare la connessione in questo modo:

ssh -L 3336:db001.host:3306 [email protected]

Una volta eseguito il comando, ti verrà chiesto di inserire la password dell'utente SSH remoto. Dopo averlo inserito, si accederà al server remoto e verrà stabilito il tunnel SSH. È consigliabile impostare un'autenticazione basata su chiave SSH e connettersi al server senza immettere una password.

Ora, se si punta al client del database della macchina locale 127.0.0.1:3336, la connessione verrà inoltrata al server MySQL db001.host:3306 attraverso la macchina pub001.host che fungerà da server intermedio.

È possibile inoltrare più porte a più destinazioni in un unico comando ssh. Ad esempio, hai un altro server database MySQL in esecuzione sulla macchina db002.host e vuoi connetterti ad entrambi i server dal tuo client locale che avresti eseguito:

ssh -L 3336:db001.host:3306 3337:db002.host:3306 [email protected]

Per connettersi al secondo server si utilizzerà 127.0.0.1:3337.

Quando l'host di destinazione è uguale al server SSH invece di specificare l'IP host host o il nome host di destinazione che è possibile utilizzare localhost.

Supponi di dover connetterti a una macchina remota tramite VNC che gira sullo stesso server e non è accessibile dall'esterno. Il comando che useresti è:

ssh -L 5901:127.0.0.1:5901 -N -f [email protected]

L'opzione -f indica al comando ssh di essere eseguito in background e -N di non eseguire un comando remoto. Stiamo usando localhost perché VNC e il server SSH sono in esecuzione sullo stesso host.

In caso di problemi durante l'impostazione del tunneling, verificare la configurazione del server SSH remoto e assicurarsi che AllowTcpForwarding non sia impostato su no. Per impostazione predefinita, l'inoltro è consentito.

Remote Port Forwarding

Il port forwarding remoto è l'opposto del port forwarding locale. Consente di inoltrare una porta sul computer remoto (server ssh) a una porta sul computer locale (client ssh), che viene quindi inoltrata a una porta sul computer di destinazione.

In questo tipo di inoltro il server SSH è in ascolto su una determinata porta e esegue il tunneling di qualsiasi connessione a quella porta sulla porta specificata sul client SSH locale, che quindi si connette a una porta sul computer di destinazione. La macchina di destinazione può essere la macchina locale o qualsiasi altra macchina.

In Linux, macOS e altri sistemi Unix per creare un port forwarding si utilizza l'opzione -R con il comando ssh:

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [[email protected]]SSH_SERVER

Le opzioni utilizzate sono le seguenti:

  • [REMOTE:]REMOTE_PORT- L'IP e il numero di porta sul server SSH remoto. Il vuoto REMOTE indica che il server SSH remoto si collegherà a tutte le interfacce.
  • DESTINATION:DESTINATION_PORT - L'IP o il nome host e la porta della macchina di destinazione.
  • [[email protected]]SERVER_IP - L'utente SSH remoto e l'indirizzo IP del server.

Il port forwarding locale è usato principalmente per dare accesso a un servizio interno a qualcuno dall'esterno.

Supponiamo che tu stia sviluppando un'applicazione Web sul tuo computer locale e desideri mostrare un'anteprima ai tuoi colleghi sviluppatori. Non hai un IP pubblico, quindi l'altro sviluppatore non può accedere all'applicazione via Internet.

Se si ha accesso a un server SSH remoto, è possibile impostare un port forwarding remoto come segue:

ssh -L 8080:127.0.0.1:3000 -N -f [email protected]

Il comando sopra renderà il server ssh in ascolto sulla porta 8080 e crea un tunnel di tutto il traffico da questa porta al tuo computer locale sulla porta 3000.

Ora i tuoi colleghi sviluppatori possono digitare the_ssh_server_ip:8080 nel proprio browser e visualizzare l'anteprima della tua applicazione.

In caso di problemi con la configurazione del port forwarding remoto assicurarsi che GatewayPorts sia impostato su yes nella configurazione del server SSH remoto.

Dynamic Port Forwarding

Il port forwarding dinamico consente di creare un socket sul computer locale (client ssh) che funge da server proxy SOCKS. Quando un client si connette a questa porta, la connessione viene inoltrata alla macchina remota (server ssh), che viene quindi inoltrata a una porta dinamica sulla macchina di destinazione.

In questo modo, tutte le applicazioni che utilizzano il proxy SOCKS si collegheranno al server SSH e il server inoltrerà tutto il traffico alla sua destinazione effettiva.

In Linux, macOS e altri sistemi Unix per creare un port forwarding dinamico (SOCKS) passano l'opzione -D al client ssh:

ssh -R [LOCAL_IP:]LOCAL_PORT [[email protected]]SSH_SERVER

Le opzioni utilizzate sono le seguenti:

  • [LOCAL_IP:]LOCAL_PORT- L'IP della macchina locale e il numero di porta. Quando LOCAL_IP viene omesso, il client ssh si collega a localhost.
  • [[email protected]]SERVER_IP - L'utente SSH remoto e l'indirizzo IP del server.

Un tipico esempio di port forwarding dinamico è il tunneling del traffico del browser Web attraverso un server SSH.

Il seguente comando creerà un tunnel SOCKS sulla porta 9090:

ssh -D 9090 -N -f [email protected]

Una volta stabilito il tunneling, è possibile configurare l'applicazione per utilizzarla.

Il port forwarding deve essere configurato separatamente per ogni applicazione di cui si desidera creare un tunnel per il traffico.

Configurare il tunneling SSH in Windows

Gli utenti Windows possono creare tunnel SSH usando il client PuTTY SSH. Puoi scaricare PuTTY qui.

Avviare Putty e inserire l'indirizzo IP del server SSH nel campo Host name (or IP address).

Nel menu Connection, espandi SSH e seleziona Tunnels. Controllare il pulsante di opzione Local  per configurare locale, Remote per remoto e Dynamic per port forwarding dinamico.

  • Se si imposta l'inoltro locale, immettere la porta di inoltro locale nel campo Source Port e immettere l'host e l'IP di destinazione nel campo Destination, ad esempio localhost:5901.
  • Per il port forwarding remoto inserire la porta di forwarding del server SSH remoto nel campo Source Port e nel campo Destination inserire l'host e l'IP di destinazione, ad esempio localhost:3000.
  • Se si imposta l'inoltro dinamico, immettere solo la porta SOCKS locale nel campoSource Port.

Fare clic sul pulsante Add.

Torna alla pagina Session per salvare le impostazioni in modo da non doverle inserire ogni volta. Immettere il nome della sessione nel campo Saved Session e fare clic sul pulsante Save.

Seleziona la sessione salvata e accedi al server remoto facendo clic sul pulsante Open.

Verrà visualizzata una nuova finestra che richiede nome utente e password. Dopo aver inserito il nome utente e la password, si accederà al server e verrà avviato il tunnel SSH.

L'impostazione dell'autenticazione con chiave pubblica ti permetterà di connetterti al tuo server senza inserire una password.

Conclusione

Ti abbiamo mostrato come impostare tunnel SSH e inoltrare il traffico attraverso una connessione SSH sicura.