openvpn: un server vpn open source - home …leotardi.ddns.info/html/vpndocs/openvpn.doc · web...

72
OpenVPN: un server VPN open source Lo scambio di informazioni tra sedi remote rappresenta ormai una delle esigenze più sentite in ambito lavorativo. Questo vale sia per aziende di grandi dimensioni con budget ragguardevoli dedicati al settore IT, sia per piccole realtà che non possono sostenere i costi di un collegamento dedicato. Andando ancor più nel particolare immaginate la comodità di poter accedere alle informazioni del nostro computer in ufficio quando si siamo in giro per il mondo o, come purtroppo capita, quando siamo a casa malati. Realizzare tutto questo a costi accessibili è possibile implementando una VPN. Per VPN, Virtual Private Network, si intende una rete privata virtuale creata utilizzando un mezzo di trasmissione pubblico, nella maggior parte dei casi identificabile con Internet. In parole povere dovremo creare un canale o tunnel virtuale che colleghi tra loro due reti, nel caso più semplice rappresentate da due computer raggiungibili tramite Internet. Ovviamente tale sistema deve garantirci un elevato grado di sicurezza. L'accesso deve essere consentito solo ad utenti autorizzati, i dati in transito sulla rete pubblica devono risultare cifrati, devono essere ridotti al minimo i rischi di furto d'identità digitale ed impedita l'alterazione delle informazioni trasmesse. In un panorama che offre molte soluzioni commerciali spicca una soluzione open source (e gratuita): OpenVPN (http://openvpn.net). Il software si compone di una parte server: un demone che resta in ascolto in attesa di connessioni, ed una parte client che, collegandosi, richiede l'instaurarsi della VPN. Entrambe le parti, prima di trasferire informazioni, operano i necessari controlli per verificare l'identità dell'interlocutore. Questo primo articolo a carattere introduttivo, descriverà le caratteristiche generali di Open VPN, attualmente giunto alla versione 2.0.9, permettendovi di valutare se possa essere o meno una soluzione adatta alle vostre esigenze. Semplicità e Flessibilità

Upload: letuyen

Post on 11-May-2019

245 views

Category:

Documents


0 download

TRANSCRIPT

OpenVPN: un server VPN open source

Lo scambio di informazioni tra sedi remote rappresenta ormai una delle esigenze più sentite in ambito lavorativo. Questo vale sia per aziende di grandi dimensioni con budget ragguardevoli dedicati al settore IT, sia per piccole realtà che non possono sostenere i costi di un collegamento dedicato. Andando ancor più nel particolare immaginate la comodità di poter accedere alle informazioni del nostro computer in ufficio quando si siamo in giro per il mondo o, come purtroppo capita, quando siamo a casa malati.

Realizzare tutto questo a costi accessibili è possibile implementando una VPN. Per VPN, Virtual Private Network, si intende una rete privata virtuale creata utilizzando un mezzo di trasmissione pubblico, nella maggior parte dei casi identificabile con Internet. In parole povere dovremo creare un canale o tunnel virtuale che colleghi tra loro due reti, nel caso più semplice rappresentate da due computer raggiungibili tramite Internet. Ovviamente tale sistema deve garantirci un elevato grado di sicurezza. L'accesso deve essere consentito solo ad utenti autorizzati, i dati in transito sulla rete pubblica devono risultare cifrati, devono essere ridotti al minimo i rischi di furto d'identità digitale ed impedita l'alterazione delle informazioni trasmesse.

In un panorama che offre molte soluzioni commerciali spicca una soluzione open source (e gratuita): OpenVPN (http://openvpn.net). Il software si compone di una parte server: un demone che resta in ascolto in attesa di connessioni, ed una parte client che, collegandosi, richiede l'instaurarsi della VPN. Entrambe le parti, prima di trasferire informazioni, operano i necessari controlli per verificare l'identità dell'interlocutore.

Questo primo articolo a carattere introduttivo, descriverà le caratteristiche generali di Open VPN, attualmente giunto alla versione 2.0.9, permettendovi di valutare se possa essere o meno una soluzione adatta alle vostre esigenze.

Semplicità e FlessibilitàRispetto ad altre implementazioni OpenVPN risulta una soluzione molto snella basata sullo standard SSL/TLS, protocollo ormai consolidato per garantire la sicurezza delle comunicazioni su Internet. Per questo si appoggia ad OpenSSL, altro noto tool open source, di cui abbiamo già parlato negli articoli dedicati ad Apache ed alle connessioni SSL (http://server.html.it/articoli/leggi/2416/apache-e-ssl-creazione-di-certificati-per-connessioni-cifrate/). Differentemente da altre soluzioni non utilizza IPSec, ma genera un tunnel point-to-point TCP over UDP lavorando in user space.

Per ridurre l'occupazione di banda ed i tempi di risposta il software opera una compressione sui dati trasmessi utilizzando le librerie LZO, che costituiscono dunque un prerequisito come il già menzionato OpenSSL.OpenVPN supporta svariati metodi di autenticazione dei client: nome utente e password, certificati digitali X509, smart card etc. permettendo di scalare da soluzioni semplici, in cui un server deve gestire un unico client, a soluzioni enterprise molto più complesse. Il server OpenVPN può effettuare il push verso i client di opzioni DHCP come DNS ed indirizzi di server WINS.

La configurazione, nello stile Unix, avviene editando dei file di testo, uno per la parte server ed uno per la parte client. Questo, a mio modo di vedere, rappresenta un vantaggio e fornisce una maggiore

consapevolezza e controllo sulle impostazioni adottate. Esistono, inoltre, numerosi e ben commentati esempi di configurazione che coprono le più disparate esigenze. Un giro in rete vi permetterà di verificare che la documentazione reperibile è abbondante e non limitata al sito del progetto. Niente paura se avete problemi con le lingue straniere, potrete trovare numerosi documenti in lingua italiana.

MultipiattaformaIl software è disponibile per diverse piattaforme come Linux, Windows, MacOs X, permettendo, se necessario, l'interoperabilità tra i diversi sistemi. I sorgenti sono naturalmente prelevabili dall'area download (http://openvpn.net/index.php/downloads.html) del sito madre.

Per chi utilizza Linux e vuole evitare la compilazione del codice sorgente, sono facilmente reperibili i pacchetti precompilati per varie distribuzioni. In ambito Windows si può downlodare dal sito del progetto l'installer .exe o, grazie al lavoro di Mathias Sundman, una GUI che rende più familiare la gestione del software a chi utilizza questo sistema. Il pacchetto (http://openvpn.se/) installa simultanemente OpenVPN e l'interfaccia grafica.Per gli affezionati della mela Angelo Laub e Dirk Theisen hanno sviluppato Tunnelblick (http://www.tunnelblick.net/), una GUI per OS X. Sempre in termini di portabilità OpenVPN è progettato per funzionare con le interfacce di rete virtuali TUN/TAP disponibili su molti sistemi operativi.

Routing ed Ethernet BridgingOpenVPN consente due modalità operative alternative Routing e Bridging.

La prima soluzione risulta preferibile sia in termini di efficienza che di semplicità di configurazione. Il client in questo caso utilizza la propria sottorete: vengono impostate sia lato client che lato gateway remoto, delle route che permettono la trasmissione dei pacchetti attraverso la VPN. Si noti che parlando di client non si fa riferimento solo al caso di una singola macchina, ma potrebbe trattarsi di un'intera sottorete.

Alcune circostanze impongono però il ricorso al Bridging. In tal caso l'interfaccia di rete fisica viene collegata via software con l'interfaccia virtuale utilizzata da OpenVPN creando appunto un ponte, bridge. Tale operazione consente di ottenere una rete virtuale su una singola sottorete. Alcuni esempi classici, riportati dalla documentazione ufficiale, in cui si rende necessario il bridging sono:

la VPN deve gestire protocolli non IP come IPX; si utilizzano applicazioni che mandano comunicazioni in broadcast; si vuole permettere il browsing delle condivisioni di rete windows senza disporre di un

server WINS o Samba.

Per ora ci fermiamo qui. Se le informazioni di questa breve panoramica hanno solleticato la vostra curiosità vi do appuntamento su queste pagine per cominciare a "sporcarci le mani" con l'installazione e la configurazione di OpenVPN.

Nella prima parte di questo articolo sono state brevemente illustrate le caratteristiche di OpenVPN (http://openvpn.net), il software VPN open source e multipiattaforma. I sistemi supportati sono Linux, Solaris, OpenBSD, FreeBSD, NetBSD, Mac OS X, Windows. Per ognuno di essi è bene verificare la versione del kernel o del sistema operativo minimi richiesti.

Di seguito ci occuperemo dell'installazione immaginando di utilizzare per i nostri esperimenti due macchine una server, destinata ad accettare le connessioni, ed una client che ad essa si collegherà tramite il tunnel cifrato.

Installazione su LinuxCome di consueto il sistema di riferimento per l'ambiente linux sarà Fedora, nello specifico la versione 8. L'installazione di OpenVPN è legata ad alcuni prerequisiti:

openssl lzo pam

Di seguito seguiremo la più semplice installazione da pacchetti precompilati sfruttando YUM, il packet manager di Fedora. Il software si occuperà di verificare per noi che le dipendenze siano soddisfatte proponendoci, in caso negativo, l'installazione di eventuali altri pacchetti.Procediamo con il consueto:

[root]# yum install openvpn

Al momento in cui viene scritto l'articolo il comando propone l'installazione della versione 2.1-0.19.rc4 dal repository fedora, proseguiamo l'installazione rispondendo affermativamente (anche per le eventuali dipendenze richieste). Se preferite la compilazione, dopo aver scompattato i sorgenti, dovrete usare, al solito, la sequenza:

[root]# ./configure[root]# make && make install

Ricordo che i sorgenti sono disponibili nell'area download (http://openvpn.net/index.php/downloads.html) del sito del progetto. La versione stabile attualmente prelevabile è 2.0.9, se volete potete però provare la 2.1_rc7. Prima di agire, è consigliabile leggere attentamente il file INSTALL di documentazione per eventuali particolari opzioni di configurazione.

Il comodo automatismo del packet manager ci ha nascosto le modifiche apportate al sistema, cerchiamo di investigare in proposito:

[root]# which openvpn/usr/sbin/openvpn

L'eseguibile, come era facile attendersi, è stato posizionato in /usr/sbin.

[root]# chkconfig --list | grep openvpnopenvpn 0:off 1:off 2:off 3:off 4:off 5:off 6:off

Il precedente comando ci mostra come sia già tutto predisposto per lanciare OpenVPN all'avvio del sistema, basterà portare ad on i runlevel desiderati. Infine notiamo la creazione della directory

/usr/share/openvpn/easy-rsa contenente alcune utility che sfrutteremo largamente più avanti. Il percorso di tale directory è legato al tipo di installazione ed alla distribuzione usata. Se non state operando su Fedora dovrete localizzarne la posizione. Per comodità e per evitare sovrascritture da parte di successivi aggiornamenti, creiamo la directory /etc/openvpn e copiamo easy-rsa al suo interno.

È importante notare come la procedura d'installazione seguita coincida per il server e per il client, saranno poi le impostazioni di configurazione a decidere il ruolo assunto.

Installazione su WindowsPer questa piattaforma è conveniente installare la GUI di Mathias Sundman (cui hanno collaborato altri programmatori) che rende più agevole l'utilizzo del software. Anziché scaricare l'installer dal sito del progetto conviene prelevare il pacchetto openvpn-2.0.9-gui-1.0.3-install.exe (http://openvpn.se/download.html) comprensivo dell'interfaccia grafica e del programma.

Il classico wizard ci guiderà nell'installazione del software che di default avviene in C:\Programmi\OpenVPN, di seguito faremo sempre riferimento a tale posizione. Quando ci verrà proposta la scelta dei componenti da installare aggiungiamo, spuntandolo, "My Certificate Wizard".

Aprendo dal pulsante Start il menù Programmi troveremo il nuovo sottomenu OpenVPN, mentre aprendo dal pannello di controllo l'elenco dei servizi troveremo OpenVPN Service che potrà essere lanciato automaticamente all'avvio del sistema.

Al termine ritroveremo nella directory scelta per l'installazione la cartella easy-rsa del tutto simile a quella sopra menzionata. Anche in questo caso la procedura d'installazione per server e client è la medesima.

Certification Authority (CA)OpenVPN, come menzionato nell'articolo introduttivo, si basa sul protocollo SSL/TLS. Inizialmente dovremo organizzare una infrastruttura di chiavi pubbliche, PKI, dove il server e ciascuno dei client coinvolti siano in possesso di una chiave pubblica ed una chiave privata.

Procederemo in maniera analoga (non identica!!) a quanto descritto in Apache e SSL: creazione di certificati per connessioni cifrate (http://server.html.it/articoli/leggi/2416/apache-e-ssl-creazione-di-certificati-per-connessioni-cifrate), per chi non avesse chiari i concetti relativi alla crittografia asimmetrica può essere utile la lettura della guida Crittografia e PGP (http://sicurezza.html.it/guide/leggi/85/guida-crittografia-e-pgp/).

Cominceremo assumendo il ruolo di Autorità di Certificazione nei cui panni firmeremo i certificati del server e del/i client. Prima che si instauri il rapporto di fiducia tra client e server, OpenVPN prevede che entrambi controllino il certificato fornito dalla controparte. In altri termini il client verificherà il certificato del server ed il server quello del client. Perché la verifica abbia esito positivo ciascun certificato dovrà essere firmato dalla CA e validate le informazioni in esso contenute.

Per realizzare quanto descritto posizioniamoci sulla macchina che utilizzeremo come server e sfruttiamo gli script forniti da OpenVPN e memorizzati nella directory easy-rsa.

Chiave privata e certificato della CA su LinuxAll'interno della directory /etc/openvpn/easy-rsa/2.0 individuiamo il file vars. Apriamolo con il nostro editor di testo preferito ed andiamo a modificare i parametri di default che si trovano alla fine:

export KEY_COUNTRY="US"export KEY_PROVINCE="CA"export KEY_CITY="SanFrancisco"export KEY_ORG="Fort-Funston"export KEY_EMAIL="[email protected]"

Ad esempio cosí:

export KEY_COUNTRY="IT"export KEY_PROVINCE="Italy"export KEY_CITY="Roma"export KEY_ORG="HtmlIt"export KEY_EMAIL="[email protected]"

Ora lanciamo i primi script per inizializzare la PKI:

[root]# ./vars[root]# ./clean-all[root]# ./build-ca

Attenzione che il comando clean-all, il cui compito è fare pulizia, andrà ad eliminare una eventuale directory keys preesistente e contenete chiavi precedentemente generate.L'ultimo script build-ca, richiamando openssl, permette di generare certificato e chiave privata della CA:

Generating a 1024 bit RSA private key.................................Country Name (2 letter code) [IT]:State or Province Name (full name) [Italy]:Locality Name (eg, city) [Roma]:Organization Name (eg, company) [HtmlIt]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server's hostname) [HtmlIt CA]:OpenVPN-CAEmail Address [[email protected]]:

Si noti che l'output generato dal comando è stato accorciato per riportare solo gli elementi rilevanti. Avendo editato il file vars l'unico parametro da inserire nella procedura interattiva sarà il Common Name per cui è stato scelto arbitrariamente "OpenVPN-CA". Per gli altri, premendo il tasto invio, sarà mantenuto il valore preimpostato.Alla fine troveremo nella directory /etc/openvpn/easy-rsa/2.0/keys i file ca.crt e ca.key rispettivamente certificato e chiave privata della CA.

Chiave privata e certificato della CA su Windows

Le differenze sono minime, in questo caso bisogna iniziare aprendo una console e spostandosi in C:\Programmi\OpenVPN\easy-rsa. Ora lanciamo il file batch:

> init-config

che provvederà a copiare i file di configurazione. Successivamente editiamo vars.bat come mostrato nel precedente paragrafo ed eseguiamo:

> vars> clean-all> build-ca

La procedura di generazione delle chiavi risulta perfettamente identica.

Certificato e chiave privata del serverOra preoccupiamoci del server e pensiamo a generare le chiavi ad esso relative. Su Linux, sempre posizionati in /etc/openvpn/easy-rsa/2.0/, lanciamo il comando:

[root]# ./build-key-server server

Su Windows da C:\Programmi\OpenVPN\easy-rsa:

> build-key-server server

Lo script provvederà alla generazione delle chiavi in modo simile a quanto fatto per la CA, ma con alcune differenze. Anche in questo caso manteniamo i dati di default che ci vengono proposti tranne per il Common Name dove indicheremo il nome generico "server":

.................Organization Name (eg, company) [HtmlIt]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server's hostname) [server]:serverEmail Address [[email protected]]:

Al termine della procedura ci verrà chiesto di confermare la firma del certificato con la chiave privata della CA, naturalmente rispondiamo affermativamente:

.........................Certificate is to be certified until Apr 16 16:40:53 2018 GMT (3650 days)Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]yWrite out database with 1 new entriesData Base Updated

A questo punto il nostro server è in possesso di un certificato nuovo fiammante valido 10 anni, salvo revoche. Nella solita directory keys tra i vari file troveremo server.crt e server.key.

Certificato e chiave privata dei client

Con un ultimo sforzo terminiamo la procedura di generazione delle chiavi lanciando il comando:

[root]# ./build-key client1

su Linux, e:

> build-key client1

su Windows. Proseguiamo come nel precedente paragrafo dove come Common Name inseriremo "client1 ". Accettiamo la firma del certificato ed otterremo i file client1.crt e client1.key rispettivamente certificato e chiave privata del client.

Se i client sono più di uno basterà ripetere la procedura cambiando il nome che li individua. Ovviamente in una situazione reale si potrebbero usare nomi maggiormente identificativi per le macchine che implementeranno la VPN.

I parametri Diffie-Hellman e la chiave staticaGeneriamo ora i parametri Diffie-Hellman, usati per costruire la chiave di sessione, di default ricreata ogni ora. La procedura richiede un po' di tempo mentre, una volta implementata la VPN, la generazione della chiave sarà molto rapida. Su Linux digitiamo:

[root]# ./build-dh

mentre su Windows:

> build-dh

Il risultato sarà il file dh1024.pem, sempre posizionato nella directory keys.

Infine per completezza vediamo come sia possibile creare una chiave tls o statica:

[root]# openvpn --genkey --secret key.txt

Questa nelle configurazioni più semplici o nei test può essere usata da sola, ad esempio per implementare una VPN point-to-point, senza organizzare il sistema di PKI. Si osservi che su Windows la generazione della chiave statica può essere ottenuta selezionando dal menu dei Programmi il sottomenu OpenVPN e la voce Generate a static OpenVPNkey.

Prime conclusioniA questo punto possiamo mettere un po' d'ordine creando una directory chiamata server all'interno della quale copieremo i file:

server.crt server.key ca.crt key.txt dh1024.pem

e poi tante directory quanti sono i client, ad esempio "client1", in cui copieremo:

client1.crt client1.key ca.crt key.txt

Ora per realizzare la nostra VPN non ci resta, si fa per dire, che trasferire i file e configurare server e client, ma questo sarà oggetto della prossima parte.

Avviamoci ora alla terza e ultima sezione relativa ad OpenVPN, il software VPN open source. Nelle precedenti sezioni ci eravamo occupati dell'installazione e della generazione di chiavi e certificati necessari alla creazione del tunnel cifrato. Al termine della procedura avevamo creato una directory server contenente i file relativi al server e tante directory client1, client2,.... contenenti i file relativi ai singoli client. Innanzitutto eseguiamo un backup di tali directory e dei file relativi alla CA per evitare che qualche inconveniente pregiudichi il lavoro fatto per creare la PKI (public key infrastructure).

Passiamo ora alla configurazione vera e propria del software, puntando in particolare l'attenzione sulla parte server. Nell'esempio che segue considereremo di implementare una routed VPN: il client utilizza la propria sottorete e vengono implementate delle regole di routing ad entrambe le estremità del canale in modo tale che i pacchetti possano transitarvi. Ricordo che l'alternativa è rappresentata dalla modalità ethernet bridging. Per maggiori dettagli vi consigliamo di leggere le sezioni di apertura (http://server.html.it/articoli/leggi/2587/openvpn-un-server-vpn-open-source/) o, per approfondimenti sul tema, la documentazione ufficiale (http://openvpn.net/index.php/documentation/miscellaneous/ethernet-bridging.html).

Configurazione del server

Posizioniamoci sulla macchina che fungerà da server e copiamo il contenuto della directory server in /etc/openvpn. Se rammentate nelle precedenti sezioni avevamo appositamente predisposto tale directory; su Windows copieremo tutto in C:\Programmi\OpenVPN\config (file:///C:/Programmi/OpenVPN/config).

Per nostra fortuna insieme al software vengono distribuiti alcuni file di configurazione esemplificativi ed altri utili script. Tali file risultano abbondantemente commentati, costituendo una buona base di partenza: dopo un'attenta lettura sarà facile personalizzarli per adattarli alle nostre esigenze. Nel caso della distribuzione Linux di riferimento, Fedora 8, i file saranno raggruppati in /usr/share/doc/openvpn-2.1/sample-config-files. Su Windows li trovate in C:\Programmi\OpenVPN\sample-config, l'unica sostanziale differenza sarà che su tale sistema hanno estensione .ovpn mentre nei sistemi unix-like .conf.

Individuiamo dunque il file server.conf che si riferisce ad un server multi-client e copiamolo nella directory di configurazione. Ora apriamolo con il nostro editor di testi preferito e cominciamo ad intervenire sulle direttive. In alcuni casi sarà sufficiente decommentarle (se sono commentate), in altri sarà necessario personalizzarle. Come risulta subito evidente i caratteri utilizzati per i commenti sono ; o #.

Di seguito prenderemo in considerazione le più importanti direttive descrivendole brevemente:

local 192.168.0.1

port 1194proto udpdev tun

La prima direttiva local, opzionale, specifica l'indirizzo IP su cui il demone OpenVPN sarà in ascolto. Nel caso sulla nostra macchina siano configurati più indirizzi potremo indicarne uno. La direttiva port specifica la porta di ascolto: 1194 è quella di default, potremmo evidentemente sceglierne una diversa. Con proto si specifica il protocollo utilizzato: solitamente è udp ma potremmo anche modificare la direttiva in tcp. Per indicare l'interfaccia di rete virtuale utilizziamo la direttiva dev. Specificando la parola chiave tun richiediamo la creazione di un tunnel ip routed mentre con tap richiederemmo l'ethernet bridging.

Le seguenti direttive specificano la posizione ed il nome dei file relativi al sistema PKI:

ca ca.crtcert server.crtkey server.keydh dh1024.pem

Nell'ordine indichiamo il certificato della CA, il certificato del server, la chiave privata del server ed infine i parametri diffie-hellman. Tutti file che avevamo generato nel precedente articolo, salvato nella citata directory server ed infine copiato in /etc/openvpn. Se desideriamo posizionarli in maniera diversa dobbiamo specificare per ciascuno di essi l'esatto path.

Continuiamo la configurazione del file server.conf (o server.ovpn in Windows).

server 10.8.0.0 255.255.255.0

Con questa direttiva stabiliamo che la nostra macchina lavorerà in modalità server ed acquisirà il numero IP 10.8.0.1. Ai client verranno assegnati altri indirizzi della rete 10.8.0.0/24. Se la classe è già utilizzata nella nostra infrastruttura di rete possiamo, ovviamente, specificarne una diversa. Questa direttiva è tipica della modalità routed VPN, in caso si adotti il bridging andrà commentata ed al suo posto utilizzata server-bridge.

Con:

ifconfig-pool-persist ipp.txt

specifichiamo un file dove registrare la corrispondenza tra client e IP virtuali assegnati. Se per qualche motivo la VPN dovesse cadere, una volta ripristinata, potrà riassegnare gli stessi numeri.

La direttiva push ci permette di inviare ai client alcune opzioni ad esempio:

push "route 192.168.20.0 255.255.255.0"push "dhcp-option DNS 10.8.0.1"push "dhcp-option WINS 10.8.0.1"push "redirect-gateway"

Con la prima consentiamo ai client di raggiungere altre reti dietro al server, ovviamente per rendere bidirezionale la comunicazione tali reti dovranno poter a loro volta effettuare il routing verso il pool

di indirizzi della VPN (10.8.0.0/24). La seconda e la terza consentono di inviare ai client alcune impostazioni tipiche delle reti Windows come server dns e wins.

L'ultima direttiva indica ai client di rindirizzare tutto il traffico attraverso il tunnel VPN, anche la navigazione su Internet ad esempio. Come si può notare queste direttive sono molto specifiche, lasciatele commentate se non ne avete bisogno, personalizzatele se intendete sfruttarle.

keep-alive 120 10

Con la precedente istruzione richiediamo la verifica ogni 10 secondi che il link sia attivo (in modo simile a un ping) se non si ottiene risposta per 120 secondi si assumerà che sia down.

Nelle precedenti sezioni avevamo visto come fosse possibile creare una chiave segreta tls che avevamo chiamato key.txt.

tls-auth key.txt 0

Con questa direttiva ne specifichiamo l'utilizzo: ovviamente la medesima chiave va copiata sia sul server sia sui client. Il parametro numerico finale dovrà essere 0 per il server e 1 per i client.

Con:

cipher BF-CBC

indichiamo l'algoritmo crittografico che dovrà essere usato, nell'esempio Blowfish, che è poi la scelta di default. Il medesimo algoritmo andrà specificato anche lato client.

Per ridurre i privilegi del demone OpenVPN dopo l'avvio eliminiamo il commento a:

user nobodygroup nobody

Naturalmente tali direttive non hanno ragione di esistere su un server Windows. Con la successiva istruzione attiviamo la compressione dei dati che transitano attraverso il tunnel VPN, tale opzione dovrà essere utilizzata anche sui client:

comp-lzo

Infine vediamo alcune impostazioni relative all'attività di log:

status openvpn-status.loglog openvpn.logverb 4

La direttiva status specifica un file dove memorizzare le informazioni correnti sulle connessioni: viene riscritto ogni minuto. Per default i messaggi di log andrebbero al syslog, ma con la seconda direttiva è possibile richiedere la creazione di un file specifico openvpn.log. Se invece dell'istruzione log usiamo log-append all'avvio di OpenVPN il file non verrà troncato ed i messaggi verranno accodati. Per concludere verb identifica il livello di, passateci il termine, "verbosità" desiderato in una scala che va da 0 a 9.

Sostanzialmente il file di configurazione rimane il medesimo anche in ambiente Windows, con l'accortezza di mettere tra doppi apici eventuali path e raddoppiare le backslash.

Avvio del serverA questo punto non ci resta che avviare OpenVPN sul nostro server:

[root]# openvpn --config /etc/openvpn/server.conf

L'output, piuttosto lungo, fornisce una serie di messaggi che, armandosi di pazienza, conviene consultare per verificare la correttezza delle impostazioni almeno le prime volte ed in fase di sperimentazione. Il tutto dovrebbe terminare con "Initialization Sequence Completed". Attenzione se avete decommentato la direttiva log o log-append l'output non comparirà a video, ma nel relativo file openvpn.log. Ora lanciando il comando:

[root]# ifconfig

noteremo l'aggiunta dell'interfaccia di rete virtuale tun0 riportante inet addr:10.8.0.1. In /etc/openvpn troveremo, come richiesto in fase di configurazione, i file ipp.txt, openvpn-status.log ed eventualmente openvpn.log.

Nell'articolo dedicato all'installazione del software, avevamo rilevato come il pacchetto precompilato si occupasse di aggiungere OpenVPN all'elenco dei servizi e di creare in /etc/init.d lo script di avvio openvpn. Possiamo quindi automatizzare il lancio del demone nei runlevel desiderati ad esempio:

[root]# chkconfig openvpn --level 345 on

e gestirne automaticamente l'avvio, lo stop, la ripartenza:

[root]# service openvpn start

In questo caso la directory /etc/openvpn verrà letta alla ricerca di file con estensione .conf ed una volta individuati si avvierà un'istanza per ogni file di configurazione trovato.

Analogamente su Windows un click con il tasto destro sul file server.ovpn mostrerà nel menu contestuale la voce "Start OpenVPN on this config file". Alternativamente è possibile attivare il menu della GUI cliccando con il tasto destro sull'icona che OpenVPN ha creato nella system tray. Accedendo dal Pannello di controllo all'elenco dei servizi di Windows sarà possibile impostarne l'avvio automatico al prossimo riavvio. Il software effettuerà una scansione della directory C:\Programmi\OpenVPN\config alla ricerca di file con estensione .ovpn.

Configurazione dei clientSpostiamoci ora su un client, copiamo la corrispondente directory con chiavi e certificati in /etc/openvpn, copiamo il file di esempio client.conf (o client.ovpn) e modifichiamolo, supportati dai commenti. È fondamentale che vi sia esatta corrispondenza con le scelte operate nella configurazione lato server ad esempio il tipo di interfaccia virtuale tun/tap, il protocollo udp/tcp, l'algoritmo di cifratura, la chiave tls e così via.

Soffermiamoci brevemente solo sulle direttive fondamentali e tipiche dei client, per le rimanenti valgono considerazioni analoghe a quelle fatte per il server.

clientremote 11.22.33.44 1194

La prima stabilisce che la macchina si comporterà da client e quindi riceverà alcune configurazioni dal server a cui si collega. La seconda invece stabilisce a che indirizzo IP dovrà collegarsi il client e su che porta. Naturalmente se la VPN viene implementata attraverso Internet il numero IP dovrà corrispondere a quello pubblico mediante il quale sia possibile raggiungere il server.

Ricordo che le direttive ca, crt e key devono correttamente puntare ai corrispondenti file del client e se utilizzate tls-auth il parametro numerico deve essere posto a 1.

A questo punto possiamo avviare il client in maniera analoga a quanto fatto per il server. Se tutto funziona correttamente e la sequenza di inizializzazione è completa dovremmo essere in grado di pingare il server all'indirizzo 10.8.0.1.

ConclusioniIn queste pagine abbiamo visto solo una parte delle possibilità offerte da OpenVPN un software veramente flessibile, per un panorama completo consiglio di consultare il sito del progetto (http://openvpn.net). Vale la pena ribadire che, data la sua natura multipiattaforma, potremmo collegare server e client su cui girano sistemi operativi diversi. Può essere ad esempio un ottimo sistema per amministrare un server Windows dalla nostra linux box tramite VNC utilizzando però una connessione protetta o accedere ai documenti delle condivisioni tramite Samba.

È doveroso anche notare che la strutturazione delle reti risulta spesso complessa ed il lavoro di configurazione potrebbe coinvolgere tutte le altre apparecchiature di rete, come router e firewall, che stanno tra server e client. Talora la configurazione del software sarà solo la metà del lavoro. Niente paura in caso di bisogno provate a consultare l'abbondante documentazione ufficiale ed i file di esempio forniti insieme al software.

Configurare OpenVPN per accesso remoto alla rete aziendale

Configurare OpenVPN per accesso remoto alla rete aziendale.Modalità non-TLS con static key encryption mode

Requisiti:

Server OpenVPN: WinXP o Win Server 2003Client: Win 2000 o successivi

rete locale 192.168.30.0 / 24scheda rete server OpenVPN: 192.168.30.11 / 24

Su server OpnVPN:1. installare OpenVPN2. creare una preshared key: openvpn.exe –genkey –secret key la chiave verrà creata nel file key, copiarla dal server al client tramite un mezzo sicuro.3. rinominare la connessione di rete appena creata dall’installazione: tap4. lasciare l’indirizzo TCP/IP della connessione OpenVPN in automatico5. creare un bridge tra la connessione di rete fisica ed il tap, chiamandolo “tap-bridge”6. assegnare al bridge un indirizzo IP della rete locale (la stessa subnet della connessione fisica) es 192.168.30.15 / 24. Da adesso in poi il server XP OpenVPN avrà sulla rete questo indirizzo7. testare la rete da e verso il server8. assicurarsi di avere la preshared key nella cartella config9. creare il file di configurazione (es: server.ovpn) come segue:

dev tapdev-node tapsecret keyping 5verb 3mute 10

10. Importante - togliere dalla cartella config tutti gli altri file .ovpn11a. far partire il file di configurazione con il tasto destro11b. oppure far partire il servizio OpenVPN. Ricordarsi di metterlo in avvio automatico

Ricordarsi di pubblicare la porta UDP 5000, con PAT verso l’indirizzo privato delserver XP OpenVPN (nel caso: 192.168.30.15)

Su client

1. installare openvpn2. dare alla scheda OpenVPN un indirizzo che fa parte della rete da raggiungere es: 192.168.30.16 /243. assicurarsi di avere la preshared key nella dir config4. creare il file di configurazione (es: client.ovpn) come segue:

remote myserver.mydomain.comdev tap

secret keyping 5verb 3mute 10

5. far partire il file di configurazione con il tasto destro.

Installare e Configurare una VPN con OpenVPN

In questo tutorial mostrerò come mettere in piedi una Rete Privata Virtuale (VPN) tra due computer con sistema operativo Windows XP. Sebbene Windows XP abbia il supporto nativo per le VPN e integri anche le funzionalità di Server VPN, il limite di questa soluzione sta nel numero massimo di connessioni VPN contemporanee che purtroppo è limitato ad una sola connessione. Per fortuna esistono soluzioni Open Source che consentono di superare questi limiti e che non obbligano il singolo utente o la piccola azienda, ad acquistare un costoso sistema operativo server come Windows Server 2003.

La soluzione che ho scelto di adottare si chiama OpenVPN, in particolare ho utilizzato una versione di OpenVPN che ha un minimo di interfaccia grafica e che si chiama OpenVPN GUI. OpenVPN è un software open source che consente di creare tunnel VPN sicuri facendo ricorso ai protocolli SSL/TLS (Secure Socket Layer/Transport Layer Security) ed implementando l’autenticazione utente basata su Certificati Digitali, Smart Card oppure semplice combinazione di Username e Password.

La configurazione di OpenVPN sia lato server che lato client non è proprio intuitiva per chi si cimenta per la prima volta con questo software. Come in tutte le soluzioni open source/multipiattaforma che si rispettino, la configurazione viene effettuata non da interfaccia grafica ma da riga di comando.

OpenVPN supporta due modalità di collegamento differenti tra client e server: Bridged e Routed. In questo tutorial utilizzerò la prima modalità che ha i seguenti vantaggi sulla seconda:

I messaggi Broadcast attraversano la VPN. Questo consente l’utilizzo di protocolli quali NetBIOS e la conseguente possibilità di elencare le risorse di rete condivise sui vari computer della VPN.

Non è necessario configurare manualmente route statiche E possibile utilizzare qualsiasi protocollo che funzioni su collegamenti Ethernet come IPv4,

IPv6, Netware IPX, AppleTalk, etc… Configurazione relativamente semplice

La prima operazione successiva all’installazione del software, è quella di installare la CA (Certification Authority) e di generare il certificato Master (o chiave pubblica Master) e la chiave privata Master della CA.La seconda operazione da farsi sempre sul server, è quella di generare i certificati e le chiavi private per Server e Client e firmarli con le chiavi Master della CA create in precedenza.A questo punto si devono generare i parametri Diffie-Hellmann. Questo algoritmo viene utilizzato per generare la cosiddetta “Session Key” che per default viene rigenerata ogni ora. L’algoritmo RSA viene utilizzato per firmare i certificati del server e dei client e anche per l’autenticazione, mentre non viene utilizzato per generare la chiave di sessione per ragioni di performance. Nel Diffie-Hellmann, invece, è la generazione dei parametri ad essere particolarmente lenta (operazione da farsi una volta sola), mentre le chiavi vengono generate in tempi molto brevi.

Dopo aver generato i parametri Diffie-Hellmann creiamo una chiave statica a 2048 bit che verrà utilizzata per aggiungere un ulteriore livello di protezione alla nostra VPN. OpenVPN prevede infatti l’aggiunta di una firma (signature) a tutti i pacchetti SSL/TLS scambiati tra client e server. Qualsiasi pacchetto che non abbia la corretta signature, verrà eliminato brutalmente senza ulteriori processi. Questa soluzione ci protegge efficacemente dai seguenti attacchi:

Attacchi di tipo Denial of Services (DoS) Port Scanning Vulnerabilità di tipo Buffer Overflow nell’implementazione dei protocolli SSL/TLS Negoziazioni SSL/TLS iniziate da computer non autorizzati

Per attivare questa funzionalità è sufficiente abilitare la direttiva tls-auth nel file di configurazione di Server e Client. Da notare inoltre, che OpenVPN utilizza per default il protocollo UDP in quanto è più leggero e garantisce una maggiore protezione proprio contro attacchi di tipo Denial of Services.

Per finire, procediamo alla creazione del Bridging tra la nostra scheda di rete e la connessione creata da OpenVPN. I certificati e le chiavi private per server e client devono essere generati solo sul Server. Successivamente si dovrà copiare su ogni client la coppia di chiavi pubblica/privata che deve essere diversa per ogni client oltre naturalmente al certificato Master della CA (ca.crt).

Nel video sia il Server che il Client sono "nattati", ovvero stanno dietro ad un Router. Lato Server ho dovuto effettuare il Port Forwarding della porta UDP 1194 verso l'indirizzo IP del computer che funge da Server VPN e creare il bridging. Lato Client invece è bastato mettere in Bridging la connessione LAN con quella installata da OpenVPN ed assegnare alla connessione Bridged gli stessi parametri della connessione LAN originaria. Se sul Client o sul Server si utilizza un modem invece che un router, allora non è necessario creare il Bridge, ma è indispensabile disabilitare tutte le connessioni di rete non necessarie (quest'ultima operazione va' fatta anche su configurazioni Bridged).

IMPORTANTE: Nella modalità Bridged sia il Client che il Server devono appartenere alla stessa sottorete (es. 192.168.0.0). Nel caso in cui Client e Server si trovino su due sottoreti diverse (es. 192.168.0.0 uno e 10.0.0.0 l'altro), è indispensabile configurare OpenVPN nella modalità Routed. La modalità Routed è anche più semplice da configurare in quanto è la modalità predefinita di OpenVPN.

Lato server bisogna abilitare le direttive dev tun e server avendo cura di disabilitare le corrispondenti direttive necessarie invece per la modalità Bridged (vedere esempio):Quote:

;dev tapdev tun

server 10.8.0.0 255.255.255.0;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

Nel suddetto esempio i Client riceveranno un indirizzo IP compreso tra 10.8.0.2 e 10.8.0.254 mentre il Server si auto-assegnerà l'indirizzo IP 10.8.0.1. La classe di indirizzi IP utilizzata nella direttiva server, DEVE essere diversa da qualsiasi altra classe di IP reale presente sia lato Client che lato Server.

Lato Client è sufficiente abilitare la sola direttiva dev tun (vedere esempio):Quote:

;dev tapdev tun

A questo punto è necessario impostare a 1 la chiave di registro IPEnableRouter sia sul Client che sul Server VPN e riavviare i computer affinché la modifica abbia effetto:Codice:

Percorso.: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\ParametersNome Voce: IPEnableRouterValore...: 1Tipo.....: DWORD

NOTA: Nella modalità Routed NON è necessario creare il Bridging tra la scheda di rete del computer e la scheda di rete virtuale creata da OpenVPN. Se si desidera passare da una configurazione Bridged ad una configurazione Routed, è indispensabile rimuovere il bridge tra le due interfacce.

OpenVPN, VPN in pochi passi

PremessaLa necessità primaria di aziende, cooperative, società o qualunque altro genere di organizzazione è lo scambio di dati ed informazioni fra sedi remote.Le VPN (Virtual Private Network) permettono di collegare reti private attraverso una rete pubblica (Internet). I vantaggi offerti da questa tecnologia sono molteplici, ma sono tali dal punto di vista della sicurezza? Possiamo realmente fidarci di trasmettere dati sensibili attraverso Internet? La crittografia dei dati è alla base del concetto di VPN.Esistono soluzioni proprietarie che utilizzano Server VPN, come Cisco, che è basata su IPSEC. Altre soluzioni IPSEC sono implementate a livello Network e tutto il protocollo è progettato per essere realizzato con una modifica allo stack IP in kernel space.

OpenVpn è una soluzione Open Source che opera in user space, creando un tunnel point-to-point TCP over UDP che permette, come vedremo più avanti, la creazione di VPN.

TunnellingLe VPN, per comunicare, usano un sistema di tunnelling. Questo evita anche attacchi di tipo spoofing (mascherare il proprio indirizzo IP): cerchiamo di seguito di capire il perché. Un'intera codifica del pacchetto è impossibile, perché durante la trasmissione dello stesso è processato da altri router per essere indirizzato a destinazione. Le VPN criptano tutto il pacchetto, header incluso, e allegano a questo un altro header non criptato che contiene le informazioni che riguardano il gateway VPN di destinazione. Altre informazioni contenute nell'header del pacchetto che stiamo trasmettendo in modo sicuro non saranno soggette ad attacco di cracker.

CrittografiaCon il termine crittografia, viene definita l'arte delle scritture segrete. La trasformazione crittografica (da testo in chiaro a testo cifrato e viceversa) può avvenire in molteplici modi, ognuno dei quali prende il nome di "algoritmo di cifratura". Ciò che rende possibile questa trasformazione prende il nome di "chiave".Scomponendo la routine crittografica nelle sue componenti fondamentali, cifratura e decifratura, essa sarà simmetrica se le due operazioni vengono eseguite utilizzando un'unica chiave. Quando, invece, vengono attuate utilizzando due chiavi differenti, una pubblica ed una privata, la procedura diventa asimmetrica.In un contesto di crittografia simmetrica, è chiaro che la trasmissione della chiave stessa e la sua conservazione devono essere molto accurate.

OpenVPN, il software che utilizzeremo per creare la nostra VPN, implementa anche questo tipo di crittografia, basato sulla condivisione di una chiave segreta fra le postazioni della VPN. La crittografia dei dati in contesto simmetrico verrà realizzata con l'algoritmo blowfish.

Installazione OpenVPN

I sorgenti di OpenVPN sono reperibili sul sito http://www.openvpn.net/, dove vengono messi a disposizione anche pacchetti RPM.Prima di installare OpenVPN, è necessario procurarsi le librerie lzo, che permettono la compressione dei dati, e sono sempre reperibili sulla home page sopra riportata.

L'installazione da RPM si riduce ad un semplice comando:

# rpm -ivh openvpn-2.0.0.i386.rpm

Il sorgente viene compilato in questo modo:

# ./configure# make && make install

Consiglio sempre di leggere il file INSTALL che si trova nei sorgenti e le relative opzioni del configure.

OpenVPN lavora esclusivamente in user space con l'ausilio dei device TUN/TAP, permettendo la creazione di interfacce virtuali che consentono di instaurare connessioni point-to-point.Lavorando in user space, OpenVPN non necessita della modifica del pacchetto IP al livello Internet, cosa invece necessaria per l'utilizzo di IPSEC (VPN basate su IPSEC necessitano la ricompilazione del kernel per supportare l'alterazione del pacchetto IP).

Configurazione OpenVPN (server)Dopo aver compilato i sorgenti e quindi installato il software, dobbiamo creare prima di tutto la chiave privata per l'inizializzazione del tunnel.

# openvpn -genkey -secret key.txt

Una volta creata la chiave segreta e posizionata dentro /etc/openvpn/, dobbiamo creare il file di configurazione per il server (/etc/openvpn/config.ovpn).

dev tapsecret /etc/openvpn/key.txtping 10verb 1mute 10ifconfig 10.0.1.1 255.255.255.252lport 5002

Configurazione OpenVPN (client)La configurazione del gateway VPN (client) è identica a quella vista precedentemente. Ovviamente dobbiamo copiare la chiave segreta e posizionarla nella directory /etc/openvpn/ e creare il file di configurazione (/etc/openvpn/config.ovpn), che deve essere di questo tipo:

remote ip.pubblico.del.serverrport 5002dev tapifconfig 10.0.1.2 255.255.255.252secret /etc/openvpn/key.txtping 10

verb 1mute 10

VPN GW-to-GWUna volta installato e configurato OpenVPN, non ci resta che lanciare il demone in entrambi i gateway e provare la VPN.

# openvpn --config /etc/openvpn/config.ovpn \--log-append /var/log/openvpn.log -daemon

Appena lanciato il demone, la VPN dovrebbe essere instaurata. Per sicurezza, leggiamo il file di log /var/log/openvpn.log.

Tue Apr 26 22:12:06 2005 OpenVPN 2.0_rc19 i386-redhat-linux [SSL] [LZO] [EPOLL] built on Apr 2 2005Tue Apr 26 22:12:06 2005 TUN/TAP device tap0 openedTue Apr 26 22:12:06 2005 /sbin/ip link set dev tap0 up mtu 1500Tue Apr 26 22:12:06 2005 /sbin/ip addr add dev tap0 10.0.1.1/30 broadcast 10.0.1.3Tue Apr 26 22:12:06 2005 UDPv4 link local (bound): [undef]:5002Tue Apr 26 22:12:06 2005 UDPv4 link remote: [undef]Tue Apr 26 22:12:16 2005 Peer Connection Initiated with x.x.x.x:1194Tue Apr 26 22:12:17 2005 Initialization Sequence Completed

Proviamo realmente se la VPN è funzionante.

# ping -c 2 10.0.1.2PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.64 bytes from 10.0.1.2: icmp_seq=0 ttl=64 time=141 ms64 bytes from 10.0.1.2: icmp_seq=1 ttl=64 time=137 ms

--- 10.0.1.2 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 999msrtt min/avg/max/mdev = 137.484/139.436/141.388/1.952 ms, pipe 2

La VPN è perfettamente funzionante.

VPN GW-to-LANDefiniamo VPN GW-to-LAN una VPN realizzata tra due gateway, di cui uno di questi offre la possibilità di raggiungere la propria rete locale. Scenari di questo tipo sono molto comuni in contesti aziendali, ad esempio con i cosiddetti road warrior (utenti mobili), che leggono la posta interna o accedono ad un CMR locale, raggiungendo server interni con un ottimo livello di sicurezza.

In questo contesto, utilizzeremo un bridge ethernet, che per definizione ci aiuta a far comunicare tra di loro segmenti di rete diversi, che verrà posto tra il device tap e la nostra ethernet che collega il gateway alla LAN.

Per poter sfruttare la funzionalità del bridging ethernet, il kernel deve aver compilato o implementato il modulo bridging.o e necessariamente si dovranno installare le bridging utils, che potete trovare sul sito http://bridge.sourceforge.net/.

Dopo esserci assicurati che il nostro kernel abbia il supporto per il bridging (non scoraggiatevi se i kernel recenti lo implementano nativamente), possiamo creare un ipotetico scenario e vedere la sua configurazione.

GW1 10.0.1.1 - |

INTERNET | -> GW2 tap0 10.0.1.2 --------------

| eth2 192.168.11.1

| \|/

LAN |

| è 192.168.11.2

Questa configurazione non permette al GW1 di raggiungere la LAN, per fare questo dobbiamo aggiungere un bridge al GW2, che faccia bridging tra l'interfaccia tap0 e la scheda ethernet eth2.

GW1 10.0.1.1 - |

INTERNET | -> GW2 10.0.1.2 --------------

|BRIDGE br0 192.168.11.1

| \|/

LAN |

| è 192.168.11.2

Nel GW2, ovvero nel client, dobbiamo creare l'interfaccia br0 che, come abbiamo detto precedentemente, verrà realizzata tramite le bridging utils.

Inizialmente, creiamo il device tap0 e assicuriamoci che OpenVPN non sia in esecuzione.

openvpn --mktun --dev tap0

Ora creiamo l'interfaccia br0 e impostiamo il bridging tra le due interfacce.

brctl addbr br0brctl addif br0 eth2brctl addif br0 tap0

Le due interfacce non devono avere indirizzo IP, perché farà tutto il bridge.

ifconfig tap0 0.0.0.0 promisc upifconfig eth2 0.0.0.0 promisc up

Non rimane che impostare l'IP a br0 che, ovviamente, dovrà essere quello che precedentemente aveva impostato l'interfaccia eth2.

ifconfig br0 192.168.11.1 netmask 255.255.255.0 up

Appena attivata br0, troveremo la relativa rotta nella tabella di routing.

192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 br0

La VPN è pronta per essere instaurata, lanciamo nuovamente il demone su GW2 (client) e diamo uno sguardo al relativo file di log.

Wed Apr 27 00:45:18 2005 /sbin/ip link set dev tap1 up mtu 1500Wed Apr 27 00:45:18 2005 /sbin/ip addr add dev tap1 10.0.1.2/30 broadcast 10.0.1.3Wed Apr 27 00:45:19 2005 UDPv4 link local (bound): [undef]:1194Wed Apr 27 00:45:19 2005 UDPv4 link remote: GW1:5002Wed Apr 27 00:45:22 2005 Peer Connection Initiated with GW1:5002Wed Apr 27 00:45:22 2005 Initialization Sequence Completed

GW1, ovvero 10.0.1.1, dovrebbe essere in grado di raggiungere 192.168.11.2: ci servirà solo dirgli che tutti i pacchetti che avranno come destinazione la sottorete 192.168.11.0/24 dovranno passare dal GW 10.0.1.2. Per far questo, eseguiremo sul server:

route add -net 192.168.11.0 netmask \255.255.255.0 gw 10.0.1.2 dev tap0

Ovviamente, la stessa rotta di destinazione sarà impostata sul client della LAN 192.168.11.2, per poter ricevere una risposta. Il client dovrà essere istruito secondo la strada che il pacchetto dovrà percorrere per ritornare a 10.0.1.1.

Questa rotta, nel caso il GW2, quindi il proprio GW VPN, sia anche la macchina che fa il NAT per l'intera subnet, quindi il default gateway, non costituirà un problema, perché comunque il pacchetto verrà mandato al gateway VPN 192.168.11.1, quindi al bridge.

In caso contrario, in cui default gateway del client sia diverso dal GW VPN, bisognerà inserire la seguente rotta:

route add -net 10.0.1.0 netmask 255.255.255.252 gw 192.168.11.1 dev interfaccia_lan

Sperando che non vi siate persi per strada, proviamo ad effettuare un ping dal GW1 al PC della LAN remota.

ping -c 2 192.168.11.2PING 192.168.11.2 (192.168.11.2) 56(84) bytes of data.64 bytes from 192.168.11.2: icmp_seq=0 ttl=63 time=141 ms64 bytes from 192.168.11.2: icmp_seq=1 ttl=63 time=133 ms

--- 192.168.11.2 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1001msrtt min/avg/max/mdev = 133.292/137.538/141.785/4.262 ms, pipe 2

La VPN GW-to-LAN è funzionante.

VPN LAN-to-LAN

Se avete seguito attentamente le precedenti configurazioni e sono riuscito a spiegarmi discretamente bene, configurare una VPN LAN-to-LAN non dovrebbe essere assolutamente difficile, basterà impostare in entrambi i GW della VPN un bridge per la comunicazione tra le due sottoreti locali.

Ecco uno scenario ipotetico:

172.16.2.11

/|\ |LAN |

eth1 172.16.251.251 | -> GW1 10.0.1.1 -

| | INTERNET

| -> GW2 10.0.1.2 ------

| eth2 192.168.11.1

| \|/

LAN | \|/

192.168.11.2

In un contesto simile, dove 172.16.251.251 è l'host di una sottorete 172.16.0.0/16 e deve comunicare con 192.168.11.2, ci troviamo in una situazione in cui deve essere posizionato un bridge in entrambi i gateway VPN, permettendo così il routing tra due sottoreti.

Nell'esempio VPN GW-to-LAN, abbiamo creato un bridge nel GW VPN per il bridging con la rete locale. Adesso dobbiamo fare la stessa cosa su GW1, ovvero 10.0.1.1.

br0 172.16.251.251

| -> GW1 10.0.1.1 -- | INTERNET | -> GW2 10.0.1.2 --------------

| BRIDGE br0

192.168.11.1

Seguendo la stessa procedura, creiamo l'interfaccia br0 su GW1.

openvpn --mktun --dev tap0brctl addbr br0brctl addif br0 eth1brctl addif br0 tap0ifconfig tap0 0.0.0.0 promisc upifconfig eth2 0.0.0.0 promisc upifconfig br0 172.16.251.251 netmask 255.255.0.0 up

Creato il bridge e lanciato OpenVPN, i pacchetti provenienti dalla LAN del GW1 che avranno come destinazione 192.168.0.0/24, passeranno da tap1 e saranno in grado di raggiungere la LAN remota. Creando il bridge, il demone OpenVPN crea una nuova interfaccia chiamata tap1, quindi è necessario cambiare la rotta precedentemente inserita con il device tap0.

route add -net 192.168.11.0 netmask \255.255.255.0 gw 10.0.1.2 dev tap1

Controllando le rotta sui client della LAN, come spiegato in precedenza, la VPN LAN-to-LAN dovrebbe essere funzionante.

Note finaliOpenVPN risulta sicuramente una buona scelta: vi consiglio di approfondire bene le sue particolarità, poiché quanto trattato aiuta molto nell'atto pratico, ma di certo non si spinge nel dettaglio analizzando tutte le funzionalità che il software in questione ci offre. Infine, volevo ringraziare Maria Giovanna D'Angelo, Alessandro Orlando e Giovanni Licata per l'aiuto che mi è stato dato nel breve periodo che ho avuto a disposizione per la stesura dell'articolo. Sperando di ritornare sull'argomento in futuro, vi invito, come consuetudine, a studiare e leggere la documentazione ufficiale reperibile al sito http://www.openvpn.net/.

Configurare OpenVPNCi sono situazioni in cui può essere necessario scambiare dati in modo sicuro senza che possano essere intercettati e tanto meno sniffati.

Supponiamo di voler scambiare dati confidenziali tra la LAN del nostro ufficio di Acapulco e la sede della nostra impresa di Londra.

La soluzione migliore per noi è creare una rete virtuale privata che pur viaggiando sulla rete dati normale se ne mantiene assolutamente autonoma, in quanto i dati possono essere inviati e ricevuti unicamente da indirizzi privati che non appaiono sulla rete internet. e anche se i dati trasmessi fossero intercettati sarebbe assolutamente impossibile decifrarli.

Questa rete virtuale privata viene il linguaggio tecnico chiamata VPN, Virtual Private Network.

Una VPN è appunto un tunnel virtuale che viaggia sopra una rete pubblica (generalmente internet), dove due punti sono connessi tra loro in modo protetto. È come se esistesse un link dedicato in ciascuno dei due punti del tunnel, ma passando attraverso la rete internet. Questo significa una notevole riduzione dei costi, specialmente di fronte ai costi delle imprese che usano linee private Matrice<->Filiale, e che utilizzano l'ADSL solo per l'accesso alla rete internet. Usando una VPN si elimina la necessità del link privato, e si lavora solo sfruttando l'ADSL . È come creare una LAN, solo che i computer non si trovano nello stesso edificio, ma in una qualsiasi parte del mondo.

Esistono vari programmi per creare una VPN. Uno dei più conosciuti è FreSwan che utilizza IPsec per fare il tunneling. IPsec è abbastanza efficiente per la criptografiai, ma sarà utilizzabile su larga scala solo con i futuri indirizzi IPv6. Per un uso quotidiano FreeSwan è un programma molto complesso. Le sue difficoltà nel transitare attraverso router che usano NAT costituiscono uno dei maggiori problemi durante la creazione di una VPN. Siccome ai nostri giorni i link che usano routers con NAT sono molto comuni, risulta oltremodo complicato utilizzare questo software.

Per raggiungere quindi il nostro scopo utilizzeremo OpenVPNii. Questo software è molto semplice se paragonato con FreeSwan, in quanto semplicemente si occupa di inviare l'informazione all'altro capo della connessione dopo averla crittografata, e la manda tramite la rete internet con un pacchetto UDP. Il grande vantaggio è che non ha molti problemi a passare attraverso i firewall e i router che applicano NAT.

Per esemplificare in maniera più chiara la messa in atto di una VPN, prenderemo in considerazione una possibile configurazione mostrando i vari passaggi necessari alla realizzazione della stessa.Il nostro obiettivo é, quindi, creare una VPN tra la nostra filiale e la sede della nostra società, e fare in modo che tutti i pc della nostra rete interna possano accedervi per connettersi a tutti i pc della rete interna della sede.

Vediamo il progetto in Figura 1:

Figura 1

Un'altra possibilità rispetto alla configurazione proposta in figura potrebbe essere settare OpenVPN per attivare un computer della sede come server della VPN e tutti gli altri come client. Significherebbe però dover installare OpenVPN su tutti i computer e siccome siamo molto pigri, abbiamo deciso che solo due computer avranno installato OpenVPN: uno sarà il server nella sede e l'altro sarà il client nella nostra filiale. I computer della filiale si “appoggeranno” al client VPN della loro rete interna per comunicare con i computer della sede, mentre i computer della sede invece il server VPN per comunicare con i computer della filiale. Gli IP WAN in Figura 1 sono scelti in modo assolutamente casuale.

Il primo passo per realizzare il nostro progetto è installare OpenVPN, sia nel pc3 che nel pc5. Nelle distribuzioni derivate da Debian possiamo installarlo facilmente con apt-get, facendo un update e poi installando:

# apt-get update # apt-get install openvpn

Alla fine dell'installazione sarà chiesto se OpenVPN deve essere disattivato prima di essere aggiornato ("Would you like to stop openvpn before it gets upgraded?"); la risposta giusta è sí.

In OpenSuSE, dobbiamo aprire Yast e fare una ricerca del pacchetto “openvpn” nella sezione di gestione dei pacchetti. La ricerca fornirá due risultati “openvpn”, di cui uno è il pacchetto che stiamo cercando e l'altro “openvpn-devel”, quest'ultimo contiene il codice sorgente del pacchetto openvpn. A noi basta selezionare il pacchetto “openvpn” e concludere l'installazione.

Con Fedora l'installazione può essere fatta usando il comando yum, che installerà anche i pacchetti “openssl” e “lzo”, cioè le librerie usate da OpenVPN per crittografare e comprimere i dati inviati tramite la rete.

# yum install openvpn

In CentOS è necessario aggiungere il repository di RPMForge, visto che fino al CentOS 5.1 il pacchetto non figura fra i repository ufficiali della distribuzione. Possiamo però aggiungere il repository seguendo le istruzioni disponibili qui: RPMForge.

Dopodichè potremo procedere con l'installazione come in Fedora:

# yum install openvpn

Con Mandriva basta installare il pacchetto “openvpn” usando urpmi, che al pari di Fedora provvederà a installare le corrette dipendenze:

# urpmi openvpn

Se per caso stiamo usando una distribuzione che non includa il pacchetto nei suoi repository, o se la versione disponibile è molto antica, possiamo procedere con l'installazione a partire dal codice sorgente disponibile sul sito openvpn.

i http://www.freeswan.org/freeswan_trees/freeswan-2.03/doc/quickstart.html ii http://openvpn.sourceforge.net

Configurando server e client

Terminata l'installazione il prossimo passo è caricare il modulo tun del Kernel, che è utilizzato da OpenVPN per creare le interfacce virtuali. Ciascuna VPN creata utilizza infatti una nuova interfaccia di rete virtuale che si connette alla rete stessa, come se ci fosse un cavo che collega l'interfaccia virtuale all'altro capo del tunnel. Procediamo quindi dando il comando:

# modprobe tun

e aggiungendo la linea “tun” alla fine del file “/etc/modules”, in modo che il modulo sia caricato automaticamente durante la fase di boot.

# echo tun >> /etc/modules

Questi tre passaggi, cioè l'installazione di OpenVPN, il caricamento del modulo e l'aggiunta di “tun” alla fine del file, devono essere eseguiti tanto nel server quanto nel client, cioè, seguendo lo schema, tanto in pc3 e quanto in pc5.

Configuriamo ora il collegamento fra le due macchine. La macchina pc5, il server, sara' quella in ascolto. Andiamo quindi nel pc5, in particolare nella directory /etc/openvpn e creiamo una chiave statica che ci permetterà di codificare e decodificare le informazioni scambiate tra pc5 e pc3. Diamo il seguente comando:

# openvpn --genkey --secret static.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.

Procediamo ora con la configurazione delle due macchine. Sempre nel pc5, procediamo ora creando in /etc/openvpn il file server.conf editandolo così:

dev tap0port 1194ifconfig 1.0.0.1 1.0.0.2secret /etc/openvpn/static.key verb 9

il cui significato spieghiamo qui di seguito: dev identifica la device utilizzata per il tunnel. Le possibili device utilizzabili da openvpn sono tun e tap. La differenza tra queste due tipologie di 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 è il socket dell'applicazione, il default a partire dalle versioni di OpenVPN 2.x è la 1194, per cui avremmo potuto tralasciare questa informazione, l'importante è che la porta sia la stessa in ogni

nodo della vpn. E' da sottolineare che il protocollo usato è l'udp.ifconfig determina l'ip dell'interfaccia virtuale (tun o tap) e del client. secret a questa stringa diamo il path della key creata in precedenza con openvpn. Se il comando di configurazione che vedremo è eseguito nella directory dove si trova la chiave (nel caso /etc/openvpn) non è necessario scrivere il path, ma sarà sufficiente indicare il file della chiave.verb definisce il grado di verbosità stampato a video in output durante l'esecuzione (da 0 a 11 sono spiegati dando openvpn –help).

Prima di proseguire dovremo assicurarci che nel Router 1 tutte le connessioni in entrata sulla porta 1194 siano redirezionate alla porta 1194 del pc5 che ha indirizzo 10.0.0.1, e che il firewall del pc5 permetta queste entrate. Vedremo più avanti come usare iptables per risolvere questo problema.

Andiamo ora sulla macchina pc3, il client del nostro ufficio e creiamo il file /etc/openvpn/client.conf così:

remote 209.82.135.18dev tap0port 1194ifconfig 1.0.0.2 1.0.0.1secret /etc/openvpn/static.key verb 9

L'unica differenza con la configurazione del server è che con remote definiamo l'ip pubblico della macchina alla quale ci connetteremo. Ovviamente se il server si trova in una macchina dietro l'ip pubblico, il gateway dovrà incaricarsi di redirezionare le connessioni sollecitate sulla porta 1194 alla porta 1194 del server, nel nostro caso al pc5 con l'indirizzo 10.0.0.5.

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/server.conf (nel pc5)

# openvpn --config /etc/openvpn/client.conf (nel pc3)

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 209.82.135.18Wed Sep 7 15:45:29 2005 Initialization Sequence Completed

In sostituzione di questi comandi possiamo reiniziare il servizio openvpn tanto nel server quanto nel client con il seguente comando:

# /etc/init.d/openvpn restart

Dopo aver aperto la connessione, il client pc3 avrà una nuova interfaccia, la tap0, con l'indirizzo IP 1.0.0.2, che potrà connettersi al server 1.0.0.1 del pc5.

Andiamo sul server pc5 e diamo:

# ifconfig taptap0 Link encap:Ethernet HWaddr 01:F0:EF:27:41:4Cinet addr:1.0.0.1 Bcast:1.0.0.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:100RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

Nella riga inet addr vengono indicati ip, broadcast e netmask.Proviamo a pingare l'host che sappiamo connesso:

# ping 1.0.0.2PING 1.0.0.2 (1.0.0.2) 56(84) bytes of data.64 bytes from 1.0.0.2: icmp_seq=1 ttl=64 time=258 ms64 bytes from 1.0.0.2: icmp_seq=2 ttl=64 time=135 ms

Lo stesso potremmo fare nel pc3, cambiando opportunamente gli gli indirizzi IP.

In questo modo abbiamo già a disposizione un canale cifrato relativamente sicuro, per lo scambio di dati privati.

Perché OpenVPN continua a non fuzionare nonostante tu abbia seguito questi semplici passaggi?

OpenVPN è un programma VPN rilasciato con licenza GPL e permette di creare reti private virtuali tra client situati in reti separate.

Per questa guida si terrà in considerazione una rete virtuale formata da un Server e 3 Client:

Installiamo OpenVPN su tutti i pc

Server: 1. Generare chiave e certificato della Certificate Authority (CA)2. Generare chiave e certificato per il server3. Generare chiave e certificato per i client4. Generare i parametri Diffie Hellman5. Creazione file di configurazione per il server

Client: 1. Creazione file di configurazione per il Client

Server:Bisogna generare le chiavi e i relativi certificati che verranno utilizziati per criptare il traffico nella VPN:Nella directory dove è stato installato OpenVPN è presente la cartella easy-rsa che contiene i vari script necessari per la creazione delle chiavi e i certificati per il server ed ogni client.Generare chiave e certificato della Certificate Authority (CA):Quindi apriamo il prompt dei comandi di windows e digitiamo i seguenti comandi:cd C:\Programmi\OpenVPN\easy-rsainit-config.batvars.batclean-all.batbuild-ca.batInseriamo tutte le informazioni richieste dallo script build-ca.bat (Sono informazioni che

verranno inserite nel certificato, l’unica necessaria è: il Common Name in questo caso ho usato “server”):

C:\Programmi\OpenVPN\easy-rsa>build-ca.batLoading 'screen' into random state - doneGenerating a 1024 bit RSA private key..............++++++.........++++++writing new private key to 'keys\ca.key'-----You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [US]:State or Province Name (full name) [CA]:Locality Name (eg, city) [SanFrancisco]:Organization Name (eg, company) [FortFunston]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server’s hostname) []:serverEmail Address [[email protected]]:

Possiamo notare che con l’ultimo comando è stata creata una cartella “keys” contenente la chiave e il certificato della certificate authority (CA)Generare chiave e certificato per il server:Digitiamo il comando:build-key-server.bat serverOtteniamo:

C:\Programmi\OpenVPN\easy-rsa>build-key-server.bat serverLoading ’screen’ into random state - doneGenerating a 1024 bit RSA private key.++++++……………++++++writing new private key to ‘keys\server.key’—–You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter ‘.’, the field will be left blank.—–Country Name (2 letter code) [US]:State or Province Name (full name) [CA]:Locality Name (eg, city) [SanFrancisco]:Organization Name (eg, company) [FortFunston]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server’s hostname) []:serverEmail Address [[email protected]]:

Please enter the following ‘extra’ attributesto be sent with your certificate requestA challenge password []:An optional company name []:Using configuration from openssl.cnfLoading ’screen’ into random state - doneCheck that the request matches the signatureSignature okThe Subject’s Distinguished Name is as followscountryName           :PRINTABLE:’US’stateOrProvinceName   :PRINTABLE:’CA’localityName          :PRINTABLE:’SanFrancisco’organizationName      :PRINTABLE:’FortFunston’commonName            :PRINTABLE:’server’emailAddress          :IA5STRING:’[email protected]’Certificate is to be certified until Sep 15 11:02:56 2018 GMT (3650 days)Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]yWrite out database with 1 new entriesData Base Updated

Abbiamo generato la chiave e il certificato per il serverGenerare chiave e certificato per i client:Digitiamo i comandi:build-key.bat client1build-key.bat client2build-key.bat client3Come per gli script precedenti inserire almeno il Common Name quando richiesto (inserire ad esempio: “client1″, “client2″, “client3″)Generare i parametri Diffie HellmanDigitiamo il comando:build-dh.batOra abbiamo la cartella keys con le chiavi e i relativi certificati dei diversi host:

Nome file Necessario a Descrizione Segreto

ca.crt server e tutti i client Certificato CA Principale NO

ca.key server Chiave CA Principale SI

dh{n}.pem server Parametri Diffie Hellman NO

server.crt server Certificato Server NO

server.key server Chiave Server SI

client1.crt client1 Certificato Client1 NO

client1.key client1 Chiave Client1 SI

client2.crt client2 Certificato Client2 NO

client2.key client2 Chiave Client2 SI

client3.crt client3 Certificato Client3 NO

client3.key client3 Chiave Client SI

Bisogna distribuire le chiavi e i certificati ai vari client secondo questa tabella, quindi nel caso del client1 i file da trasferire sono:  client1.crt, client1.key e ca.crtCreazione file di configurazione per il server:Per creare questo file di configurazione si può utilizzare il file server.ovpn presente nella cartella “sample-config” e modificare le direttive ca, cert, key e dh presenti al suo interno scrivendo il path comleto dei file ed infine spostare il file nella cartella config, nel mio caso:

…# (see “pkcs12″ directive in man page).ca C:\Programmi\OpenVPN\easy-rsa\keys\ca.crtcert C:\Programmi\OpenVPN\easy-rsa\keys\server.crtkey C:\Programmi\OpenVPN\easy-rsa\keys\server.key # This file should be kept secret

# Diffie hellman parameters.# Generate your own with:# openssl dhparam -out dh1024.pem 1024# Substitute 2048 for 1024 if you are using# 2048 bit keys.dh C:\Programmi\OpenVPN\easy-rsa\keys\dh1024.pem

# Configure server mode and supply a VPN subnet…

A questo punto il server è configurato, cliccando con il tasto destro sul file server.ovpn e selezionando “Start OpenVPN on this config file” è possibile avviare il server

ClientCreazione file di configurazione per il client:Dopo aver trasferito i file chiave e i certificati sui relativi client bisogna creare il file di configurazione del client, anche in questo caso si può utilizzare il file client.ovpn presente in “sample-config” impostando la direttiva “remote my-server 1194″ sostituendo my-server con l’ip del server e settando le direttive “ca”,”cert” e “key” col path dei relativi file. Come nel caso del server il file di configurazione và spostato nella cartella config e si può avviare il client OpenVPN cliccando con il tasto destro sul file client.ovpn e selezionando “Start OpenVPN on this config file”

Si ricorda che in caso di utilizzo di firewall o router con NAT abilitato bisogna aprire la porta UDP 1194, per un riferimento completo alle funzionalità e le direttive di configurazione di OpenVPN si consiglia di leggere il Manuale

OpenVPN: un server VPN open source

Lo scambio di informazioni tra sedi remote rappresenta ormai una delle esigenze più sentite in ambito lavorativo. Questo vale sia per aziende di grandi dimensioni con budget ragguardevoli dedicati al settore IT, sia per piccole realtà che non possono sostenere i costi di un collegamento dedicato. Andando ancor più nel particolare immaginate la comodità di poter accedere alle informazioni del nostro computer in ufficio quando si siamo in giro per il mondo o, come purtroppo capita, quando siamo a casa malati.

Realizzare tutto questo a costi accessibili è possibile implementando una VPN. Per VPN, Virtual Private Network, si intende una rete privata virtuale creata utilizzando un mezzo di trasmissione pubblico, nella maggior parte dei casi identificabile con Internet. In parole povere dovremo creare un canale o tunnel virtuale che colleghi tra loro due reti, nel caso più semplice rappresentate da due computer raggiungibili tramite Internet. Ovviamente tale sistema deve garantirci un elevato grado di sicurezza. L'accesso deve essere consentito solo ad utenti autorizzati, i dati in transito sulla rete pubblica devono risultare cifrati, devono essere ridotti al minimo i rischi di furto d'identità digitale ed impedita l'alterazione delle informazioni trasmesse.

In un panorama che offre molte soluzioni commerciali spicca una soluzione open source (e gratuita): OpenVPN (http://openvpn.net). Il software si compone di una parte server: un demone che resta in ascolto in attesa di connessioni, ed una parte client che, collegandosi, richiede l'instaurarsi della VPN. Entrambe le parti, prima di trasferire informazioni, operano i necessari controlli per verificare l'identità dell'interlocutore.

Questo primo articolo a carattere introduttivo, descriverà le caratteristiche generali di Open VPN, attualmente giunto alla versione 2.0.9, permettendovi di valutare se possa essere o meno una soluzione adatta alle vostre esigenze.

Semplicità e FlessibilitàRispetto ad altre implementazioni OpenVPN risulta una soluzione molto snella basata sullo standard SSL/TLS, protocollo ormai consolidato per garantire la sicurezza delle comunicazioni su Internet. Per questo si appoggia ad OpenSSL, altro noto tool open source, di cui abbiamo già parlato negli articoli dedicati ad Apache ed alle connessioni SSL (http://server.html.it/articoli/leggi/2416/apache-e-ssl-creazione-di-certificati-per-connessioni-cifrate/). Differentemente da altre soluzioni non utilizza IPSec, ma genera un tunnel point-to-point TCP over UDP lavorando in user space.

Per ridurre l'occupazione di banda ed i tempi di risposta il software opera una compressione sui dati trasmessi utilizzando le librerie LZO, che costituiscono dunque un prerequisito come il già menzionato OpenSSL.OpenVPN supporta svariati metodi di autenticazione dei client: nome utente e password, certificati digitali X509, smart card etc. permettendo di scalare da soluzioni semplici, in cui un server deve gestire un unico client, a soluzioni enterprise molto più complesse. Il server OpenVPN può effettuare il push verso i client di opzioni DHCP come DNS ed indirizzi di server WINS.

La configurazione, nello stile Unix, avviene editando dei file di testo, uno per la parte server ed uno per la parte client. Questo, a mio modo di vedere, rappresenta un vantaggio e fornisce una maggiore consapevolezza e controllo sulle impostazioni adottate. Esistono, inoltre, numerosi e ben commentati esempi di configurazione che coprono le più disparate esigenze. Un giro in rete vi permetterà di verificare che la documentazione reperibile è abbondante e non limitata al sito del progetto. Niente paura se avete problemi con le lingue straniere, potrete trovare numerosi documenti in lingua italiana.

MultipiattaformaIl software è disponibile per diverse piattaforme come Linux, Windows, MacOs X, permettendo, se necessario, l'interoperabilità tra i diversi sistemi. I sorgenti sono naturalmente prelevabili dall'area download (http://openvpn.net/index.php/downloads.html) del sito madre.

Per chi utilizza Linux e vuole evitare la compilazione del codice sorgente, sono facilmente reperibili i pacchetti precompilati per varie distribuzioni. In ambito Windows si può downlodare dal sito del progetto l'installer .exe o, grazie al lavoro di Mathias Sundman, una GUI che rende più familiare la gestione del software a chi utilizza questo sistema. Il pacchetto (http://openvpn.se/) installa simultanemente OpenVPN e l'interfaccia grafica.Per gli affezionati della mela Angelo Laub e Dirk Theisen hanno sviluppato Tunnelblick (http://www.tunnelblick.net/), una GUI per OS X. Sempre in termini di portabilità OpenVPN è progettato per funzionare con le interfacce di rete virtuali TUN/TAP disponibili su molti sistemi operativi.

Routing ed Ethernet BridgingOpenVPN consente due modalità operative alternative Routing e Bridging.

La prima soluzione risulta preferibile sia in termini di efficienza che di semplicità di configurazione. Il client in questo caso utilizza la propria sottorete: vengono impostate sia lato client che lato gateway remoto, delle route che permettono la trasmissione dei pacchetti attraverso la VPN. Si noti che parlando di client non si fa riferimento solo al caso di una singola macchina, ma potrebbe trattarsi di un'intera sottorete.

Alcune circostanze impongono però il ricorso al Bridging. In tal caso l'interfaccia di rete fisica viene collegata via software con l'interfaccia virtuale utilizzata da OpenVPN creando appunto un ponte, bridge. Tale operazione consente di ottenere una rete virtuale su una singola sottorete. Alcuni esempi classici, riportati dalla documentazione ufficiale, in cui si rende necessario il bridging sono:

la VPN deve gestire protocolli non IP come IPX; si utilizzano applicazioni che mandano comunicazioni in broadcast; si vuole permettere il browsing delle condivisioni di rete windows senza disporre di un

server WINS o Samba.

Per ora ci fermiamo qui. Se le informazioni di questa breve panoramica hanno solleticato la vostra curiosità vi do appuntamento su queste pagine per cominciare a "sporcarci le mani" con l'installazione e la configurazione di OpenVPN.

Nella prima parte di questo articolo sono state brevemente illustrate le caratteristiche di OpenVPN (http://openvpn.net), il software VPN open source e multipiattaforma. I sistemi supportati sono Linux, Solaris, OpenBSD, FreeBSD, NetBSD, Mac OS X, Windows. Per ognuno di essi è bene verificare la versione del kernel o del sistema operativo minimi richiesti.

Di seguito ci occuperemo dell'installazione immaginando di utilizzare per i nostri esperimenti due macchine una server, destinata ad accettare le connessioni, ed una client che ad essa si collegherà tramite il tunnel cifrato.

Installazione su LinuxCome di consueto il sistema di riferimento per l'ambiente linux sarà Fedora, nello specifico la versione 8. L'installazione di OpenVPN è legata ad alcuni prerequisiti:

openssl lzo pam

Di seguito seguiremo la più semplice installazione da pacchetti precompilati sfruttando YUM, il packet manager di Fedora. Il software si occuperà di verificare per noi che le dipendenze siano soddisfatte proponendoci, in caso negativo, l'installazione di eventuali altri pacchetti.Procediamo con il consueto:

[root]# yum install openvpn

Al momento in cui viene scritto l'articolo il comando propone l'installazione della versione 2.1-0.19.rc4 dal repository fedora, proseguiamo l'installazione rispondendo affermativamente (anche per le eventuali dipendenze richieste). Se preferite la compilazione, dopo aver scompattato i sorgenti, dovrete usare, al solito, la sequenza:

[root]# ./configure[root]# make && make install

Ricordo che i sorgenti sono disponibili nell'area download (http://openvpn.net/index.php/downloads.html) del sito del progetto. La versione stabile attualmente prelevabile è 2.0.9, se volete potete però provare la 2.1_rc7. Prima di agire, è consigliabile leggere attentamente il file INSTALL di documentazione per eventuali particolari opzioni di configurazione.

Il comodo automatismo del packet manager ci ha nascosto le modifiche apportate al sistema, cerchiamo di investigare in proposito:

[root]# which openvpn/usr/sbin/openvpn

L'eseguibile, come era facile attendersi, è stato posizionato in /usr/sbin.

[root]# chkconfig --list | grep openvpnopenvpn 0:off 1:off 2:off 3:off 4:off 5:off 6:off

Il precedente comando ci mostra come sia già tutto predisposto per lanciare OpenVPN all'avvio del sistema, basterà portare ad on i runlevel desiderati. Infine notiamo la creazione della directory /usr/share/openvpn/easy-rsa contenente alcune utility che sfrutteremo largamente più avanti. Il percorso di tale directory è legato al tipo di installazione ed alla distribuzione usata. Se non state operando su Fedora dovrete localizzarne la posizione. Per comodità e per evitare sovrascritture da parte di successivi aggiornamenti, creiamo la directory /etc/openvpn e copiamo easy-rsa al suo interno.

È importante notare come la procedura d'installazione seguita coincida per il server e per il client, saranno poi le impostazioni di configurazione a decidere il ruolo assunto.

Installazione su WindowsPer questa piattaforma è conveniente installare la GUI di Mathias Sundman (cui hanno collaborato altri programmatori) che rende più agevole l'utilizzo del software. Anziché scaricare l'installer dal sito del progetto conviene prelevare il pacchetto openvpn-2.0.9-gui-1.0.3-install.exe (http://openvpn.se/download.html) comprensivo dell'interfaccia grafica e del programma.

Il classico wizard ci guiderà nell'installazione del software che di default avviene in C:\Programmi\OpenVPN, di seguito faremo sempre riferimento a tale posizione. Quando ci verrà proposta la scelta dei componenti da installare aggiungiamo, spuntandolo, "My Certificate Wizard".

Aprendo dal pulsante Start il menù Programmi troveremo il nuovo sottomenu OpenVPN, mentre aprendo dal pannello di controllo l'elenco dei servizi troveremo OpenVPN Service che potrà essere lanciato automaticamente all'avvio del sistema.

Al termine ritroveremo nella directory scelta per l'installazione la cartella easy-rsa del tutto simile a quella sopra menzionata. Anche in questo caso la procedura d'installazione per server e client è la medesima.

Certification Authority (CA)OpenVPN, come menzionato nell'articolo introduttivo, si basa sul protocollo SSL/TLS. Inizialmente dovremo organizzare una infrastruttura di chiavi pubbliche, PKI, dove il server e ciascuno dei client coinvolti siano in possesso di una chiave pubblica ed una chiave privata.

Procederemo in maniera analoga (non identica!!) a quanto descritto in Apache e SSL: creazione di certificati per connessioni cifrate (http://server.html.it/articoli/leggi/2416/apache-e-ssl-creazione-di-certificati-per-connessioni-cifrate), per chi non avesse chiari i concetti relativi alla crittografia asimmetrica può essere utile la lettura della guida Crittografia e PGP (http://sicurezza.html.it/guide/leggi/85/guida-crittografia-e-pgp/).

Cominceremo assumendo il ruolo di Autorità di Certificazione nei cui panni firmeremo i certificati del server e del/i client. Prima che si instauri il rapporto di fiducia tra client e server, OpenVPN prevede che entrambi controllino il certificato fornito dalla controparte. In altri termini il client verificherà il certificato del server ed il server quello del client. Perché la verifica abbia esito positivo ciascun certificato dovrà essere firmato dalla CA e validate le informazioni in esso contenute.

Per realizzare quanto descritto posizioniamoci sulla macchina che utilizzeremo come server e sfruttiamo gli script forniti da OpenVPN e memorizzati nella directory easy-rsa.

Chiave privata e certificato della CA su LinuxAll'interno della directory /etc/openvpn/easy-rsa/2.0 individuiamo il file vars. Apriamolo con il nostro editor di testo preferito ed andiamo a modificare i parametri di default che si trovano alla fine:

export KEY_COUNTRY="US"export KEY_PROVINCE="CA"export KEY_CITY="SanFrancisco"export KEY_ORG="Fort-Funston"export KEY_EMAIL="[email protected]"

Ad esempio cosí:

export KEY_COUNTRY="IT"export KEY_PROVINCE="Italy"export KEY_CITY="Roma"export KEY_ORG="HtmlIt"export KEY_EMAIL="[email protected]"

Ora lanciamo i primi script per inizializzare la PKI:

[root]# ./vars[root]# ./clean-all[root]# ./build-ca

Attenzione che il comando clean-all, il cui compito è fare pulizia, andrà ad eliminare una eventuale directory keys preesistente e contenete chiavi precedentemente generate.L'ultimo script build-ca, richiamando openssl, permette di generare certificato e chiave privata della CA:

Generating a 1024 bit RSA private key.................................Country Name (2 letter code) [IT]:State or Province Name (full name) [Italy]:Locality Name (eg, city) [Roma]:Organization Name (eg, company) [HtmlIt]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server's hostname) [HtmlIt CA]:OpenVPN-CAEmail Address [[email protected]]:

Si noti che l'output generato dal comando è stato accorciato per riportare solo gli elementi rilevanti. Avendo editato il file vars l'unico parametro da inserire nella procedura interattiva sarà il Common Name per cui è stato scelto arbitrariamente "OpenVPN-CA". Per gli altri, premendo il tasto invio, sarà mantenuto il valore preimpostato.Alla fine troveremo nella directory /etc/openvpn/easy-rsa/2.0/keys i file ca.crt e ca.key rispettivamente certificato e chiave privata della CA.

Chiave privata e certificato della CA su Windows

Le differenze sono minime, in questo caso bisogna iniziare aprendo una console e spostandosi in C:\Programmi\OpenVPN\easy-rsa. Ora lanciamo il file batch:

> init-config

che provvederà a copiare i file di configurazione. Successivamente editiamo vars.bat come mostrato nel precedente paragrafo ed eseguiamo:

> vars> clean-all> build-ca

La procedura di generazione delle chiavi risulta perfettamente identica.

Certificato e chiave privata del serverOra preoccupiamoci del server e pensiamo a generare le chiavi ad esso relative. Su Linux, sempre posizionati in /etc/openvpn/easy-rsa/2.0/, lanciamo il comando:

[root]# ./build-key-server server

Su Windows da C:\Programmi\OpenVPN\easy-rsa:

> build-key-server server

Lo script provvederà alla generazione delle chiavi in modo simile a quanto fatto per la CA, ma con alcune differenze. Anche in questo caso manteniamo i dati di default che ci vengono proposti tranne per il Common Name dove indicheremo il nome generico "server":

.................Organization Name (eg, company) [HtmlIt]:Organizational Unit Name (eg, section) []:Common Name (eg, your name or your server's hostname) [server]:serverEmail Address [[email protected]]:

Al termine della procedura ci verrà chiesto di confermare la firma del certificato con la chiave privata della CA, naturalmente rispondiamo affermativamente:

.........................Certificate is to be certified until Apr 16 16:40:53 2018 GMT (3650 days)Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]yWrite out database with 1 new entriesData Base Updated

A questo punto il nostro server è in possesso di un certificato nuovo fiammante valido 10 anni, salvo revoche. Nella solita directory keys tra i vari file troveremo server.crt e server.key.

Certificato e chiave privata dei client

Con un ultimo sforzo terminiamo la procedura di generazione delle chiavi lanciando il comando:

[root]# ./build-key client1

su Linux, e:

> build-key client1

su Windows. Proseguiamo come nel precedente paragrafo dove come Common Name inseriremo "client1 ". Accettiamo la firma del certificato ed otterremo i file client1.crt e client1.key rispettivamente certificato e chiave privata del client.

Se i client sono più di uno basterà ripetere la procedura cambiando il nome che li individua. Ovviamente in una situazione reale si potrebbero usare nomi maggiormente identificativi per le macchine che implementeranno la VPN.

I parametri Diffie-Hellman e la chiave staticaGeneriamo ora i parametri Diffie-Hellman, usati per costruire la chiave di sessione, di default ricreata ogni ora. La procedura richiede un po' di tempo mentre, una volta implementata la VPN, la generazione della chiave sarà molto rapida. Su Linux digitiamo:

[root]# ./build-dh

mentre su Windows:

> build-dh

Il risultato sarà il file dh1024.pem, sempre posizionato nella directory keys.

Infine per completezza vediamo come sia possibile creare una chiave tls o statica:

[root]# openvpn --genkey --secret key.txt

Questa nelle configurazioni più semplici o nei test può essere usata da sola, ad esempio per implementare una VPN point-to-point, senza organizzare il sistema di PKI. Si osservi che su Windows la generazione della chiave statica può essere ottenuta selezionando dal menu dei Programmi il sottomenu OpenVPN e la voce Generate a static OpenVPNkey.

Prime conclusioniA questo punto possiamo mettere un po' d'ordine creando una directory chiamata server all'interno della quale copieremo i file:

server.crt server.key ca.crt key.txt dh1024.pem

e poi tante directory quanti sono i client, ad esempio "client1", in cui copieremo:

client1.crt client1.key ca.crt key.txt

Ora per realizzare la nostra VPN non ci resta, si fa per dire, che trasferire i file e configurare server e client, ma questo sarà oggetto della prossima parte.

Avviamoci ora alla terza e ultima sezione relativa ad OpenVPN, il software VPN open source. Nelle precedenti sezioni ci eravamo occupati dell'installazione e della generazione di chiavi e certificati necessari alla creazione del tunnel cifrato. Al termine della procedura avevamo creato una directory server contenente i file relativi al server e tante directory client1, client2,.... contenenti i file relativi ai singoli client. Innanzitutto eseguiamo un backup di tali directory e dei file relativi alla CA per evitare che qualche inconveniente pregiudichi il lavoro fatto per creare la PKI (public key infrastructure).

Passiamo ora alla configurazione vera e propria del software, puntando in particolare l'attenzione sulla parte server. Nell'esempio che segue considereremo di implementare una routed VPN: il client utilizza la propria sottorete e vengono implementate delle regole di routing ad entrambe le estremità del canale in modo tale che i pacchetti possano transitarvi. Ricordo che l'alternativa è rappresentata dalla modalità ethernet bridging. Per maggiori dettagli vi consigliamo di leggere le sezioni di apertura (http://server.html.it/articoli/leggi/2587/openvpn-un-server-vpn-open-source/) o, per approfondimenti sul tema, la documentazione ufficiale (http://openvpn.net/index.php/documentation/miscellaneous/ethernet-bridging.html).

Configurazione del server

Posizioniamoci sulla macchina che fungerà da server e copiamo il contenuto della directory server in /etc/openvpn. Se rammentate nelle precedenti sezioni avevamo appositamente predisposto tale directory; su Windows copieremo tutto in C:\Programmi\OpenVPN\config (file:///C:/Programmi/OpenVPN/config).

Per nostra fortuna insieme al software vengono distribuiti alcuni file di configurazione esemplificativi ed altri utili script. Tali file risultano abbondantemente commentati, costituendo una buona base di partenza: dopo un'attenta lettura sarà facile personalizzarli per adattarli alle nostre esigenze. Nel caso della distribuzione Linux di riferimento, Fedora 8, i file saranno raggruppati in /usr/share/doc/openvpn-2.1/sample-config-files. Su Windows li trovate in C:\Programmi\OpenVPN\sample-config, l'unica sostanziale differenza sarà che su tale sistema hanno estensione .ovpn mentre nei sistemi unix-like .conf.

Individuiamo dunque il file server.conf che si riferisce ad un server multi-client e copiamolo nella directory di configurazione. Ora apriamolo con il nostro editor di testi preferito e cominciamo ad intervenire sulle direttive. In alcuni casi sarà sufficiente decommentarle (se sono commentate), in altri sarà necessario personalizzarle. Come risulta subito evidente i caratteri utilizzati per i commenti sono ; o #.

Di seguito prenderemo in considerazione le più importanti direttive descrivendole brevemente:

local 192.168.0.1

port 1194proto udpdev tun

La prima direttiva local, opzionale, specifica l'indirizzo IP su cui il demone OpenVPN sarà in ascolto. Nel caso sulla nostra macchina siano configurati più indirizzi potremo indicarne uno. La direttiva port specifica la porta di ascolto: 1194 è quella di default, potremmo evidentemente sceglierne una diversa. Con proto si specifica il protocollo utilizzato: solitamente è udp ma potremmo anche modificare la direttiva in tcp. Per indicare l'interfaccia di rete virtuale utilizziamo la direttiva dev. Specificando la parola chiave tun richiediamo la creazione di un tunnel ip routed mentre con tap richiederemmo l'ethernet bridging.

Le seguenti direttive specificano la posizione ed il nome dei file relativi al sistema PKI:

ca ca.crtcert server.crtkey server.keydh dh1024.pem

Nell'ordine indichiamo il certificato della CA, il certificato del server, la chiave privata del server ed infine i parametri diffie-hellman. Tutti file che avevamo generato nel precedente articolo, salvato nella citata directory server ed infine copiato in /etc/openvpn. Se desideriamo posizionarli in maniera diversa dobbiamo specificare per ciascuno di essi l'esatto path.

Continuiamo la configurazione del file server.conf (o server.ovpn in Windows).

server 10.8.0.0 255.255.255.0

Con questa direttiva stabiliamo che la nostra macchina lavorerà in modalità server ed acquisirà il numero IP 10.8.0.1. Ai client verranno assegnati altri indirizzi della rete 10.8.0.0/24. Se la classe è già utilizzata nella nostra infrastruttura di rete possiamo, ovviamente, specificarne una diversa. Questa direttiva è tipica della modalità routed VPN, in caso si adotti il bridging andrà commentata ed al suo posto utilizzata server-bridge.

Con:

ifconfig-pool-persist ipp.txt

specifichiamo un file dove registrare la corrispondenza tra client e IP virtuali assegnati. Se per qualche motivo la VPN dovesse cadere, una volta ripristinata, potrà riassegnare gli stessi numeri.

La direttiva push ci permette di inviare ai client alcune opzioni ad esempio:

push "route 192.168.20.0 255.255.255.0"push "dhcp-option DNS 10.8.0.1"push "dhcp-option WINS 10.8.0.1"push "redirect-gateway"

Con la prima consentiamo ai client di raggiungere altre reti dietro al server, ovviamente per rendere bidirezionale la comunicazione tali reti dovranno poter a loro volta effettuare il routing verso il pool

di indirizzi della VPN (10.8.0.0/24). La seconda e la terza consentono di inviare ai client alcune impostazioni tipiche delle reti Windows come server dns e wins.

L'ultima direttiva indica ai client di rindirizzare tutto il traffico attraverso il tunnel VPN, anche la navigazione su Internet ad esempio. Come si può notare queste direttive sono molto specifiche, lasciatele commentate se non ne avete bisogno, personalizzatele se intendete sfruttarle.

keep-alive 120 10

Con la precedente istruzione richiediamo la verifica ogni 10 secondi che il link sia attivo (in modo simile a un ping) se non si ottiene risposta per 120 secondi si assumerà che sia down.

Nelle precedenti sezioni avevamo visto come fosse possibile creare una chiave segreta tls che avevamo chiamato key.txt.

tls-auth key.txt 0

Con questa direttiva ne specifichiamo l'utilizzo: ovviamente la medesima chiave va copiata sia sul server sia sui client. Il parametro numerico finale dovrà essere 0 per il server e 1 per i client.

Con:

cipher BF-CBC

indichiamo l'algoritmo crittografico che dovrà essere usato, nell'esempio Blowfish, che è poi la scelta di default. Il medesimo algoritmo andrà specificato anche lato client.

Per ridurre i privilegi del demone OpenVPN dopo l'avvio eliminiamo il commento a:

user nobodygroup nobody

Naturalmente tali direttive non hanno ragione di esistere su un server Windows. Con la successiva istruzione attiviamo la compressione dei dati che transitano attraverso il tunnel VPN, tale opzione dovrà essere utilizzata anche sui client:

comp-lzo

Infine vediamo alcune impostazioni relative all'attività di log:

status openvpn-status.loglog openvpn.logverb 4

La direttiva status specifica un file dove memorizzare le informazioni correnti sulle connessioni: viene riscritto ogni minuto. Per default i messaggi di log andrebbero al syslog, ma con la seconda direttiva è possibile richiedere la creazione di un file specifico openvpn.log. Se invece dell'istruzione log usiamo log-append all'avvio di OpenVPN il file non verrà troncato ed i messaggi verranno accodati. Per concludere verb identifica il livello di, passateci il termine, "verbosità" desiderato in una scala che va da 0 a 9.

Sostanzialmente il file di configurazione rimane il medesimo anche in ambiente Windows, con l'accortezza di mettere tra doppi apici eventuali path e raddoppiare le backslash.

Avvio del serverA questo punto non ci resta che avviare OpenVPN sul nostro server:

[root]# openvpn --config /etc/openvpn/server.conf

L'output, piuttosto lungo, fornisce una serie di messaggi che, armandosi di pazienza, conviene consultare per verificare la correttezza delle impostazioni almeno le prime volte ed in fase di sperimentazione. Il tutto dovrebbe terminare con "Initialization Sequence Completed". Attenzione se avete decommentato la direttiva log o log-append l'output non comparirà a video, ma nel relativo file openvpn.log. Ora lanciando il comando:

[root]# ifconfig

noteremo l'aggiunta dell'interfaccia di rete virtuale tun0 riportante inet addr:10.8.0.1. In /etc/openvpn troveremo, come richiesto in fase di configurazione, i file ipp.txt, openvpn-status.log ed eventualmente openvpn.log.

Nell'articolo dedicato all'installazione del software, avevamo rilevato come il pacchetto precompilato si occupasse di aggiungere OpenVPN all'elenco dei servizi e di creare in /etc/init.d lo script di avvio openvpn. Possiamo quindi automatizzare il lancio del demone nei runlevel desiderati ad esempio:

[root]# chkconfig openvpn --level 345 on

e gestirne automaticamente l'avvio, lo stop, la ripartenza:

[root]# service openvpn start

In questo caso la directory /etc/openvpn verrà letta alla ricerca di file con estensione .conf ed una volta individuati si avvierà un'istanza per ogni file di configurazione trovato.

Analogamente su Windows un click con il tasto destro sul file server.ovpn mostrerà nel menu contestuale la voce "Start OpenVPN on this config file". Alternativamente è possibile attivare il menu della GUI cliccando con il tasto destro sull'icona che OpenVPN ha creato nella system tray. Accedendo dal Pannello di controllo all'elenco dei servizi di Windows sarà possibile impostarne l'avvio automatico al prossimo riavvio. Il software effettuerà una scansione della directory C:\Programmi\OpenVPN\config alla ricerca di file con estensione .ovpn.

Configurazione dei clientSpostiamoci ora su un client, copiamo la corrispondente directory con chiavi e certificati in /etc/openvpn, copiamo il file di esempio client.conf (o client.ovpn) e modifichiamolo, supportati dai commenti. È fondamentale che vi sia esatta corrispondenza con le scelte operate nella configurazione lato server ad esempio il tipo di interfaccia virtuale tun/tap, il protocollo udp/tcp, l'algoritmo di cifratura, la chiave tls e così via.

Soffermiamoci brevemente solo sulle direttive fondamentali e tipiche dei client, per le rimanenti valgono considerazioni analoghe a quelle fatte per il server.

clientremote 11.22.33.44 1194

La prima stabilisce che la macchina si comporterà da client e quindi riceverà alcune configurazioni dal server a cui si collega. La seconda invece stabilisce a che indirizzo IP dovrà collegarsi il client e su che porta. Naturalmente se la VPN viene implementata attraverso Internet il numero IP dovrà corrispondere a quello pubblico mediante il quale sia possibile raggiungere il server.

Ricordo che le direttive ca, crt e key devono correttamente puntare ai corrispondenti file del client e se utilizzate tls-auth il parametro numerico deve essere posto a 1.

A questo punto possiamo avviare il client in maniera analoga a quanto fatto per il server. Se tutto funziona correttamente e la sequenza di inizializzazione è completa dovremmo essere in grado di pingare il server all'indirizzo 10.8.0.1.

ConclusioniIn queste pagine abbiamo visto solo una parte delle possibilità offerte da OpenVPN un software veramente flessibile, per un panorama completo consiglio di consultare il sito del progetto (http://openvpn.net). Vale la pena ribadire che, data la sua natura multipiattaforma, potremmo collegare server e client su cui girano sistemi operativi diversi. Può essere ad esempio un ottimo sistema per amministrare un server Windows dalla nostra linux box tramite VNC utilizzando però una connessione protetta o accedere ai documenti delle condivisioni tramite Samba.

È doveroso anche notare che la strutturazione delle reti risulta spesso complessa ed il lavoro di configurazione potrebbe coinvolgere tutte le altre apparecchiature di rete, come router e firewall, che stanno tra server e client. Talora la configurazione del software sarà solo la metà del lavoro. Niente paura in caso di bisogno provate a consultare l'abbondante documentazione ufficiale ed i file di esempio forniti insieme al software.

Realizzare OpenVPN portatileAccedere ad una rete VPN realizzata con OpenVPN non è sempre una cosa facile. Basti considerare che per collegarsi alla propria VPN da un computer comune è necessario installare il programma e la configurazione appropriata.

Possiamo risolvere questo problema mettendo OpenVPN in una chiavetta USB!(Ovviamente la configurazione di OpenVPN deve essere già stata effettuata e deve essere funzionante, per poter funzionare anche su chiavetta USB)

Tramite le istruzioni che ho trovato su questo sito, è possibile creare un client OpenVPN portatile completo di configurazione personalizzata, da utilizzare in tutti i sistemi Windows XP di cui siete amministratori.I File nella pennetta si occuperanno di installare e disinstallare il dispositivo virtuale di rete che permette le comunicazioni VPN, in modo da non lasciare tracce sul computer in uso.

La struttura che dovrete avere nella vostra cartella è questa:

E:\VPNCLIENT│ VPNSTART.bat│ VPNSTOP.bat│├───driver│ OemWin2k.inf│ tap0801.sys│├───config│ │ client.ovpn│ ││ └───certificati│ client.crt│ client.key│ ca.crt│└───binca.crtdeltapall.batKILL.EXElibeay32.dlllibssl32.dllopenssl.cnfopenssl.exeopenvpn.exeopenvpnserv.exetapinstall.exe

Tutti i file da inserire nella vostra chiavetta USB li troverete dopo aver installato OpenVPN (oppure OpenVPN GUI) sul computer, non vi resta quindi che copiare i file riportati sopra nella giusta posizione.Gli unici file che dovrete scaricare perchè non compresi nel pacchetto sono:

Kill.exeopenvpnserv.exeVPNSTART.BATVPNSTOP.BAT

gli ultimi due perchè scritti artigianalmente dovranno contenere questo codice:

VPNSTART.BAT:

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

VPNSTOP.BAT:

@Echo Offbin\kill.exe openvpn.exe"bin\tapinstall.exe" remove tap0801pause

Per comodità potete scaricare lo zip di tutti i file mancanti qui.

La configurazione nel file client.ovpn rimane la stessa di un computer fisso, ad esclusione dei percorsi, che devono diventare relativi:...key "./config/certificati/client.keyca "./config/certificati/ca.crt"cert "./config/certificati/client.crt"...

Per connettersi alla VPN basta semplicemente cliccare due volte sul file VPNSTART.BAT e lasciare la finestra nera aperta.Quando avete finito la vostra connessione, cliccate due volte su VPNSTOP.BAT e la connessione si interromperà e tutte le finestre saranno chiuse automaticamente.

OpenVPN - Configurazione e Client ‘portatile’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 TAPproto tcp-server ifconfig 10.0.0.1 255.255.255.0 #definisco l’IP del server all’interno della subnet dedicata alla VPNtls-server

# Percorsi dei certificatikey "/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 serververb 4

mode serverduplicate-cn

ifconfig-pool 10.0.0.10 10.0.0.30 # Range di IP da assegnare ai clientsmssfix 1450#Mantiene il tunnel aperto effettuando dei ping a intervalli regolaripush "ping 10"

push "ping-restart 60"ping 10ping-restart 120#Invia le regole di routing ai clientspush "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 DNScomp-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_SERVERrport 8080proto tcp-clienttls-clientdev taptls-client

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

pullroute 192.168.0.0 255.255.255.0 10.0.0.1comp-lzoverb 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_SERVERrport 8080proto tcp-clienttls-clientdev taptls-client

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

pullroute 192.168.0.0 255.255.255.0 10.0.0.1comp-lzoverb 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 Offbin\kill.exe openvpn.exe"bin\tapinstall.exe" remove tap0801pause

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)