Una VPN è una rete privata virtuale, ovvero vi permette di connettervi alla vostra LAN dall’esterno in modo sicuro e criptato. Inizialmente le VPN nascono per le aziende che avevano la necessita di collegare tra loro diverse sedi, oggi sono molto diffuse perché permettono di bypassare eventuali limiti imposti dal firewall di un hotspot pubblico o dal datore di lavoro, oltre a garantire una connessione sicura nel caso in cui fossimo connessi a una connessione non affidabile.

Può essere utile, ad esempio, per controllare lo stato di avanzamento di un’operazione avviata sul computer di casa o sul server stesso, o per accedere remotamente ai file presenti nella vostra rete domestica, ad esempio su un NAS.

Cos’è OpenVPN

OpenVPN è un programma rilasciato gratuitamente sotto licenza GPL per la creazione di VPN. Supporta varie architetture (server-server, server-client) e vari sistemi di autenticazione(chiave simmetrica, chiave pubblica-privata, utente-password). In questa guida vedremo una configurazione client-server a chiave asimmetrica.

Non useremo password aggiuntive, quindi i file di configurazione che serviranno ai client per la connessione saranno l’unica via di accesso alla nostra VPN. È quindi fondamentale conservarli in luogo sicuro in quanto se finissero nelle mani di qualcun’altro questi potrebbe connettersi alla VPN.

Operazioni preliminari:

Nel caso non avessimo già un’installazione funzionante di Linux, la installiamo.

Nel caso di Raspberry Pi possiamo usare Raspbian, su altri dispositivi Debian, Ubuntu o qualsiasi loro derivata andrà più che bene.

Nell’utilizzare la nostra VPN avremo la necessità di poter raggiungere dall’esterno la nostra rete, se non abbiamo un IP statico possiamo utilizzare un servizio come NoIP.

Requisito fondamentale per poter installare il server è non essere dietro un NAT.

Il NAT è un meccanismo che sfruttano alcuni provider internet per non asseganre IP pubblici a tutti i loro clienti. Caso tipico di rete dietro NAT è la rete mobile, infatti se provassimo a connetterci da Internet a uno smartphone non sarebbe possibile perché il provider blocca le connessioni mediante, appunto, il NAT.

Oggigiorno quasi la totalità dei provider fornisce un IP pubblico raggiungibile da internet tranne le connessioni via 3G/4G e, a volte, via WI-FI.

Dobbiamo poi aprire la porta per il server, che deve avere un IP statico all’interno della nostra rete, la porta di default, a meno di modifiche nei file di configurazione, è la 1194 UDP.

Installazione dei pacchetti

Dopo aver aperto una shell, locale o via SSH, diventiamo root: sudo -s  o su   e facciamo un po’ di aggiornamenti, che non fa mai male:

apt-get update && apt-get upgrade && apt-get dist-upgrade

Installiamo quindi i pacchetti necessari:

apt-get install openvpn screen easy-rsa iptables

Copiamo quindi la cartella con il framework per generare le chiavi e certificati:

cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa

Configurazione di Easy-RSA

Apriamo il file di configurazione del framework:  nano /etc/openvpn/easy-rsa/vars .

Cerchiamo la riga che inizia con  `export EASY_RSA=``  e la modifichiamo in modo che diventi così:

export EASY_RSA="/etc/openvpn/easy-rsa"

Andiamo alla fine del file e impostiamo le nostre variabili relative al certificato:

export KEY_COUNTRY="IT"
export KEY_PROVINCE="VI"
export KEY_CITY="Vicenza"
export KEY_ORG="Casa"
export KEY_EMAIL="qualcosa@qualcosa.com"

In realtà non è necessario che questi dati siano realistici (possiamo mettere come provincia XX ad esempio), servono solo per riempire i vari campi necessari per la creazione dei certificati (in ambito pubblico, ad esempio con l’https, questi dati garantirebbero l’autenticità e la provenienza dei certificati, cosa a noi estranea in quanto li useremo solo per noi).

Quindi impostiamo queste variabili tecniche, sempre all’interno dello stesso file:

export KEY_CN=Raspberry
export KEY_NAME=Raspberry
export KEY_OU=Raspberry
export PKCS11_MODULE_PATH=Raspberry
export PKCS11_PIN=1234
export KEY_ALTNAMES="qualcosa"

Il nome Raspberry  identifica il nome con il quale saranno generate le chiavi e i certificati del server, se lo modifichiamo dovremo farlo anche in tutti gli altri passaggi in cui compare Raspberry .

Cerchiamo poi la riga export KEY_SIZE=1024  all’interno del file e modifichiamola in export KEY_SIZE=2048 Salviamo e chiudiamo(‘ctrl+x’, ‘s’).

Generazione chiavi e certificati per la CA

Dobbiamo ora assumere ora il ruolo di Certification Authority, ovvero l’ente che si occupa di certificare e autenticare le chiavi e i certificati del client e del server.

cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca

Con l’ultimo comando abbiamo creato i certificati per la Certification Authority, che serviranno poi per firmare e autenticare le chiavi del server e del client.

Creaimo quindi la chiave per il server:

./build-key-server Raspberry

Durante la creazione verrano richiesti i vari valori già settati in precedenza (nel file vars), è sufficiente premere invio.

Quando verrà chiesta una “challenge password” lasciamola vuota.

Ci verrà chiesto di firmare il certificato, rispondiamo entrambe le volte con ‘y’.

Generazione chiavi e certificati dei client

Dobbiamo ora creare le chiavi per i client, ovvero i dispositivi che si connetteranno alla nostra VPN. Per come andremo a configurarla è sufficiente crearne uno e utilizzare lo stesso per tutti i nostri dispositivi. Nel caso in cui volessimo diversificare le chiavi sarà sufficiente ripetere i seguenti passaggi più volte.

./build-key-pass NAME

Dove NAME è il nome dell’utente o del device che utilizzerà questa chiave. Come prima accettiamo i valori di default e lasciamo la challenge password vuota.

Quando ci verrà chiesta la PEM password dobbiamo inserirne una che siamo sicuri di ricordare ma, contemporaneamente, sicura ed efficace, dato che servirà a proteggere il certificato stesso e verrà chiesta prima della connessione. Firmiamo quindi il certificato e lo confermiamo come prima con ‘y’ (due volte).

Dobbiamo ora creare le chiavi per i client a partire dai certificati generati al punto precedente, li cripteremo con l’algoritmo 3DES:

cd keys
openssl rsa -in NAME.key -des3 -out NAME.3des.key

Ripetiamo quest’ultimo comando tante volte quante sono i certificati generati al punto precedente, sostituendo NAME con il nome impostato durante la generazione.

Ci verrà richiesta una “PEM Password”, inseriamola, tutte le volte che lo richiede, uguale a quella inserita nel punto precedente. Se generiamo più certificati e client possiamo usare password diverse fra i vari utenti, ma uguali per quell’utente(ad esempio se creiamo l’utente ‘Laptop’ tutte le PEM password di ‘Laptop’ dovranno essere uguali).

Le uniche password che devono restare vuote sono quelle del server e le challenge password.

Generazione del certificato Diffie-Hellman e del HMAC

Generiamo ora il certificato Diffie-Hellman, necessario per lo scambio delle chiavi tra client e server attraverso un canale sicuro.

Questo passaggio può essere molto lungo (anche un paio d’ore), pertanto conviene eseguirlo utilizzando il comando screen, che permette di chiudere la sessione SSH senza terminare il processo:

cd /etc/openvpn/easy-rsa
screen ./build-dh

Quindi possiamo chiudere la shell tramite i comandi ‘ctrl+a’ e poi ‘d’, quindi possiamo chiudere il terminale.

Quando vogliamo riprendere il controllo sarà sufficiente riaprire la connessione SSH e dare

screen -r

Nel caso non avesse ancora finito procediamo come prima(‘ctrl+a’ e poi ‘d’).

Quando il processo avrà terminato il suo lavoro, possiamo procedere alla creazione del HMAC, un sistema di criptaggio che evita gli attacchi DOS e garantisce l’autenticità dei messaggi, aggiungendo un ulteriore livello di sicurezza:

openvpn --genkey --secret keys/ta.key

A questo punto abbiamo finito la generazione di chiavi e certificati, passiamo quindi alla configurazione del server.

Configurazione del server

Dopo esserci spostati nella directory corretta con cd /etc/openvpn/, scarichiamo il file di configurazione del server:

wget http://girondi.net/it/post/openvpn/server.conf.txt -O server.conf

Apriamo il file di configurazione del server OpenVPN:

nano server.conf

Questa configurazione funziona per una LAN con IP 192.168.1.x, con un server che risponde alla porta 1194, i file del server si chiamano Raspberry.* e prevede l’autenticazione mediante certicati.

Il default Gateway è 192.168.1.1, la sottorete virtuale per la VPN è 10.8.66.0, tutto il traffico del client verrà girato sulla VPN alla connessione, a meno di altre modifiche. Se la nostra rete utilizza una classe di IP diversa adattiamo il file alle nostre esigenze, quindi salviamo e chiudiamo(‘ctrl+x’,’s’).

Creiamo il file di log per il server e la cartella temporanea:

mkdir /var/log/openvpn && touch /var/log/openvpn/openvpn.log && mkdir /etc/openvpn/tmp/

Dobbiamo quindi modificare la configurazione di sistema per poter inoltrare il traffico, cosa non prevista di default.

Troviamo la riga seguente e rimuoviamo il cancelletto presente davanti net.ipv4.ip_forward , il risultato deve essere questo:

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Salviamo e chiudiamo(‘ctrl+x’,’s’), quindi ricarichiamo la configurazione di sistema:

sysctl -p

Modifichiamo quindi il firewall per permettere la connessione di OpenVPN:

nano /etc/network/if-up.d/firewall

Aggiungiamo questo :

#!/bin/sh
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.66.0/24 -o eth0 -j MASQUERADE

Salviamo e chiudiamo(‘‘ctrl+x’,’s’), quindi diamoli i giusti permessi:

chmod +x /etc/network/if-up.d/firewall

Generazione configurazioni per i client:

Spostiamoci nella cartella giusta:

cd /etc/openvpn/easy-rsa/keys

Scarichiamo lo script di creazione dei file per il client:

wget http://girondi.net/it/post/openvpn/makeOVPN.sh

Quindi modifichiamo i permessi:

chmod 700 makeOVPN.sh

Scarichiamo il file Default.txt, che servirà come maschera per la creazione dei file per i client:

wget http://girondi.net/it/post/openvpn/Default.txt

E lo adattiamo alla nostra configurazione, modificando l’indirizzo IP pubblico (o il DynDNS):

nano Default.txt

Salviamo e chiudiamo, quindi procediamo a creare i file di configurazione:

./makeOVPN.sh

Quando ci verrà chiesto il nome del client dovremo inserire quello che abbiamo inserito in precedenza quando abbiamo generato le chiavi (file .crt e .key, ad esempio ‘Laptop’). Il file generato, chiamato NAME.ovpn, dove NAME è il nome del client (scelto in precedenza), si troverà all’interno della cartella keys(/etc/openvpn/easy-rsa/keys ). Questo file servirà al client per la connessione, all’interno contiene tutti i dati e parametri necessari alla connessione. Questa operazione va ripetuta nel caso avessimo creato più client con nomi diversi.

I file .ovpn generati andranno copiati sui client, ad esempio utilizzando Filezilla attraverso la connessione SSH, come ho spiegato qui.

Connettersi alla VPN:

Nel caso di uno smartphone Android possiamo scaricare OpenVPN Connect dal PlayStore, quindi, dopo aver copiato il file .ovpn nella memoria, apriamo l’applicazione e clicchiamo nel menù in alto a destra, “Import” > “Import profile from SD card”, quindi inseriamo la password e premiamo “Connect”. Quando apparirà la chiave in alto nella status bar saremo connessi.

Nel caso di iPhone o iPad, dopo aver installato l’app è necessario auto inviarsi una mail con il file .ovpn e aprirla dall’app.

Per Windows esiste il client OpenVPN. Per utilizzarlo è  necessario scaricarlo dal sito e installarlo, accettando l’installazione del driver.

Copiamo quindi il file .ovpn generato dal server nella cartella C:\Program Files\OpenVPN\config .

Avviamo quindi il client con i permessi di amministratore(tasto destro sull’icona, esegui come amministratore) e, dopo qualche istante dovrebbe comparire nella barra di sistema vicino all’orologio l’icona di OpenVpn. Facendo tasto destro su quest’icona possiamo selezionare il server e quindi premere su Connect. Ci verrà chiesta la password per lo sblocco del certificato e dopo qualche secondo dovremmo essere connessi alla VPN.

Su Mac possiamo utilizzare TunnelBlick.

Su Linux possiamo connetterci da linea di comando mediante il pacchetto openvpn (lo stesso pacchetto fornisce sia le funzionalità server che client), possiamo installarlo dal packet manager della nostra distribuzione, su Debian e Ubuntu:

sudo apt-get install openvpn

Il comando per connettersi è sudo openvpn file.ovpn.

Oppure possiamo installare, se esiste, un plugin per il nostro ambiente grafico. Ad esempio per Gnome e Mate, che utilizzano il pacchetto nm-applet per gestire la connessione di rete, possiamo installare il pacchetto network-manager-openvpn-gnome disponibile di default nei repository di Ubuntu e Debian.

Tale plugin però necessita di file separati per certificati e chiavi, che andranno creati a partire dal file .ovpn.

Per farlo è sufficiente scaricare questo script e eseguirlo passandogli come parametro il file .ovpn:

wget http://girondi.net/it/post/openvpn/ovpn_divider.sh
sh ovpn_divider.sh file.ovpn

Lo script provvederà a creare i file separati necessari per il plugin e a modificare il file .ovpn. Per utilizzarlo è sufficiente aprire il pannello di configurazione della rete(tasto destro sul simbolo del Wi-Fi/cavo sulla barra di stato) e aggiungere una nuova rete, quindi selezionare Importa configurazione VPN salvata. Una volta selezionato il file, inseriamo nella finestra che si apre la password per sbloccare la chiave privata, quindi salviamo. Per connettersi è sufficiente fare click sull’icona della rete, selezionare Connessione VPN e selezionare il profilo appena creato. Dopo qualche secondo comparirà una notifica e saremo connessi alla rete.

(fonte parziale: MelGrubb.ToBlog())