Rete privata virtuale ( VPN ) con Debian 9

Condividi:
OpenVPN
Logo OpenVPN

In molti casi è necessario raggiungere l’interno di una rete aziendale o casalinga, da dispositivi collegati ad internet come pc o smartphone quando ci si trova fuori sede. In questi casi la soluzione ideale è quella di avere a disposizione una rete privata con cui far comunicare su connessione cifrata tutti i dispositivi collegati ad internet che dispongono delle credenziali di accesso, ovvero una VPN

In questo articolo istalleremo una VPN su un server Debian, nello scenario in cui esiste un server remoto direttamente collegato ad internet su cui è presente un firewall iptables. Altri scenari, dove il server è collegato ad un router che necessita di essere configurato per il nat ed il forwarding verso il server non sono contemplati

Su questo server installeremo la vpn ed una certificate authority per la creazione e la firma dei certificati che verranno usati per autenticare i client e cifrare la connessione

Preparazione

Per configurare la vpn abbiamo bisogno di alcune informazioni riguardanti il server a cui ci collegheremo, primo fra tutti l’indirizzo ip pubblico a cui risponderà la vpn. Come vedremo nel corso del tutorial, dovremo anche conoscere le interfacce di rete tra cui abilitare un eventuale traffico tramite il firewall. Tutte queste informazioni le otteniamo tramite il comando ip

In questo tutorial ipotizziamo di avere questi dati

IP pubblico 98.76.54.32
IF rete internet eth0
Rete interna 192.168.1.0/24
IF rete interna eth1
Installazione

Per prima cosa installiamo il software necessario, ovvero i pacchetti openvpn ( che rende disponibili i servizi vpn) ed easy rsa ( una serie di script basati su openssl per amministrare una certificate authority )

Creiamo la Certificate Authority

Le comunicazioni su vpn avvengono in maniera cifrata tramite scambio di chiavi tra client e server e per generare queste chiavi abbiamo bisogno di una certificate authority

L’installazione del pacchetto openvpn ha creato la cartella /etc/openvpn, ed è qui che noi installeremo la CA. Per creare la CA eseguiamo script make-cadir passandogli il percorso della cartella in cui inserire gli script

Spostiamoci nella cartella /etc/openvpn/certs e visualizziamone il contenuto. Ci saranno alcuni file openssl-*.cnf, dobbiamo creare un link simbolico su quello con il numero di versione più recente

Ora editiamo il file vars che contiene un lungo elenco di variabili. Quelle che ci interessa editare sono solo otto:

KEY_SIZE Si può anche lasciare 2048, ma noi aumenteremo la lunghezza della chiave portando questo valore a 4096. Il retro della medaglia è negoziazione TLS leggermente più lenta
Seguono alcuni campi che sono quelli principali del certificato, devono essere tutti valorizzati
KEY_COUNTRY Codice del paese. Es “IT”
KEY_PROVINCE Codice dello stato o della provincia. Es “MI”
KEY_CITY Nome della città. Es “Milano”
KEY_ORG Nome dell’ organizzazione. Es “Evil Corp.”
KEY_EMAIL Email del sysadmin
KEY_OU Nome dell’ Organization Unit. Es “Undercover Operations”
L’ultimo valore rappresenta il campo Subject del certificato X509
KEY_NAME Si può anche lasciare “EasyRSA”, ma possiamo inserire un nome diverso per la nostra CA, Es. “EvilCorp-CA”
Le chiavi della CA

Le chiavi della CA sono relative al server e vanno create solo la prima volta che lo istalliamo. Per la configurazione di vpn successive alla prima possiamo saltare questo passaggio

Siamo nella cartella della CA

Carichiamo le variabili che abbiamo impostato nel file vars

Un messaggio ci avvertirà che eseguendo ./clean-all elimineremo le chiavi salvate, ma dovendo preparare la CA per la prima volta dobbiamo inizializzare la cartella quindi eseguiamo clean-all

A questo punto è tutto pronto per generare la CA. Ci verranno poste delle domande a cui risponderemo con i valori proposti ( che sono quelli inseriti nelle variabili d’ambiente contenute in ./vars )

Nella cartella keys verranno creati vari files tra cui ca.key e ca.crt che sono rispettivamente la chiave privata ed il certificato firmato della CA

Per ragioni di sicurezza, è importante che la chiave privata sia accessibile solo all’utente root quindi i permessi dovrebbero essere 600 o meglio ancora 400

Le chiavi del server

Come per la CA, creiamo queste chiavi solo la prima volta che installiamo il server, per la configurazione di vpn successive alla prima possiamo saltare questo passaggio

Il certificato Diffie Hellman

Quando il client ed il server iniziano la comunicazione, per creare la connessione sicura negoziano una secret ed è qui che interviene il protocollo Diffie Hellman. Il server VPN necessita quindi di un certificato per eseguire questa operazione che va generato

Impostiamo 4096 come lunghezza della chiave, anche qui paghiamo la maggiore sicurezza con una maggiore lentezza nella negoziazione e nella creazione del certificato stesso

Questo processo impiegherà diversi minuti, dipende dalla potenza di calcolo della macchina

La chiave HMAC

Questa chiave viene utilizzata dal server per firmare tutti i pacchetti che vengono inviati in modo da accettare solo comunicazioni che provengono da macchine che condividono le chiavi. Aggiunge un ulteriore livello di sicurezza.

A questo punto abbiamo tutte le chiavi che ci servono per far funzionare il server, la vpn e per generare i certificati da distribuire ai client che devono connettersi

Le chiavi del servizio vpn

Il server VPN può servire più vpn contemporaneamente, quindi da questo punto in poi dobbiamo entrare nell’ottica di scegliere i nomi in maniera tale da riferirci ad una specifica vpn più che all’unica presente evitando di usare nomi generici come ‘server’

Da  questo passaggio in poi del presente tutorial, possiamo creare la prima, o le successive vpn gestite dal server, ma ciascuna necessita della propria copia di chiavi firmate dalla CA

In questo tutorial, creiamo una vpn chiamata evilcorpvpn

Nome VPN evilcorpvpn

Siamo nella cartella della CA e se non lo abbiamo già fatto carichiamo le variabili contenute nel file vars

Eseguiamo lo script build-key-server passandogli il nome del servizio che vogliamo creare che per il momento sarà server.

Come per la creazione della CA, ci verranno poste una serie di domande. Possiamo lasciare vuoto il campo relativo alla challenge password ma dovremo rispondere YES quando ci verrà chiesto di firmare il certificato ed alla domanda finale di commit

Nella cartella keys, vengono salvate versioni di backup dei file index.txt e serial che vengono aggiornati. Il processo crea i file 01.pem, evilcorpvpn.crt, evilcorpvpn.csr e evilcorpvpn.key in accordo con il nome che abbiamo scelto e che ci serviranno poi nella fase di creazione del servizio openvpn vero e proprio

01.pem Il certificato che è stato firmato dalla CA. PEM sta per Privacy Enhanced Mail, lo scambio di chiavi pubbliche tramite mail è caduto in disuso, ma il formato pem come contenitore di chiavi è rimasto valido.
evilcorpvpn.crt E’ la copia di 01.pem e rappresenta il certificato del server contenente la chiave pubblica
evilcorpvpn.csr E’ la Certificate Signing Request usata per firmare il certificato
evilcorpvpn.key E’ la chiave privata del server
Configurazione del servizio

Configureremo la vpn in questo modo

Nome del servizio evilcorpvpn
IF tunnel tap
IP pubblico 98.76.54.32
Porta 1194
Protocollo UDP
Rete VPN 10.1.0.0/24

Il nostro servizio, si chiamerà evilcorpvpn ed utilizzerà le chiavi create in precedenza. Dovendo configurare una seconda, una terza vpn ecc… dovremo usare nomi diversi per ciascuna vpn differenziando i nomi dei file .conf, i nomi delle chiavi e le porte tcp o udp di ascolto del servizio

Creiamo una copia del file di configurazione di esempio salvandolo nella cartella /etc/openvpn con estensione .conf

Ciascun file .conf presente in questa cartella rappresenta un servizio che può ricevere il comando di start all’avvio del server, quindi ogni .conf rappresenta una vpn

Compatibilmente con i nomi scelti prima per le chiavi, chiamiamo questo file evilcorpvpn.conf

Dobbiamo editare questo file per inserire i parametri necessari alla nostra vpn, in primis i riferimenti alle chiavi create in /etc/openvpn/certs/keys, quella per la CA che sarà unica per tutti i servizi che creeremo, e quelle specifiche del servizio in questione

Il certificato Diffie-Hellman /etc/openvpn/dh4096.pem

E nella sezione tls-auth il riferimento alla chiave HMAC che avrà uno 0 alla fine della riga

Controlliamo che sia abilitata la crittografia a 256 bit

Le prossime due opzioni, non sono indispensabili e  potrebbero non essere presenti nel file di default pertanto le dovremo aggiungere alla fine

La prima riguarda il livello di crittografia che il server utilizzerà per l’autenticazione, useremo SHA512

La seconda serve per imporre ad openvpn di utilizzare la massima cifratura possibile

Possiamo scegliere l’indirizzo ip di ascolto del server vpn, normalmente questa opzione è commentata ma noi possiamo inserire qui il nostro indirizzo ip pubblico

La porta di ascolto secondo il protocollo vpn è la 1194 ma volendo la possiamo cambiare

Il tipo di protocollo, udp o tcp

Il tipo di interfaccia usato per creare il tunnel vpn, tun o tap

L’indirizzo di rete in cui inserire i client connessi alla vpn

Fine tuning del servizio

Sempre in /etc/openvpn/evilcorpvpn.conf possiamo aggiungere altri parametri di configurazione, molti dei quali dipendenti dalla topologia di rete a cui ci dobbiamo collegare

Con le impostazioni di default, il server dice ai client di utilizzare la vpn come default gateway per tutto il traffico. Se vogliamo prevenire questo comportamento, dobbiamo editare /etc/openvpn/evilcorpvpn.conf cercare la riga contenente

e commentarla così:

Una volta entrati in vpn i nostri client potrebbero voler raggiungere macchine presenti in una rete diversa collegata al server, per cui vanno specificati precisi parametri per il routing di quelle connessioni.
Il servizio openvpn invierà questi comandi ai client tramite il comando push. Ad esempio, se volessimo raggiungere la subnet 192.168.1.0/24 utilizzando il server vpn come gateway

Se vogliamo dare la possibilità ai client connessi in vpn di comunicare tra di loro, togliamo il commento al parametro client-to-client

Possiamo abilitare la compressione sulla connessione, ma questa opzione dovrà essere presente anche nei file di configurazione dei client

Possiamo eseguire il servizio con l’utente nobody/nogroup a disposizione de commentando le due linee

Oppure possiamo eseguire il servizio con un utente diverso appositamente creato

Di default il log finisce in syslog, ma possiamo decidere se tenere un file di log ed assegnargli il nome. Usando log, il file che verrà ricreato ad ogni avvio, con log-append invece i messaggi continueranno ad essere accodati. Se non specifichiamo alcun percorso, i file vengono creati in /etc/openvpn, ma volendo si possono creare in /var/log

Lo stesso vale per il file log di status

Altre opzioni sono disponibili e ben commentate all’interno del file di configurazione

Avvio della vpn sul server

Testiamo la vpn eseguendo openvpn da bash in modo da vedere nel log eventuali segnalazioni di errore

Il file evilcorpvpn.conf viene letto dal demone openvpn che lo riconosce come servizio chiamato con lo stesso nome del file di configurazione senza l’estensione .conf. Per avviare la vpn come servizio di sistema quindi, ci riferiremo ad openvpn@evilcorpvpn. Se avessimo configurato altre vpn, le dovremmo avviare nello stesso modo

Per rendela operativa all’avvio del sistema

Per spegnere la vpn

Per visualizzarne lo stato

Utilizzando openvpn senza @ permette di avviare tutte le vpn configurate, ma avendone più di una potremmo voler decidere quale avviare e quale no

Firewall

Molto probabilmente la configurazione di iptables sul server avrà DROP  come policy di default per le tabelle di INPUT e FORWARD ed ACCEPT per la tabella OUTPUT, quindi dobbiamo abilitare il traffico in ingresso ed eventualmente il routing dei pacchetti tra le varie interfacce coinvolte, nel caso volessimo uscire su internet tramite la vpn o collegare la vpn ad altre reti con cui il server è collegato

In ogni caso dobbiamo identificare le varie interfacce di rete

In questo esempio, con la vpn online, ipotizziamo di avere l’interfaccia eth0 collegata ad internet, tun0 collegata alla rete virtuale 10.8.0.0/24 ed eth1 collegata ad una rete interna 192.168.1.0/24

L’abilitazione del traffico in ingresso è mandatoria altrimenti non ci collegheremo mai alla vpn da internet. Sorvolando sull’eventuale fine tuning di iptables che esula da questo tutorial, poichè abbiamo impostato la vpn per lavorare in UDP sulla porta standard 1194, inseriamo questa regola

Nel caso la policy di OUTPUT fosse DROP, dobbiamo abilitare anche il traffico generato da openvpn

Per abilitare il traffico tra la vpn e le altre interfacce, dobbiamo accertarci che sia abilitato l’ip forwarding sulla macchina

Abilitiamo l’inoltro dei pacchetti provenienti dalla vpn

Per abilitare il traffico sulla rete interna, accettiamo i pacchetti provenieni da eth1

Per quanto riguarda il traffico internet, oltre ad abilitare il traffico nella chain FORWARD, dobbiamo abilitare il MASQUERADE del traffico generato nella subnet della vpn sulla chain POSTROUTING della tabella nat

I file di autenticazione dei client

Per collegarsi alla vpn, ogni client deve avere un certificato firmato dalla nostra CA ed un file di configurazione che rifletta le specifiche impostate per la vpn

Creiamo quindi un certificato per ogni client. Spostiamoci nella cartella della CA e carichiamo le variabili del file vars

Come nome per il certificato, poichè potremmo avere più di una vpn , possiamo utilizzare una coppia che richiami il nome della vpn ed il nome del client. Avendo scelto evilcorpvpn come nome della nostra vpn, per il client allsafe potremmo usare ad esempio evilcorpvpn-allsafe

Ci verranno poste una serie di domande, accetteremo tutti i valori proposti ignorando la challenge password e risponderemo YES per la firma del certificato e la commit finale

Come per la creazione del certificato di evilcorpvpn, vediamo che il contenuto della cartella keys è cambiato. I file index.txt e serial sono stati backuppati, index.txt è stato aggiornato con il riferimento al nuovo file pem, come prima avremo 3 nuovi file relativi alle due nuove chiavi privata e pubblica che sono evilcorpvpn-allsafe.crt, evilcorpvpn-allsafe.csr e evilcorpvpn-allsafe.key. evilcorpvpn-allsafe.crt e evilcorpvpn-allsafe.key sono la chiave pubblica e privata che dovremo inviare al client allsafe ( insieme alla chiave pubblica della CA ca.crt e quella di autenticazione ta.crt )

Il file di configurazione lo creiamo in /etc/openvpn/client/ prendendo una copia di quello di esempio. Anche questo file dovremo successivamente inviarlo al client

Editiamo il file ed aggiorniamo i valori in accordo con quelli impostati per la vpn

In remote inseriamo l’ indirizzo ip internet del server e la porta di ascolto

I nomi delle chiavi generate che eventualmente andremo a completare con il percorso nel filesystem del client openvpn. Notare che tls-auth qui termina con 1 mentre sul server termina con 0

La cifratura a 256 bit

Le opzioni di autenticazione e per scegliere il livello più elevato di crittografia

Se abbiamo attivato la compressione sul server dobbiamo attivarla anche sul client

Invio dei file al client

Creiamo un archivio contenente 5 files tra cui il file di configurazione, le chiavi pubblica e privata del client, la chiave pubblica della ca e la chiave di autenticazione

Ora possiamo inviare il file /etc/openvpn/client/evilcorpvpn-allsafe.tar.gz al client allsafe

Configurazione di client
Client Debian Linux

Sul nostro client allsafe, decomprimiamo l’archivio evilcorpvpn-allsafe.tar.gz

Poichè un client può connettersi a più vpn, è più ordinato tenere separati i file relativi a ciascuna connessione. Creiamo una cartella con il nome della nostra evilcorpvpn in /etc/openvpn/client e copiamoci dentro le 4 chiavi ed il file .ovpn

Ora in /etc/openvpn, creiamo in link simbolico sul file .ovpn usando come estensione .conf, sarà questo file quello che verrà letto dal demone openvpn

Ora editiamo il file puntato dal link simbolico /etc/openvpn/evilcorpvpn-allsafe.conf aggiornando i percorsi delle 4 chiavi

Dopo aver avviato il servizio sul server, testiamo il collegamento

Se il collegamento è andato a buon fine e non sono evidenti messaggi di errori, possiamo decidere se avviare la vpn al boot del client. Vale quanto detto nella parte server, il servizio a cui fare riferimento è openvpn@ seguito dal nome del file .conf senza estensione

Per verificare la comunicazione sulla vpn, identifichiamo l’interfaccia di rete che è stata creata che in assenza di altri servizi che istanziano interfacce tuntap, dovrebbe essere tun0

Per il test utilizziamo ping che forzeremo in modo da utilizzare l’interfaccia collegata alla vpn

Verifichiamo il collegamento con l’endpoint del server nella vpn.

Se avessimo altri client collegati potremmo conoscere i loro ip visualizzando il contenuto del log di status che abbiamo configurato sul server. Questo log nella sezione ROUTING TABLE ci mostrerà per ogni client collegato l’indirizzo ip interno, il nome inserito nel certificato pem che utilizza, l’indirizzo ip remoto e l’orario dell’ultima trasmissione

Se abbiamo abilitato l’opzione client-to-client nel .conf della vpn, conoscendo gli indirizzi degli altri dispositivi connessi possiamo verificare che rispondano al ping

Per ogni client collegato, il server crea una subnet /30 utilizzando 4 indirizzi. Il primo indirizzo del pool è il network address, il secondo è l’end point del tunnel lato server, il terzo è l’ end point del tunnel lato client e l’ultimo è il broadcast address.

IP Address
Host Network Server EP Client EP Broadcast
Server 10.1.0.0 10.1.0.1 10.1.0.2 10.1.0.3
allsafe 10.1.0.4 10.1.0.5 10.1.0.6 10.1.0.7
Altro client 1 10.1.0.8 10.1.0.9 10.1.0.10 10.1.0.11
Altro client 2 10.1.0.12 10.1.0.13 10.1.0.14 10.1.0.15

I client prenderanno l’indirizzo ip lato client, mentre quello lato server sarà il loro gateway. Per il server invece vale l’opposto

Se abbiamo abilitato il traffico verso internet possiamo pingare il dns di google

Se abbiamo anche una rete interna collegata al server e ne abbiamo abilitato il routing, possiamo verificare la trasmissione verso gli host collegati

Client Windows

Copiamo e decomprimiamo l’archivio in una cartella sulla macchina windows, dopodichè scarichiamo il windows installer da Open VPN Community Downloads ed avviamo l’installazione, che installerà tutta la suite che comprende la CA, la parte server e la parte client, come nel nostro server Debian. A noi qui però interessa solo il client ovviamente.

Dalla barra degli strumenti cerchiamo l’icona relativa alla gui
Con il tasto destro scegliamo il menù impostazioni
Scegliamo il menù Avanzate dove sono presenti alcuni parametri. A noi interessa la cartella dove vengono salvati i file di configurazione che andremo ad inserire in una sottocartella dedicata per separarli dalla configurazione di altre vpn

Dentro questa cartella, creiamone una con il nome che abbiamo scelto per la nostra vpn ( evilcorpvpn) e copiamoci dentro il file evilcorpvpn-allsafe.ovpn e le 4 chiavi.
Normalmente non è necessario aggiornare i percorsi dei file delle chiavi perchè abbiamo creato il file di configurazione inserendo i 4 nomi senza precederli dal percorso ed il client windows cerca i file nella stessa cartella del file di ovpn. In caso di problemi potremmo avere bisogno di editare questi percorsi
A questo punto, cliccando col tasto destro sull’icona della gui di openvpn, dovremmo trovare questo menù che ci permette di effettuare il collegamento, visualizzare il log, modificare le impostazioni di configurazione ecc…
Se avessimo altre vpn configurate, verranno mostrati dei menù a tendina per accedere ad ognuna di esse. In questo caso vediamo la nostra evilcorpvpn-allsafe che permette di collegarci alla vpn
Cliccando su Connetti, apparirà una finestra con i messaggi di collegamento tra client e server ed infine troveremo l’icona verde nell’area di notifica che ci segnala che siamo collegati in vpn
Client Android

Anche per i client Android l’installazione è molto semplice. Si tratta di trasferire sul dispositivo il file di configurazione ovpn in cui compaiono i nomi delle chiavi senza il percorso, la chiave della ca, la chiave di autenticazione e le chiavi del client in una cartella all’interno del dispositivo

Da Google Play scarichiamo l’app OpenVPN Connect

Terminata l’installazione apriamo l’app

Selezioniamo l’ultima opzione in basso, OVPN Profile Connect with .ovpn file
Ci farà selezionare la cartella contenente il file .ovpn che abbiamo salvato nel dispositivo
Entriamo nella cartella e selezioniamo il file di configurazione .ovpn
Confermiamo e premiamo il bottone IMPORT
Digitiamo un nome per il profilo e premiamo il pulsante ADD
Clicchiamo sul bottone in grigio per collegare la vpn
Una volta connessi ci verrà mostrato il messagio CONNECTED con tutte le statistiche ed i dati relativi alla connessione