Ultimamente sto apprezzando molto le possibilita' offerte da OpenVPN, un software per la realizzazione di reti private virtuali:

OpenVPN is a full-featured SSL VPN solution which can accomodate a wide range of configurations, including remote access, site-to-site VPNs, WiFi security, and enterprise-scale remote access solutions with load balancing, failover, and fine-grained access-controls

Lo sto usando con discreta soddisfazione per accedere da remoto alla mia rete casalinga: fino a poco tempo fa utilizzavo esclusivamente tunnels generati con SSH2, ma da quando ho provato l'ebrezza della VPN (:-D) non posso piu' farne a meno! :-)

La configurazione da me utilizzata è abbastanza semplice ma mi permette di dare accesso a un buon numero di client senza problemi: oltre a me, infatti, sono collegate tramite VPN alla mia rete anche macchine di amici/colleghi fidati, alcuni anche in join al mio dominio Active Directory 'casalingo'.

Partiamo dal server:

Ubuntu GNU/Linux, kernel  2.6.12 (fino a qualche giorno il server girava su un Windows 2000 Server: le modifiche ai file di configurazione per la migrazione sono state minime).

Naturalmente in primis bisogna effettuare l'installazione di OpenVPN, e per questo lascio tutte le liberta' possibili: tramite APT, scaricando i sorgenti dal sito o utilizzando pacchetti precompilati di ogni tipo.

Il primo passo per la configurazone consiste nella generazione delle chiavi pubbliche e private necessarie all'autenticazione.

Per questo compito usiamo i tool della 'suite' Easy-RSA, installata insieme al pacchetto di OpenVPN.

Usiamo quindi il tool build-ca per generare il Certification Authority (CA) certificate (ca.crt), build-dh per i parametri Diffie-Hellmann, e build-key per generare le chiavi pubbliche e private della nostra VPN (ca.key). Dico pubbliche e private perche' nel mio caso non punto alla sicurezza 'stagna', ma alla comodita' di collegare altre reti alla mia in maniera semplice, rapida e economica.
Quindi, invece di generare una chiave privata per il server e una serie di chiavi pubbliche corredate da certificati per i client (esclusive per ogni client), prediligo (orrore e schifo!) utilizzare la stessa chiave sia per server che per client: questo mi permette di aggiugere 'al volo' un nuovo client VPN alla mia rete. Della sicurezza mi occupo a livello superiore, dividendo la subnet dei client VPN dalla mia rete domestica con qualche regola di firewalling.

In quest'ottica 'insicura', il file di configurazion del server sara' il seguente

root@zapotec:~# cat /etc/openvpn/server.conf

dev tap  #Utilizzo il dispositivo di rete virtuale TAP
proto tcp-server
ifconfig 10.0.0.1 255.255.255.0 #definisco l'IP del server all'interno della subnet dedicata alla VPN
tls-server

# Percorsi dei certificati
key "/etc/openvpn/certificati/ca.key"
dh "/etc/openvpn/certificati/dh.pem"
cert "/etc/openvpn/certificati/ca.crt"
ca "/etc/openvpn/certificati/ca.crt"
local 192.168.0.2 #IP 'reale' del server VPN

lport 8080 #porta di ascolto del server
verb 4

mode server
duplicate-cn

ifconfig-pool 10.0.0.10 10.0.0.30 # Range di IP da assegnare ai clients
mssfix 1450
#Mantiene il tunnel aperto effettuando dei ping a intervalli regolari
push "ping 10"
push "ping-restart 60"
ping 10
ping-restart 120
#Invia le regole di routing ai clients
push "192.168.0.0 255.255.255.0 10.0.0.1" #routing verso la rete 'reale'
push "dhcp-option DNS 192.168.0.3"  #invio al client l'indirizzo del DNS
comp-lzo #attiva la compressione

Naturalente i certificati prima generati saranno stati copiati nella cartella /etc/openvpn/certificati/.

Nell'esempio proposto, la rete 'reale' e' costituita da una subnet 192.168.0.0/24, con 192.168.0.1 assegnato al default gateway e 192.168.0.3 al server DNS.
Ai client VPN e' stata assegnata una subnet 'virtuale' 10.0.0.0/24, con default gateway su 10.0.0.1 (lo stesso server OpenVPN).

A livello di rete, per permettere ai client di accedere alla rete, sono necessari 2 passi:

  • Attivare l'IP forwarding sulla macchina linux che ospita OpenVPN, con echo 1 > /proc/sys/net/ipv4/ip_forward
  • Aggiungere sul proprio router (quindi defaul gateway della rete 'reale') una route statica per la rete 10.0.0.0/24 verso l'ip del server VPN (in questo caso 192.168.0.2).

Vediamo ora la (piu' semplice) configurazione del client:

remote IP_DEL_SERVER
rport 8080
proto tcp-client
tls-client
dev tap
tls-client

key "/etc/openvpn/certificati/ca.key"
ca "/etc/openvpn/certificati/ca.crt"
cert "/etc/openvpn/certificati/ca.crt"

pull
route 192.168.0.0 255.255.255.0 10.0.0.1
comp-lzo
verb 4

Come gia' detto sopra, la configurazione e' 'spiccia' ed insicura, utilizzando la stessa chiave per client e server, senza utilizzare il sistema di chiave pubblica e privata.

Addirittura, per facilitarmi ancora di piu' le operazioni di collegamento alla mia rete, ho realizzato un client OpenVPN per Windows 'portatile' da tenere su una normale chiave dati USB.

Questa la struttura delle directory:

G:\VPNCLIENT
│   VPNSTART.bat
│   VPNSTOP.bat

├───driver
│       OemWin2k.inf
│       tap0801.sys

├───config
│   │   client.ovpn
│   │
│   └───certificati
│           ca.crt
│           ca.key

└───bin
        ca.crt
        ca.key
        deltapall.bat
        KILL.EXE
        libeay32.dll
        libssl32.dll
        openssl.cnf
        openssl.exe
        openvpn.exe
        openvpnserv.exe
        tapinstall.exe

Nella cartella bin sono presenti eseguibili e DLL necessari al funzionamento di OpenVPN, in config ho copiato la configurazione del client e i certificati e in driver il driver del dispositivo TAP indispensabile alla creazione della scheda di rete virtuale.

Le uniche modifiche da effettuare sono sulla configurazione del client, che deve essere adattata ai percorsi non assoluti:

remote IP_DEL_SERVER
rport 8080
proto tcp-client
tls-client
dev tap
tls-client

key "./config/certificati/ca.key
ca "./config/certificati/ca.crt"
cert "./config/certificati/ca.crt"

pull
route 192.168.0.0 255.255.255.0 10.0.0.1
comp-lzo
verb 4

Ho creato inoltre 2 batch (VPNSTART.BAT e VPNSTOP.BAT) che si occupano di creare il dispositivo virtuale e avviare la VPN (VPNSTART) e di chiudere la VPN e rimuovere il dispositivo creato (VPNSTOP).

VPNSTART.BAT

@Echo Off
"bin\tapinstall.exe" install "driver\OemWin2k.inf" tap0801
"bin\openvpn.exe" --config config\client.ovpn

VPNSTOP.BAT

@Echo Off
bin\kill.exe openvpn.exe
"bin\tapinstall.exe" remove tap0801
pause

In questo modo e' possibile sedersi a un PC, inserire la chiavetta e collegarsi alla propria VPN, lasciando una volta finito di lavorare il PC ospite 'pulito'.

Non smetto di ripetere che anche questo utilizzo di OpenVPN e' estremamente 'insicuro':

porto in giro i miei certificati... (il bravo sistemista comincia storcere il muso)

...compresa la chiave privata... (il bravo sistemista cambia colore)

...su una chiave dati USB, facilmente smarribile...(al bravo sistemista comincia a mancare l'aria)

...copio il tutto agli amici che vogliono avere un accesso alla mia rete...(il bravo sistemista ha un mancamento)

...magari per fare una partita in rete a Quake3...(il bravo sistemista sembra riprendersi)

...e se serve, gli spedisco tutto via E-Mail! (il bravo sistemista ha un arresto cardiaco)

:-D