OpenVPN è un software open source che permette di instaurare connessioni VPN di tipo Point-to-Point (tra due macchine individuali) o Site-to-Site (tra due reti private) attraverso una rete non sicura come internet. Utilizza un protocollo di sicurezza personalizzato che è basato su SSL e TLS.
Per installare openVPN su un server che monta Debian 8 come sistema operativo ci serve:
- un server con Debian 8
- un accesso al server come utente root
1. Installazione di OpenVPN
Prima di installare qualsiasi software è sempre buona norma aggiornare la cache del gestore pacchetti
# apt-get update
Ora installiamo i pacchetti necessari che sono il server OpenVPN e il pacchetto easy-RSA per la cifratura
# apt-get install openvpn easy-rsa
2. Creazione e configurazione di una CA (Certificate Authority)
OpenVPN usa certificati per criptare il traffico sulla VPN. Pertanto si rende necessario creare una propria CA (Certificate Authority) che generi e firmi tutti i certificati necessari a server e client per connettersi e dialogare tra di loro in maniera sicura. OpenVPN supporta l’autenticazione bidirezionale basata su certificato e questo significa che il client deve autenticare il certificato del server e il server deve autenticare il certificato del client prima che la comunicazione sia instaurata.
Per far questo usiamo easyRSA
Prima di tutto copiamo la directory con gli script di manutenzione dei certificati all’interno della directory di configurazione di OpenVPN
# cp -r /usr/share/easy-rsa/ /etc/openvpn
Poi in quella directory creiamo una nuova directory che osptireà le chiavi
# mkdir /etc/openvpn/easy-rsa/keys
Poi settiamo i parametri per la creazione del nostro certificato editando l’apposito file
# vi /etc/openvpn/easy-rsa/vars
I parametri evidenziati in rosso dovranno essere modificati in accordo con le proprie preferenze
export KEY_COUNTRY="US" export KEY_PROVINCE="CA" export KEY_CITY="SanFrancisco" export KEY_ORG="My Company Name" export KEY_EMAIL="me@myhost.mydomain" export KEY_OU="MYOrganizationalUnit"
Nello stesso file, appena sotto queste direttive troviamo
# X509 Subject Field export KEY_NAME="EasyRSA"
Per semplicità suggerisco di usare server come nome della chiave. Se si usa qualcos’altro si dovrà usare lo stesso nome anche nei file server.conf di OpenVPN (vedi punto 4) dove si fa riferimento a server.crt e server.key.
Quindi la riga diventerà
# X509 Subject Field export KEY_NAME="server"
Salviamo e usciamo dal file.
Ora generiamo i parametri Diffie-Helman utilizzando un tool di OpenSSL chiamato dhparam e specifichiamo una lunghezza di 2048.
# openssl dhparam -out /etc/openvpn/dh2048.pem 2048
Sullo schermo appariranno una serie di caratteri che indicano che la generazione del certificato è in corso.
Al termine posizioniamoci nella directory easy-rsa/ e prepariamoci alla creazione della CA.
# cd /etc/openvpn/easy-rsa
Prima inizializziamo la PKI cioè la Public Key Infrastructure. Attenzione a come è scritto questo comando. Il punto e lo spazio prima del comando sono indispensabili perché indicano come sorgente la directory di lavoro attuale.
# . ./vars
Al termine dell’esecuzione di questo comando riceveremo un avviso di questo tipo
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys.
cioè saranno cancellate le eventuali chiavi e certificati già presenti nella directory /etc/openvpn/easy-rsa/keys perché potrebbero interferire con quelli nuovi, ma al momento la directory dovrebbe essere vuota, quindi nessun pericolo. Eseguiamo quindi il comando incriminato
# ./clean-all
Ora dobbiamo creare la CA usando il comando OpenSSL. Nota bene: questo comando dovrebbe domandarti di confermare il “Distinguished Name” che abbiamo inserito prima (server). Confermiamo con INVIO.
# ./build-ca
Le variabili settate in precedenza dovrebbero ricomparire come valore di default che dobbiamo semplicemente confermare con INVIO. Al termine avremo la nostra nuova e fiammante Certificate Authority perfettamente configurata e funzionante.
3. Generazione di un certificato e di una chiave per il server
Restando ancora nella directory /etc/openvpn/easy-rsa creiamo la chiave con il nome del server. Questo è stato specificato in KEY_NAME all’interno del file di configurazione (vedi punto 2) e in questo tutorial è server
# ./build-key-server server
Riceveremo nuovamente la richiesta di conferma del Distinguished Name oltre che di una password e di una company name. Diamo INVIO a tutto lasciando in bianco la password.
Al termine saremo nuovamente interrogati
Sign the certificate? [y/n] 1 out of 1 certificate requests certified, commit? [y/n]
Rispondiamo a tutto con (y) e otterremo l’aggiornamento del database
Write out database with 1 new entries Data Base Updated
Procediamo quindi alla copia del certificato e delle chiavi nella directory più comoda per OpenVPN
cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn
4. Configurazione di OpenVPN
L’installazione di OpenVPN porta con se degli utilissimi file precompilati contenenti comodi esempi di file di configurazione completamente commentati. Volendo possiamo usare quello sel server e poi personalizzarlo secondo le nostre necessità. Per farlo dobbiamo scompattarlo nella directory di configurazione di OpenVPN
# gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
Oppure possiamo partire da un file vuoto. Alla fine dovremo comunque sempre editarlo con questo comando
# vi /etc/openvpn/server.conf
Ora lo dobbiamo trasformare modificando le voci e commentando o decommentando le direttive per farlo diventare simile o se vogliamo identico a questo
port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh2048.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt client-config-dir ccd route 192.168.0.0 255.255.255.0 client-to-client push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220" keepalive 10 120 comp-lzo user nobody group nogroup persist-key persist-tun status openvpn-status.log verb 3 log /var/log/openvpn.log
Cerchiamo di spiegare le principali direttive cosa significano. Ricordo che il file scompattato sopra riporta tutte le direttive commentate in maniera esaustiva. Consiglio quindi di leggerlo con attenzione.
port 1194
Indica al server su quale porta deve mettersi in ascolto. Questa stessa porta dovrà poi essere abilitata sul nostro firewall altrimenti nessuna connessione in entrata raggiungerà mai il server OpenVPN
proto udp
Indica il protocollo da usare, in questo caso udp.
dev tun
La periferica virtuale che verrà generata come punto di ingresso della VPN può essere di tipo tap o tun. Userò una tap se voglio creare un bridge tra i due punti della VPN, mentre userò tun se i due punti saranno interconnessi da un tunnel virtuale che soddisfa regole di routing. Questo tutorial spiega proprio questo secondo caso.
ca ca.crt cert server.crt key server.key
Indicano i nomi dei file contenenti il root certificate (CA), il certificate (cert) e la chiave privata (key). Questi file sono quelli che sono stati generati al punto 2, quindi se era stato cambiato il nome nella direttiva export KEY_NAME=”server” dovremo usare lo stesso nome anche qui. Il file della chiave privata DEVE restare segreto.
dh dh2048.pem
Definisce i parametri Diffie hellman per la procedura dello scambio delle chiavi in maniera sicura
server 10.8.0.0 255.255.255.0
Questa direttiva indica al server qual’è la rete da instaurare tra server e client a livello di connessione VPN. In questo esempio sostanzialmente il server e i client riceveranno indirizzi della rete 10.8.0.0/24
ifconfig-pool-persist ipp.txt
Serve per dire al server di tenere traccia degli indirizzi assunti dai client e di riassegnare gli stessi in caso la connessione cada e venga poi ristabilita.
client-config-dir ccd
Indica dove si trova la directory dove sitrovano i file di configurazione di ciascun client. In questo caso è ccd/ e si trova relativa alla directory dove sta il file di configurazione (/etc/openvpn/)
route 192.168.0.0 255.255.255.0
All’attivazione della VPN il server OpenVPN aggiunge al sistema la regola di routing. Questa significa che la rete 192.168.0.255 si trova atraversando la porta tun. Questa regola non è indispensabile se vogliamo solo che la rete del client possa uscire dal server (la rete uscirà masherata da iptables), ma è indispensabile se invece vogliamo che il server stesso possa raggiungere la rete del client.
push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220"
Con push facciamo in modo di inviare al client che si connette la regola inserita tra doppi apici. La prima dice al client che tutto il traffico dovrà essere rediretto nella VPN che farà da nuovo gateway bypassando le indicazioni del dhcp. Le altre due regole dicono al client che i DNS da usare sono quelli di openDNS. Queste ultime due regole sono però valide solo nel mondo Windows.
comp-lzo
Definisce l’uso della compressione dei dati sulla connessione VPN. Anche i vari client devono avere questa regola nelle loro configurazioni.
user nobody group nogroup
Siccome OpenVPN “gira” con privilegi di root è buona norma limitare i privilegi del demone. Su Windows può essere ignorata.
persist-key persist-tun
Evitano l’accesso a certe risorse che diventano inaccessibili dopo che i privilegi del demone vengono ridotti.
status openvpn-status.log verb 3 log /var/log/openvpn.log
Queste definiscono i file di log e il loro livello di dettaglio.
5. Avvio del server
A questo punto abbiamo la CA, abbiamo certificato e chiave del server nella directory di lavoro nonché il file di configurazione aggiornato con i parametri desiderati. Non ci rimane che avviare il server.
# service openvpn start # service openvpn status
L’ultimo comando dovrebbe generare un output di questo tipo
openvpn.service - OpenVPN service Loaded: loaded (/lib/systemd/system/openvpn.service; enabled) Active: active (exited) since Fri 2017-06-16 20:48:26 CEST; 2s ago Process: 24593 ExecStart=/bin/true (code=exited, status=0/SUCCESS) Main PID: 24593 (code=exited, status=0/SUCCESS)
Jun 16 20:48:26 vps417034.ovh.net systemd[1]: Started OpenVPN service.
Attenzione che deve apparire active (exited) anziché inactive (dead).
Il server OpenVPN è ora attivo e funzionante. In caso di errori verificare il file di log /var/log/syslog.
A questo punto non rimane altro che creare certificato e chiave per ciascun client che vogliamo acceda alla nostra VPN.
6. I client: configurazione e generazione di certificato e chiave
In OpenVPN, come in ogni altro software per la gestione delle VPN che si rispetti, è possibile configurare ogni singolo client che si collega con un’apposita configurazione e delle proprie personali chiavi di accesso. Volendo è ovviamente possibile anche condividere tra tutti i client un singolo certificato e una singola chiave, ma è un’operazione che personalmente sconsiglio e anche OpenVPN, infatti, come impostazione standard non lo prevede; ma è possibile farlo inserendo nel file di configurazione del server (vedi punto 4) questa direttiva:
duplicate-cn
Il file di configurazione (lato server) di ciascun client deve essere posizionato nella directory /etc/openvpn/ccd/ (in accordo con le impostazioni del file di configurazione del server, punto 4) e può contenere tutte le direttive necessarie all’accesso di quel client. Da notare il fatto che questo file viene letto ed eseguito a collegamento avvento client-server e che ciascun file deve chiamarsi con lo stesso Distinguished Name che è stato usato per generare il certificato del client (lo vedremo tra poco).
Una direttiva interessante e che potrebbe risultare utile inserire in questi file di configurazione è iroute, cioè una internal route che può essere usata per istruire il server OpenVPN su come raggiungere la rete del client. OpenVPN infatti ha un suo sitema di routing interno e iroute permette di configurarlo. Quindi il file /etc/openvpn/ccd/client1 potrebbe essere fatto così:
iroute 192.168.0.0 255.255.255.0
Il che dice al server stesso che se deve raggiungere la rete 192.168.0.0/24 allora deve passare dal tunnel instaurato col client1
Vediamo ora la generazione del certificato e della chiave per un client. Se necessario creare chiavi per diversi client allora va replicata questa procedura e cambiato client1 di volta in volta (es. client2, client3, mariorossi, ecc…).
Ci dobbiamo posizionare sempre nella directory /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
Quindi dobbiamo generare certificato e chiave
# ./build-key client1
Verrà richiesto di confermare il Distinguished Name (premere INVIO) e poi apparirà qualcosa di simile a quanto riportato qui sotto. Anche qui confermiamo lasciando vuoti i campi e diamo INVIO
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Come per il certificato del server dovremo firmarlo e aggiungerlo al database, per farlo dovremo rispondere (y) a queste due domande:
Sign the certificate? [y/n] 1 out of 1 certificate requests certified, commit? [y/n]
A questo punto otterremo la risposta qui sotto a conferma del buon esito della generazione del certificato
Write out database with 1 new entries. Data Base Updated
Nella sotto-directory keys/ troviamo certificato e chiavi appena create.
I client software OpenVPN normalmente sono in grado di leggere da un singolo file tutta la configurazione e i certificati necessari a collegarsi al server. Dobbiamo quindi crearne uno partendo da uno di quelli di esempio che ci siamo precedentemente installati. Nota bene: per questioni di convenzione il file deve avere estensione .ovpn.
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client1.ovpn
Quindi lo possiamo editare e rendere simile a questo
client dev tun proto udp remote <ip_del_server_OpenVPN> 1194 resolv-retry infinite nobind persist-key persist-tun comp-lzo verb 3 auth-user-pass <ca> <qui va l'intero contenuto del file ca.crt> </ca> <cert> <qui va l'intero contenuto del file client1.crt> </cert> <key> <qui va l'intero contenuto del file client1.key> </key>
Nel caso in cui si installi in un ambiente linux è possibile anche inserire le seguenti direttive che non hanno effetto in ambiente Windows
user nobody group no group
7. Abilitiamo il Packet Forwarding
Per fare in modo che il kernel sia in grado di inoltrare i pacchetti dai servizi client verso internet bisogna abilitarlo
echo 1 > /proc/sys/net/ipv4/ip_forward
e per rendere definitiva l’impostazione anche ai prossimi riavvi bisogna editare il file
vi /etc/sysctl.conf
e decommentare la riga net.ipv4.ip_forward=1
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
Salvare e uscire.
7. Configurazione del firewall iptables
Installiamo il firewall
apt-get install iptables iptables-persistent
Poi definiamo le regole standard (dovrebbero già essere così)
iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT
Poi diciamo al firewall di accettare le connessioni SSH (porta 22), quelle in loopback e sulla porta del server OpenVPN
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 1194 -j ACCEPT iptables -A INPUT -i lo -j ACCEP
Poi accettiamo le connessioni sulla porta tun
iptables -A INPUT -i tun+ -j ACCEPT
Poi diciamo al firewall di accettare l’inoltro delle connessioni dalla porta tun verso le altre interfacce
iptables -A FORWARD -i tun+ -j ACCEPT iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
Ora natto il traffico della VPN verso internet
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Inoltre se la policy di default della catena di output non è ACCEPT allora va anche aggiunta la regola
iptables -A OUTPUT -o tun+ -j ACCEPT
Per salvare le regole definitivamente si deve usare il comando
netfilter-persistent save
8. Conclusioni
Fine! La configurazione necessaria per OpenVPN si conclude qui. Provando a collegarsi col client si dovrebbe poter navigare su internet mascherati con l’ip del server OpenVPN.