OpenVPN + stunnel Contro i Firewall con Deep Packet Inspection

OpenVPN è un’ottimo software per creare una VPN: è veloce, leggero ma soprattutto sicuro. Il suo più grande difetto è però la facilità con cui si può bloccare il protocollo.

In questo articolo vedremo come creare una VPN con OpenVPN che sia in grado di aggirare un firewall con con DPI (deep packet inspection) come quelli di numerose scuole, università o luoghi pubblici.

Per ottenere questa funzionalità useremo stunnel: un’applicazione che effettua l’incapsulamento dei pacchetti di OpenVPN per fare in modo che sembrino dei normalissimi pacchetti di siti HTTPS. Dovremo installare stunnel sia sul server, per l’occasione un Raspberry Pi, che sul client: li faremo comunicare sulla porta 443 (per nasconderli tra gli altri pacchetti SSL che viaggiano sulla stessa porta) mentre faremo comunicare il client e il server VPN con le rispettive istanze di stunnel sulla porta 1194 (quella di default di OpenVPN).

Vediamo un breve schema per capire meglio come funziona il meccanismo:

Schema

Aggiornare

Per primissima cosa necessitiamo di avere tutti i pacchetti aggiornati, digitiamo quindi il seguente comando nel terminale:

sudo apt-get update && sudo apt-get -y upgrade

È preferibile, ma non strettamente necessario, riavviare il sistema operativo dopo l’aggiornamento:

sudo reboot

IP Statico

Dobbiamo poi assicurarci di aver assegnato un indirizzo IP statico al nostro server: ciò di permetterà di sapere sempre con certezza l’indirizzo a cui poter raggiungere la nostra VPN dentro la nostra rete di casa.

Il metodo per impostarlo potrebbe variare con le varie versioni di Linux: vi raccomando perciò di cercare su internet un tutorial recente, tuttavia vi descrivo brevemente i passaggi nel caso stiate leggendo questo tutorial poco dopo la pubblicazione:

Aprite il terminale e, usando un editor di testo (nel nostro caso “nano”), modificate il file “/etc/network/interfaces”

sudo nano /etc/network/intefaces

Inserite in fondo al file uno dei testi che vi propongo di seguito, stando attenti a rimpiazzare “???” con un numero tra 2 e 253. (Se volete andare sul sicuro scegliete un numero maggiore di 50)

Il numero non deve andare in conflitto con un computer già presente nella rete: se volete essere sicuri che il numero che avete scelto non sia già occupato aprite il terminale e scrivete ping 192.168.1.NUM con il numero che avete scelto al posto di "NUM" e verificate che vi restituisca "Destination Host Unreachable".

Se siete connessi alla rete con il WiFi inserite questo blocco:

auto wlan0  
iface wlan0 inet static  
address 192.168.1.???  
gateway 192.168.1.1  
netmask 255.255.255.0  

Se, invece, siete connessi a internet con il cavo, aggiungete questo testo:

auto eth0  
iface eth0 inet static  
address 192.168.1.???  
gateway 192.168.1.1  
netmask 255.255.255.0  

Salvate il file con CTRL + O, cliccate Invio e uscite con CTRL + X

Port Forwarding

Fatto ciò dobbiamo “aprire” la porta 443 sul nostro router: siccome ogni modello e marca di router ha le proprie impostazioni e grafica, vi consiglio di controllare marca e modello del vostro router e andare su un sito specializzato (come questo) dove troverete una lista con i nomi dei vari produttori e le rispettive indicazioni, oppure potreste fare una brevissima ricerca su internet specificando il vostro modello di router seguito da “port forwarding”.

Una volta seguiti i vari passaggi verificate che la porta sia aperta inserendo su questo sito la porta “443” dove c’è scritto “Port Number” e cliccando su “Check”.

DDNS

Se, come molto probabile, non avete un indirizzo IP pubblico statico dovrete registrarvi ad un servizio DDNS, come noip.com. Una volta registrati

  • verificate se il vostro modem/router possiede la funzionalità di client DDNS, nel caso impostatelo da li
  • se, invece, non la possiede installate il servizio sul vostro server (qui il tutorial ufficiale per Raspberry Pi) che permetterà al sito di conoscere il vostro IP e reindirizzare il vostro DDNS personale alla vostra rete.

OpenVPN

Cominciamo quindi installando OpenVPN sul nostro server: per farlo useremo uno strumento chiamato “PiVPN.io” che permette con un solo comando di creare per noi tutti i certificati e le configurazioni necessarie. Colleghiamoci, quindi, al nostro server e digitiamo nel terminale:

curl -L https://install.pivpn.io | bash

Apparirà un’interfaccia nel terminale per poter personalizzare le varie impostazioni. Di seguito vi specifico le impostazioni che bisogna cambiare:

  • Quando ci chiede che protocollo vogliamo utilizzare dobbiamo selezionare “TCP” e non “UDP” Selezioniamo TCP

  • Nel campo per personalizzare la porta dobbiamo impostare la “1194Impostiamo la Porta 1194

  • Nella scelta tra IP Pubblico e DNS dobbiamo selezionare “DNS Entry” e al passo successivo scrivere “127.0.0.1Scegliamo DNS Entry Inseriamo 127.0.0.1

Acconsentite, infine, alla richiesta di riavvio.
Una volta acceso, aprite il terminale e digitate il comando per modificare il file di configurazione di OpenVPN

sudo nano /etc/openvpn/server.conf

e appendete in fondo al file le due righe riportate di seguito:

crl-verify /etc/openvpn/crl.pem  
push “block-outside-dns”  

Completate creando la configurazione, che ci servirà dopo, per il client col comando:

pivpn add

Vi chiederà un nome del client (a scelta) e una password che dovrete inserire quando vi vorrete connettere alla vostra VPN da un computer.

Stunnel

Partiamo installando “stunnel” col comando

sudo apt-get install -y stunnel4

Spostiamoci quindi nella cartella di configurazione di stunnel e creiamo il file e generiamo il il certificato col secondo comando:

cd /etc/stunnel

sudo openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -sha256 -subj '/CN=127.0.0.1/O=localhost/C=US' -keyout /etc/stunnel/stunnel.pem -out /etc/stunnel/stunnel.pem

Creiamo o modifichiamo quindi il file di configurazione di stunnel con nano:

sudo nano stunnel.conf

e inseriamo in fondo al file il seguente testo (CTRL + O per salvare e CTRL + X per uscire):

client = no  
[openvpn]
accept = 443  
connect = 127.0.0.1:1194  
cert = /etc/stunnel/stunnel.pem  

Consentiamo libero accesso ai pacchetti di stunnel con il seguente comando per modificare le regole del firewall

sudo sed -i -e 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4

Copiamo quindi il certificato di stunnel nella nostra home (da dove lo potremo scaricare), riavviamo il servizio e spostiamoci nella nostra home:

sudo cp /etc/stunnel/stunnel.pem ~/ovpns/

sudo service stunnel4 restart

cd

Creiamo quindi il file di configurazione per il nostro client col comando

sudo nano ovpns/stunnel.conf

e inseriamo il seguente testo, stando accorti a rimpiazzare "DDNS" con il vostro IP pubblico, nel raro caso ne possediate uno statico, o col vostro indirizzo DDNS, come abbiamo visto prima

client = yes  
[openvpn]
accept = 127.0.0.1:1194  
connect = DDNS:443  
cert = stunnel.pem  

Salviamo e usciamo con i soliti CTRL + O e CTRL + X e riavviamo il nostro server

sudo reboot

Client

Finalmente ci spostiamo nel nostro client, ovvero il computer che si connetterà alla nostra VPN. In questo caso userò un sistema Windows: nel caso abbiate un sistema operativo differente provvedete ad adattare le istruzioni alle vostre esigenze.

Installiamo il client OpenVPN e stunnel (rispettivamente qua e qua). Nel caso non li trovaste nei link che vi ho fornito basta fare una brevissima ricerca su un motore di ricerca per entrambi.

Spostiamo i file presenti nella cartella “ovpns” della home del nostro server: per fare ciò scaricate Filezilla (a questo link per Windows), apritelo e in alto inserite:

  • “Host”: l’indirizzo IP del vostro server
  • “Nome utente”: l’username del vostro server
  • “Password”: la password del vostro server
  • “Port”: 22

Cliccate su “Connessione rapida”, aprite la cartella “ovpns” e scaricate tutti i file presenti nella cartella sul vostro computer.

Ora copiamo i file “stunnel.conf” e “stunnel.pem” nella cartella di installazione di stunnel (di default C:\Program Files (x86)\stunnel\config)

Riavviamo il computer, apriamo stunnel e OpenVPN. Sull’icona in basso a destra di quest’ultimo clicchiamo Tasto Destro > “Import File...” e selezioniamo il file con estensione “.ovpn”. Clicchiamo, sempre sulla stessa icona, Tasto Destro > “Connect”: dovrebbe apparire una notifica di avvenuta connessione.

Ce l’abbiamo fatta.

(Nel caso ci sia un’errore provate a cercare l’errore che vi compare in rosso su internet o, nel caso non troviate nulla, chiedete qua sotto nei commenti: faremo del nostro meglio per aiutarvi :) )


Ringraziamenti:

  • a "Xaqron" per aver creato uno script non funzionante da cui però ho potuto creare una parte di questo tutorial
  • a Morrolinux per le innumerevoli correzioni e il grafico a inizio pagina