Introduzione a OpenVPN

19 Agosto 2014
  • Linux
  • VPN



In questa strana estate la nostra voglia di imparare qualche cosa di nuovo non si esaurisce mai.

Questa volta parleremo di VPN, ovvero le Virtual Private Network: il modo più semplice per mettere in comunicazione computer distanti, come se stessero nella stessa rete locale.

Un paio di giovedì fa infatti, Federico ha buttato lì l’idea di raccontarci la sua esperienza con OpenVPN.
Non ci siamo fatti scappare l’occasione di capire un po’ meglio come funziona questa soluzione open source, quindi tutti in sala corsi per seguire la sua esposizione:

E’ partito alla grande, andando “a braccio”, visto che non ha avuto il tempo di preparare una documentazione.

Come spesso capita nelle presentazioni, l’inciampamento è dietro l’angolo. Abbiamo così chiesto a Federico di prepararci una guida, per avere chiari tutti i passaggi e per poter far fronte alle difficoltà, qualora si verificassero.

Ecco quindi il frutto del suo lavoro:

OpenVPN è una VPN open source capace di attraversare firewall e NAT.
Prima di tutto, installiamola con:
# apt-get update
# apt-get install openvpn

Useremo una autenticazione a certificati, ovvero saranno abilitati ad accedere tutti i client con un certificato firmato dalla nostra autorità di certificazione.
Essendo anche il certificato del server, all’atto della connessione, i client certificano l’autenticità del server e viceversa.

Per generare i certificati sono già disponibili degli script per semplificare il processo.
# cd /etc/openvpn
# mkdir easy-rsa
# cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* easy-rsa/

Modifichiamo il file /etc/openvpn/easy-rsa/vars con dati più appropriati:
export KEY_COUNTRY=”IT” 
export KEY_PROVINCE=”PV” 
export KEY_CITY=”SanMartinoSiccomario” 
export KEY_ORG=”comPVter” export KEY_EMAIL=”dino@compvter.it” 
export KEY_EMAIL=dino@compvter.it

Poi eseguiamo:
# cd easy-rsa/ 
# touch keys/index.txt 
# echo 01 > keys/serial 
# . ./vars 
# set environment variables 
# ./clean-all

Generiamo la coppia chiave/certificato dell’Autorità di Certificazione:
# ./build-ca

Generiamo la coppia chiave/certificato del server:
# ./build-key-server server

Generiamo i parametri DIFFIE-HELLMAN:
./build-dh

E una coppia chiave/certificato per ogni client
./build-key client name

E ripetiamo il comando precedente per ogni client che vogliamo far connettere alla nostra rete.
Abbiamo così generato tutti i certificati di cui abbiamo bisogno.

Ora bisogna fare la configurazione del server.

Creiamo il file /etc/openvpn/server.conf come segue:
port 1194 
proto udp 
dev tun

ca /etc/openvpn/easy-rsa/keys/ca.crt # generated keys 
cert /etc/openvpn/easy-rsa/keys/server.crt 
key /etc/openvpn/easy-rsa/keys/server.key # keep secret 
dh /etc/openvpn/easy-rsa/keys/dh1024.pem

server 10.9.8.0 255.255.255.0 # internal tun0 connection IP 
ifconfig-pool-persist ipp.txt

keepalive 10 120

comp-lzo # Compression – must be turned on at both end 
persist-key 
persist-tun

verb 3 # verbose mode 
client-to-client

Se riceviamo un bell’OK verde, abbiamo il nostro server funzionante.

A questo punto basta aprire la porta 1194 UDP sul firewall e se siamo nattati dietro modem ADSL, inoltrare la porta al nostro server.

Lato client la configurazione è la seguente:
client 
dev tun 
port 1194 
proto udp

remote VPNSERVER_IP 1194 # VPN server IP : PORT 

nobind

ca ca.crt 
cert clientname.crt 
key clientname.key

comp-lzo 
persist-key

persist-tun


Assieme al file, che funziona su tutte le piattaforme con I relativi client OpenVPN, dobbiamo copiare dalla cartella /etc/openvpn/easy-rsa  i file
Ca.crt
Clientname.crt
Clientname.key

Dove “clientname” è ovviamente il nome del client.
Vanno modificate le relative righe nel file di configurazione.

Ora il nostro client dovrebbe connettersi, ma non avremo accesso alla nostra LAN.

Questo perché al client manca la rotta statica, il server non instrada pacchetti e il nostro router di casa non ha la rotta di ritorno per il segmento della nostra VPN.

Andiamo un passo alla volta.

Apriamo il file /etc/sysctl.conf. Modifichiamo o aggiungiamo la riga:
net.ipv4.ip_forward = 1

Questo avrà effetto solo dal prossimo riavvio. Per accelerare i tempi, eseguiamo
#echo 1 > /proc/sys/net/ipv4/ip_forward

Ora dobbiamo aggiungere una riga sul fondo del file /etc/openvpn/server.conf
push “route 192.168.0.0 255.255.255.0”

Dove 192.168.0.0 è la nostra subnet casalinga. Per alcuni è 192.168.1.0

Riavviamo il server openvpn con
# /etc/init.d/openvpn restart

In ultimo, eseguiamo:
#iptables -A FORWARD -i eth0 -o tun0 -m state –state ESTABLISHED,RELATED -j ACCEPT 
#iptables -A FORWARD -s 10.9.8.0/24 -o eth0 -j ACCEPT 
#iptables -t nat -A POSTROUTING -s 10.9.8.0/24 -o eth0 -j MASQUERADE

Ora il nostro server OpenVPN dovrebbe funzionare, e dovremmo essere in grado di accedere alla nostra rete di casa da dovunque ci troviamo, su qualunque piattaforma.

Tutto chiaro ? Beh, ora avete un vostro tunnel privato che attraversa internet. Contenti ?