# Protocollo di tunneling

Nell'ambito delle reti di computer, un protocollo di tunneling è un protocollo di comunicazione che permette ad un utente di fornire o accedere ad un servizio non supportato o non fornito direttamente dalla rete. Un uso importante del tunneling è ad esempio permettere ad un protocollo straniero di essere usato su una rete che naturalmente non lo supporta; per esempio, usare IPv6 su una rete compatibile solo con IPv4. Un altro uso importante è fornire servizi che sono di norma impraticabili o insicuri se offerti attraverso la rete originaria; per esempio, fornire un indirizzo di rete aziendale ad un utente remoto la cui rete fisica non è parte del network aziendale. Poiché il tunneling comporta il reincapsulamento del traffico di rete in una forma differente, normalmente usando uno standard crittografico, un terzo uso è quello di nascondere la natura dei dati che sono trasmessi mediante tunneling.
Il protocollo di tunneling funziona usando la porzione riservata ai dati di un normale pacchetto IP detto payload, in esso sono memorizzati i reali pacchetti forniti dal servizio. Il tunneling usa un modello di protocollo a livelli, come i protocolli OSI o TCP/IP, ma frequentemente viola questa caratteristica quando usa il payload per trasportare un servizio non normalmente previsto dalla rete sottostante. Usualmente, nel modello a strati, il protocollo di ricezione opera ad un livello uguale o maggiore rispetto al protocollo di invio (anche esso detto payload).

## Caratteristiche tecniche

Per capire una particolare implementazione di un protocollo di tunneling, si devono prima comprendere le tecniche più usate dai protocolli di invio (payload) e ricezione.
Come esempio di tunneling a livello di rete si ha il protocollo Generic Routing Encapsulation (GRE); questo usa IP (IP numero di protocollo 47) per trasportare i pacchetti con indirizzi privati RFC 1918, ad esempio appartenenti ad una rete locale, su internet con destinazione un'altra rete locale. Il protocollo GRE usa pacchetti con header IP; in questo caso il protocollo di ricezione e il protocollo di invio sono gli stessi, ma gli indirizzi del payload sono incompatibili con quelli del network ricevente (perché sono indirizzi pubblici, e invece il protocollo ricevente si aspetta indirizzi di un network locale); GRE all'arrivo del pacchetto si occupa di spogliare l'header IP e il pacchetto viene reso compatibile con il protocollo nativo della LAN di destinazione.
In sintesi il protocollo GRE, attraverso il tunneling, permette di far comunicare macchine appartenenti a reti locali separate, senza che queste debbano usare protocolli diversi da quelli che già usavano localmente. Infatti i protocolli di invio e di ricezione non vengono variati, GRE di fatto modifica il loro comportamento per estenderne le funzioni senza che i suddetti protocolli debbano essere riscritti o cambiati.
Si può anche stabilire una connessione tunnel usando il livello di collegamento, Il protocollo L2TP (Layer Two Tunneling Protocol) permette la trasmissione dei frames tra due nodi. Il tunnel non è criptato di default, si basa sul protocollo TCP/IP per determinare il livello di sicurezza.
SSH usa la porta 22 per permettere la crittografia dei dati dei payload trasmessi su connessioni pubbliche (come internet), in tal modo servendo anche come VPN.
Lo standard IPsec è normalmente operato in modalità end-to-end, ma può anche operare in modalità tunnel attraverso dei gateway di sicurezza fidati.

## Tunneling Secure Shell

Un tunnel Secure Shell consiste in un tunnel criptato creato attraverso un protocollo di connessione SSH. L'utente può impostare un tunnel SSH per trasferire nel network traffico in chiaro attraverso un canale criptato. Per esempio i computer Microsoft Windows possono condividere file usando il protocollo non criptato Server Message Block (SMB). Se si dovesse montare un file system Microsoft Windows da remoto tramite Internet, qualcuno, sniffando la connessione, potrebbe vedere i file trasferiti. Per montare in modo sicuro il file system, si può stabilire un tunnel SSH che indirizza tutto il traffico SMB per il file server remoto in un canale criptato.
Per impostare localmente un tunnel SSH, si deve configurare un client SSH ad inoltrare una specifica porta locale (verde nell'immagine) ad una porta sulla macchina remota (viola nell'immagine). Questo procedimento è noto come port forwarding. Una volta che il tunnel SSH è stato stabilito, l'utente può connettersi alla specifica porta locale (verde nell'immagine) per accedere al servizio scelto. Non è obbligatorio che la porta locale sia la stessa della porta remota.
Il tunneling SSH permette di oltrepassare i firewall che proibiscono determinati servizi internet, sempre che siano permesse connessioni in uscita. Per esempio, un'organizzazione potrebbe voler proibire agli utenti l'accesso diretto delle pagine web in internet (porta 80), rendendo di fatto obbligato l'uso del server proxy dell'organizzazione (che permette a quest'ultima di monitorare o bloccare ciò che l'utente vede attraverso il web). Tuttavia gli utenti potrebbero non desiderare che il loro traffico web sia controllato o bloccato dal proxy dell'organizzazione. Se gli utenti possono connettersi ad un server SSH esterno, allora possono creare una tunnel SSH per inoltrare una data porta sulla loro macchina locale alla porta 80 del web server remoto. Configurato il tunnel SSH, gli utenti potranno accedere liberamente al web server remoto semplicemente puntando il loro browser alla porta locale scelta digitando l'indirizzo http://localhost/<porta>.

### Tunneling con SOCKS

Alcuni client SSH supportano il port forwarding dinamico, questo permette agli utenti di creare un proxy SOCKS 4/5. In questo caso gli utenti possono configurare le loro applicazioni per usare il proxy server SOCKS locale. Questo garantisce più flessibilità rispetto al creare un tunnel SSH su una singola porta (come visto precedentemente). SOCKS può liberare l'utente dalla limitazione del doversi connettersi a dei predefiniti server e porte remoti. Nel caso un'applicazione non supporti SOCKS, può essere usato un proxifier per reindirizzare le applicazioni al proxy server locale SOCKS. Un esempio di rete di computer gratuita e anonima che supporta SOCKS è Tor, infatti è possibile configurare un'applicazione per usare il proxy locale SOCKS (sulla porta 9050) messo a disposizione dall'applicazione Tor.

## Aggirare le restrizione dei firewall

Gli utenti possono anche usare il tunneling per aggirare le restrizioni imposte da un firewall, infatti è possibile usare un protocollo bloccato incapsulando i suoi pacchetti in un altro protocollo non bloccato dal firewall, generalmente viene usato HTTP. Se la politica del firewall non esclude specificatamente questo tipo di incapsulamento, allora questo trucco può funzionare per aggirare il firewall.

## Altri usi

Il tunneling è una tecnologia molto usata nell'ambito delle reti di computer, altri esempi di uso possono essere:
* Le VPN, in cui IP viene incapsulato in IP, TCP o UDP, inserendo uno strato di crittografia. In queste tecniche, due reti IP, o due parti della stessa rete IP, entrambe connesse ad Internet, vengono interconnesse facendo passare il traffico all'interno di una connessione che viene trasmessa su Internet.
* L'utilizzo di protocolli di livello di rete per trasportare IP, che a sua volta è un protocollo di livello rete, è a sua volta una forma di tunneling. L'esempio tipico è la connessione di due reti IP attraverso una galleria ATM: in tal caso, il pacchetto IP viene inserito (e opportunamente frammentato) all'interno del campo dati della cella ATM, trasmesso attraverso la rete e quindi spacchettato e ricomposto all'arrivo. In questo modo, gli switch ATM non si renderanno conto di cosa stanno trasmettendo, perché il campo dati è trasmesso così com'è, senza dover essere interpretato. Ai capi della galleria è necessario inserire router multiprotocollo, che siano in grado di compiere le operazioni di impacchettamento dei dati.