Openvpn
Introduzione
Una VPN (Virtual Private Network) e' un tipo di interconnessione tra computer che permette, sul piano logico, di comprendere in una LAN (Local Area Network) computer residenti in qualsiasi parte del pianeta. Solitamente si considera una LAN come una rete di computer locali, identificati da un indirizzo e una classe di ip (es: 192.168.0.0/24, 10.0.0.0/24 etc.). Con un collegamento VPN, un computer che si trovi fisicamente al di fuori di tale LAN, puo' risultarne un perfetto membro.
Tre computer, quindi, che si trovassero rispettivamente a Madrd, Londra e Roma potrebbero, grazie ad una vpn, creare la seguente rete:
______________ _______________ | LAN | ----- INTERNET ----- | LAN | | Madrid | | | Roma | | 192.168.0.1 | | | 192.168.0.3 | |_____________| ______|_______ |_____________| | LAN | | Londra | | 192.168.0.2 | |_____________|
La tecnica che permette di creare connessioni sicure attraverso reti insicure consiste nell' utilizzare un tunnel criptato attraverso il quale far transitare le nostre comunicazioni, rendendole di fatto invisibili all' esterno.
Prima di cominciare
La prima cosa da fare e' verificare in /dev la presenza della dir net contenente il device virtuale tun. Se tutto cio' non ci fosse, crearlo con:
mkdir /dev/net && mknod /dev/net/tun c 10 200
..tirare su il rispettivo modulo e far si che al boot venga caricato:
# modprobe tun # echo "tun" >> /etc/modules
Infine abilitare il forwarding:
echo 1 > /proc/sys/net/ipv4/ip_forward
Openvpn & Iptables
Diamo le opportune regole al firewall:
Generazione delle chiavi
Se non l'abbiamo gia' fatto:
# apt-get update && apt-get install openvpn
Effettuiamo il collegamento fra due macchine, una chiamata in maniera molto originale server e una client.
Queste due macchine sono di due diversi utenti che possono risiedere ovunque nel mondo. La macchina server sara' quella in ascolto.
Spostiamoci sul server, esattamente in /etc/openvpn e creiamo la nostra chiave con:
# openvpn --genkey --secret zmo.key
Una volta creata dovremmo poterla copiare nella stessa dir del client. Questo passaggio dovrebbe essere fatto nel piu' sicuro dei modi ad esempio tramite mail crittografate, o utilizzando scp (dalla suite Openssh). Utilizzando queste chiavi su tutti gli host (crittografia simmetrica) otteniamo una notevole cifratura del nostro canale in maniera davvero rapida.
Collegamento
Collegamento
Spostiamoci sul server e creiamo in /etc/openvpn il file server.conf editiandolo cosi':
dev tap lport 5000 ifconfig 10.0.0.1 255.255.255.0 secret /etc/openvpn/zmo.key verb 9
- dev
- identifica il device utilizzato per il tunnel. I possibili device utilizzabili da openvpn sono tun e tap. La differenza tra i due device e' fondamentale, in quanto tun si adopera per la trasmissione di pacchetti IP (una specie di ppp) e tap invece per la trasmissione di frame ethernet (una specie di eth). Per la creazione di lan virtuali o per la condivisione di risorse come file-server, ftp-server, dobbiamo usare tap.
- port
- socket dell'applicazione, il default e' la 5000, deve essere la stessa da ogni capo della vpn. E' da sottolineare che sul server invece di port si scrivera' lport (local) mentre sui client rport (remote).
- ifconfig
- determina l'ip dell'interfaccia virtuale (tun o tap).
- secret
- a questa stringa diamo il path della key creata in precedenza con openvpn.
- verb
- verb definisce il grado di verbose stampato a video in output durante l'esecuzione (da 0 a 11 sono spiegati dando openvpn --help).
Adesso sul client creiamo il file /etc/openvpn/client.conf cosi':
remote www.hostremoto.net (che ovviamente corrispondera' al server) dev tap rport 5000 ifconfig 10.0.0.2 255.255.255.0 secret /etc/openvpn/zmo.key verb 9
- remote
- a remote diamo l'ip pubblico della macchina alla quale ci connetteremo, oppure l'hostname come nell'esempio.
A questo punto lanciamo il collegamento su entrambe le macchine, indicando al programma di attenersi alle regole appena definite nei rispettivi server.conf e client.conf:
# openvpn --config /etc/openvpn/xxxx.conf
Tra le righe di output del client dovrebbero apparire tra le altre queste due stringhe:
Wed Sep 7 15:45:28 2005 Peer Connection Initiated with www.hostremoto.net:5000 Wed Sep 7 15:45:29 2005 Initialization Sequence Completed
Andiamo sul server e diamo:
# ifconfig tap tap0 Link encap:Ethernet HWaddr 01:F0:EF:27:41:4C inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Nlla riga inet addr vengono indicati ip, broadcast e netmask.
Proviamo a pingare l'host che sappiamo connesso:
# ping 10.0.0.2 PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=258 ms 64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=135 ms
In questo modo disporremo rapidamente di un canale cifrato relativamente sicuro, per lo scambio di dati privati.
Demonizzare Openvpn
Lo script /etc/init.d/openvpn
Come gia' accennato in precedenza, con l'installazione tramite apt viene aggiunto lo script /etc/init.d/openvpn. Questo script, che demonizza openvpn, una volta lanciato va a cercare nella dir /etc/openvpn il file con estensione .conf che dovra' corrispondere al file di configurazione. Dico questo poiche' in varie documentazioni lo troverete con estensioni diverse (es: .ovpn etc..) che lo script non riconoscerebbe come valido.
# /etc/init.d/openvpn start
Una volta avviato lo script attivera' il demone. Per impostarlo al boot:
# update-rc.d openvpn defaults
Openvpn & log
Per loggare l'output in un file qualunque (anche se non esiste verra' creato) aggiungere la riga al file .conf:
log /var/log/openvpn.log
Conclusioni
Usando Openvpn ci si rende subito conto della sua versatilita' e della sua vasta possibilita' di configurazione, dal piu' banale e immediato collegamento point-to-point, all' allacciamento di intere LAN con implementazione di certificati TLS/SSL. Openvpn permette la creazione di vpn da applicativo ad applicativo, non necessitando quindi di modifiche nel kernel come nel caso di vpn che implementino IPSEC.
Autore: zmo