Debian 8 – Come installare un server openVPN

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:

  1. un server con Debian 8
  2. 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.