In questa guida vedremo cos'è un tunnel SSH e come si crea utilizzando un client con Windows 10 e un server GNU/Linux. Questa tecnica ci permette di superare facilmente numerose restrizioni sulla rete e accedere a risorse che altrimenti sarebbero bloccate.

Come fare tunnel SSH Windows 10

Introduzione

SSH (Secure SHell) è un protocollo che, tramite interfaccia a riga di comando, permette di stabilire una sessione remota cifrata con un altro computer. Un tunnel SSH è una funzione avanzata del protocollo che permette di trasportare sessioni TCP arbitrarie all'interno di una connessione sicura, detta appunto tunnel.

Questa tecnica può essere usata per superare alcune restrizioni o problematiche presenti sulla rete internet in uso. Successivamente verranno fatti degli esempi concreti. Questa guida richiede conoscenze di rete di base.

Requisiti

Per seguire questa guida occorre innanzitutto un computer con una versione aggiornata di Windows 10. Questo sistema operativo ha introdotto il supporto a OpenSSH a partire dalla versione 1803. L'utente può verificare di quale versione dispone premendo WIN+R, scrivendo winver e premendo INVIO.

E' inoltre necessario disporre dell'accesso remoto tramite SSH ad un server, che nel caso di questa guida è un server remoto con GNU/Linux dotato di IP pubblico. L'accesso può avvenire tramite username e password, oppure con chiave di sicurezza.

Nella trattazione di seguito, in riferimento al solo protocollo SSH, il computer con Windows 10 sarà sempre il Client SSH, mentre il server sarà sempre il Server SSH.

Il terminale di Windows

Per impartire i comandi della guida, useremo il suo terminale, chiamato Windows PowerShell. Il modo più rapido per aprirlo è quello di fare click con il tasto destro del mouse sul logo di Windows in basso a sinistra e selezionarlo dal menù a tendina.

Come fare tunnel SSH Windows 10

Nella trattazione di seguito, verranno impartiti dei comandi SSH per creare dei tunnel SSH. Il terminale richiederà la password ed un'eventuale conferma di aggiunta chiave di sicurezza al sistema. E' doveroso precisare che un tunnel SSH rimane attivo solo se la sessione SSH è attiva, quindi questa finestra dovrà restare aperta.

Tipologie di TUNNEL SSH

Esistono varie tipologie di tunnel SSH, che vengono di seguito nominate in base al quella che è la loro principale funzione:

  1. Modalità classica: apertura di una porta locale
  2. Modalità inversa: apertura di una porta remota
  3. Modalità proxy di rete

Per completezza, ti ricordo che l'interfaccia di loopback è l'interfaccia virtuale di rete che ogni computer usa per comunicare con se stesso.

1) Modalità classica: apertura di una porta locale

Come fare tunnel SSH Windows 10 - ssh_tunnel_classico

Per 'apertura di una porta locale' per mezzo di un tunnel SSH si intende la pratica con la quale un servizio di rete remoto, ovvero sul server, viene reso disponibile localmente, ovvero sul client. Questa tipologia di tunnel viene realizzata grazie ad un singolo comando che ha questa sintassi:

ssh -L porta_locale:indirizzo_remoto:porta_remota username@server_ssh

Per comprendere questa definizione, servono degli esempi.

Esempio 1.1: l'amministratore di rete è stronzo

Supponi di trovarti in una rete aziendale, scolastica o in una rete pubblica. L'amministratore di tale rete ha impedito l'uso di un protocollo (es. FTP) oppure le connessioni verso la sua porta TCP standard (es. 21). Ti trovi a voler accedere ad un server tramite un servizio di rete bloccato. Disponi inoltre di accesso SSH allo stesso server. Dato che non puoi accedere direttamente, puoi ricorrere ad un tunnel ssh per aggirare questa limitazione. Il comando diventa:

ssh -L 21:127.0.0.1:21 root@server_ssh.com

Tradotto in italiano, significa:

"Collegati al server ssh (server_ssh.com) come amministratore (root) e inoltra sulla sua interfaccia di loopback (127.0.0.1:21) tutte le connessioni avviate sulla mia interfaccia di loopback (127.0.0.1:21).

Per la connessione al server tramite tunnel SSH, basterà usare quindi questo indirizzo di loopback sul client FTP: 127.0.0.1:21

Esempio 1.2: l'intermediario di rete

In riferimento all'esempio precedente, questa volta non disponi di accesso SSH allo stesso server, tuttavia disponi di un'altro Server SSH. Il comando diventa:

ssh -L 21:server_ftp.com:21 root@server_ssh.com

Tradotto in italiano, significa:

"Collegati al server ssh (server_ssh.com) come amministratore (root) e usalo per inoltrare al server remoto (server_ftp.com:21) tutte le connessioni avviate sulla mia interfaccia di loopback (127.0.0.1:21).

Non usare questa tecnica per il protocollo web (http), per quello usa la terza modalità.

2) Modalità INVERSA: apertura di una porta remota

Come fare tunnel SSH Windows 10 - ssh_tunnel_inverso

Per 'apertura di una porta remota' per mezzo di un tunnel SSH si intende la pratica con la quale un servizio di rete locale, ovvero sul client, viene reso disponibile in remoto, ovvero sul server. Questa tipologia di tunnel viene realizzata grazie ad un singolo comando che ha questa sintassi:

ssh -R porta_remota:indirizzo_locale:porta_locale username@server_ssh

Per comprendere questa definizione, servono degli esempi.

Esempio 2.1: controllo remoto del pc di casa

Supponi di trovarti in una rete aziendale, scolastica o in una rete pubblica. Sul tuo computer è in esecuzione un servizio di rete (es. un'interfaccia web su porta 8080) che vorresti fosse accessibile anche da un server remoto. In questo esempio il tuo computer con Windows 10, pur essendo il Client SSH, assume quindi la funzione di server per il servizio di rete in questione, mentre il Server SSH assume quindi la funzione di client dello stesso servizio. L'amministratore di rete però ha bloccato l'uso del protocollo che ti serve (es. http) o comunque non ti permette di avere delle connessioni in ingresso, quindi il tuo servizio di rete non può funzionare in maniera tradizionale. In questo caso puoi ricorrere ad un tunnel ssh per aggirare questa limitazione. Il comando diventa:

ssh -R 8080:127.0.0.1:8080 root@server_ssh.com

Tradotto in italiano, significa:

"Collegati al server ssh (server_ssh.com) come amministratore (root) e inoltra sulla mia interfaccia di loopback (127.0.0.1:8080) tutte le connessioni avviate sulla sua interfaccia di loopback (127.0.0.1:8080)."

Per la connessione al client tramite tunnel SSH, il server dovrà usare quindi questo indirizzo di loopback: 127.0.0.1:8080

Esempio 2.2: gateway remoto del pc di casa

In riferimento al'esempio precedente, vorresti che il servizio accessibile dal server remoto, fosse disponibile anche per altri utenti ad esso collegati. Il server dovrebbe comportarsi quindi da Gateway, ovvero da intermediario. Questo è tecnicamente possibile, ma bisogna precisare che il tunnel ssh non è stato concepito con questo scopo perchè pone rilevanti questioni di praticità e di sicurezza. Ci sono due comandi aggiuntivi da impartire al server per raggiungere questo scopo:

sed -ire "s:#GatewayPorts no:GatewayPorts yes:" /etc/ssh/sshd_config

service sshd restart

Per approfondire la questione, leggere la documentazione ufficiale.

Esempio 2.3: port-forward remoto

Sul tuo computer è in esecuzione un servizio di rete che per funzionare richiede l'apertura di una porta sul modem router ADSL, un IP Pubblico o una configurazione particolare del firewall di rete. Per ragioni di varia natura, è impossibile risolvere direttamente queste problematiche.

» Leggi: Connessione Internet con indirizzo IP privato (doppio NAT). Significato, differenze IP pubblico/privato, spiegazione problemi

Questo caso, anche se concettualmente diverso dal precedente, può essere trattato allo stesso modo. Con questa tecnica, l'applicazione sul tuo computer di casa che riceve le connessioni remote, le vedrà arrivare dall'interfaccia di loopback, ovvero dal tuo stesso computer, con tutto ciò che ne consegue.

Esempio 2.4: tunnel SSH per sessioni SSH

Un variante molto interessante è quella del tunnel SSH che permette al server di accedere in ssh al client, il quale dovrà avviare il server ssh di Windows 10 (non trattato in questa guida).

ssh -R 22000:127.0.0.1:22 root@server_ssh.com

Tradotto in italiano, significa:

"Collegati al server ssh (server_ssh.com) come amministratore (root) e inoltra sulla mia interfaccia di loopback (127.0.0.1:22) tutte le connessioni avviate sulla sua interfaccia di loopback (127.0.0.1:22000)."

In questo caso la porta remota è la 22000, mentre la porta locale è la 22, questo accorgimento serve ad evitare un conflitto di porta sul server, dato che a sua volta usa la porta 22.

Esempio 2.5: uno scenario complesso

Supponi di avere un dispositivo di rete locale (una videocamera, una stampante, un dispositivo domotico) che non può fungere nè da server ssh, nè da client ssh. Tale dispositivo necessita di essere controllato da remoto come nell'esempio 2.1, oppure necessita di un port forward remoto come nell'esempio 2.3. Se nella stessa rete locale esiste almeno un computer che abbia un client ssh, questo può fungere da intermediario per risolvere il problema.

Il comando diventa:

ssh -R 8080:192.168.1.10:8080 root@server_ssh.com

Tradotto in italiano, significa:

"Collegati al server ssh (server_ssh.com) come amministratore (root) e inoltra sulla mia interfaccia di rete locale (192.168.1.10:8080) tutte le connessioni avviate sulla sua interfaccia di loopback (127.0.0.1:8080)."

3) Modalità proxy di rete

Come fare tunnel SSH Windows 10

Per 'proxy di rete' per mezzo di un tunnel SSH si intende la pratica con la quale un client SSH utilizza un server SSH come un intermediario generico di rete. Questa tipologia di tunnel viene realizzata grazie ad un singolo comando che ha questa sintassi:

ssh -D porta_locale username@server_ssh

Per comprendere questa definizione, servono degli esempi.

Esempio 3.1: accedere a siti bloccati

Supponiamo di voler accedere, dall'Italia, ad un sito oscurato mediante blocco del dominio e blocco delle connessioni verso l'IP associato al dominio. Per superare entrambi questi blocchi, è possibile ricorrere al tunnel SSH. Il comando diventa:

ssh -D 1080 root@server_ssh.com

Tradotto in italiano, significa:

"Collegati al server ssh (server_ssh.com) come amministratore (root) e usalo come proxy server, inoltrandogli tutte le connessioni avviate sulla mia interfaccia di loopback (127.0.0.1:1080)."

Per utilizzare questo tunnel è necessario configurare il browser per l'utilizzo di un SOKCS server con questo indirizzo di loopback: 127.0.0.1:1080.

Chi usa Firefox può andare su Strumenti, Opzioni, scorrere verso la fine e aprire le Impostazioni di Connessione per effettuare la configurazione. Occorre abilitare anche DNS proxy per SOCKS v5.

Come fare tunnel SSH Windows 10

Conclusioni

La creazione di un tunnel SSH da Windows 10 rappresenta sicuramente un modo semplice e rapido per risolvere alcuni problemi di rete. Comunque sarebbe sempre preferibile usare una VPN, la quale anche se sicuramente è più laboriosa da realizzare, presenta numerosi vantaggi, specialmente per quanto riguarda la sicurezza e la praticità d'uso.

» Leggi: Come creare un server VPN L2TP/IPSec in 5 minuti

» Leggi: Come aprire le porte su qualsiasi connessione usando una VPN