Realizzazione a cura di Matteo Agosti (149732) e Riccardo Ferrari (150191)

Indice

Introduzione

OpenVPN è un software Open Source concesso in licenza GPL. E' una soluzione “open” per implementare VPN attraverso SSL. Ricco di funzionalità permette di coprire diverse esigenze: dall'accesso da remoto del singolo pc alla propria lan, detta configurazione Road Warrior(s), ai collegamenti punto-punto per soluzioni lan-to-lan. La scalabilità è un punto forte permettendo di adattarsi alle piccole realtà come alle grandi enterprise per consentire accessi remoti a carico bilanciato, ridondati e con controlli di accesso. Implementa ed estende la sicurezza di rete a Layer 2 e 3 del protocollo OSI avvalendosi del protocollo SSL/TLS. Il supporto per l'autenticazione è flessibile e permette di sfruttare certificati o smart-card.

SSL è un protocollo aperto e non proprietario proposto da Netscape Corporation, si basa sull'utilizzo dei certificati per creare dei canali crittografati e consentire lo scambio di dati garantendone Riservatezza, Autenticazione e Integrità. TLS è l'implementazione IETF di SSL, quindi il suo successore, si differenzia di poco da SSL infatti SSL nella versione 3.1 equivale a TLS versione 1.0.

Il sito di riferimento per OpenVPN è http://www.openvpn.org, da cui è possibile scaricare i sorgenti dell'applicazione per compilarla oppure una serie di pacchetti già pronti per l'esecuzione. E' presente inoltre una versione Win32-Installer per gli utenti dei sistemi Microsoft. Le distribuzioni Linux possono fare affidamento sul repository di Dag Wieers da cui scaricare il pacchetto già compilato. Dal sito di OpenVPN è possibile accedere agli HOW-TO e altra documentazione come Articles, FAQ, Examples per capire, anche tramite esempi, come implementare la configurazione desiderata.

L'utilizzo di OpenVPN, una volta configurato, è molto semplice e la sua gestione può avvenire attraverso una delle tante GUI a disposizione per il proprio sistema operativo. Una volta richiesta la connessione alla LAN remota (se non impostata all'avvio del sistema) il suo funzionamento è trasparente all'utente. Lo stesso sistema operativo della macchina client si fa carico di instradare i pacchetti opportuni attraverso il tunnel sicuro stabilito da OpenVPN.

L'installazione del servizio nasce come parte applicativa del corso di Amministrazione di Reti di Calcolatori tenuto dal Prof. Massimo Bertozzi presso l' Università degli Studi di Parma , anno accademico 2004-2005. Lo scopo prefissato è stato quello di configurare un servizio di accesso tramite VPN alla rete della Palazzina 1 presso la Sede Scientifica di Ingegneria.

Lo scopo di questo documento è quello di descrivere dettagliatamente tutti i passi per l'installazione e la configurazione di un server VPN tramite l'applicativo multipiattaforma OpenVPN . In particolare, nell'ultima parte della trattazione, si dedicherà un ampio spazio a tutte le problematiche incontrate a causa della particolare topologia della rete da condividere e verranno inoltre mostrate le procedure da seguire per configurare ulteriormente il servizio di accesso tramite VPN.

Installazione

Prerequisiti di sistema

Prima di installare il server OpenVPN è bene assicurarsi di avere il supporto da parte del sistema operativo di una serie funzionalità che si rendono necessarie per il bridging e per il servizio di VPN stesso. In particolare, nel caso in esame, l'installazione su di una macchina Linux richiede che il kernel sia compilato con il supporto al bridging . Inoltre, è necessario assicurarsi di avere installate le utilità in spazio utente per la creazione del bridge fra le diverse schede di rete interessate nella configurazione.

Un'ulteriore aspetto non trascurabile è quello relativo alla gestione dei certificati. Tramite questo meccanismo si intende fornire maggior sicurezza nell'autenticazione degli utenti. A tal proposito, è necessario installare sul sistema una serie di software:

Nel caso in esame OpenVPN è stato installato su una macchina dotata di Ubuntu Linux che tramite il proprio gestore di pacchetti ha consentito di soddisfare tutte le dipendenze fra pacchetti in automatico.

Configurazione del Server

Da questo punto in poi tutta la trattazione farà riferimento al caso preso in esame. In particolare l'installazione è stata fatta su una macchina Linux dotata di una sola interfaccia di rete con indirizzo IP 160.78.28.61 , il cui gateway è 160.78.28.1 . La particolarità dell'installazione è che l'accesso al server VPN avviene sulla stessa interfaccia di rete che verrà poi condivisa. Come vedremo in seguito tale aspetto ha causato notevoli problemi e alcune "limitazioni" al servizio di bridging.

L'installazione inizia con l'aggiunta dei pacchetti relativi OpenVPN. In particolare, con riferimento ad Ubuntu Linux:

apt-get install bridge-utils
apt-get install openvpn
  

Una volta che i pacchetti sono stati installati e soddisfatte tutte le dipendenze, è consigliato creare una directory dove risiederanno poi tutti i file di configurazione. In particolare

mkdir /etc/openvpn  

A questo punto è necessario generare i certificati associati al server e ad un client di test. OpenVPN fornisce all'atto dell'installazione alcuni script utili a questo scopo. In un'installazione di default è possibile raggiungerli tramite

cd /usr/share/doc/openvpn/examples/easy-rsa/  

Prima di procedere è necessario modificare il file vars affinchè punti alla directory di configurazione del server OpenVPN e contenga i valori corretti da proporre durante il certificato. Di seguito vengono citati i valori modificati

export D=/etc/openvpn
export KEY_COUNTRY=IT  

export KEY_PROVINCE=PR
export KEY_CITY=PARMA
export KEY_ORG="Universita' degli Studi di Parma"
export KEY_EMAIL="Webmaster@CE.UniPR.IT"

A questo punto è possibile procedere con la creazione della Certificate Authority della macchina

. ./vars
./clean-all
./build-ca  

Il comando finale invocherà le utility del pacchetto OpenSSL che procederanno alla generazione della CA. L'utente deve a questo punto specificare una serie di parametri, alcuni dei quali vengono proposti in automatico prelevando dal file vars visto precedentemente. In particolare ciò che è stato modificato consiste in

Organizational Unit Name (eg, section) []: Dipartimento di Ingegneria dell'Informazione
Common Name (eg, your name or your server's hostname) []: AliceFord.CE.UniPR.IT  

A questo punto è necessario generare le chiavi che il server utilizzerà per firmare i certificati. Questo può essere fatto tramite il comando

./build-key-server server  

Verrà richiesto di specificare ancora una volta un Common Name che in questo caso dev'essere impostato a server . Inoltre, alla richiesta di firma del certificato è necessario rispondere con Yes .

Allo scopo di garantire la sicurezza durante lo scambio delle chiavi è indispensabile utilizzare un protocollo con il quale due client possano accordarsi. OpenVPN fa' uso dell'algoritmo di Diffie-Hellman che consente lo scambio di chiavi su un canale potenzialmente insicuro senza la necessità di avere a priori memorizzata una chiave per la cifratura del canale. Ancora una volta esiste un'utility per la generazione del certificato

./build-dh   

A questo punto, l'unica cosa che rimane da fare è generare i certificati che verranno utilizzati dai client. Questo può essere fatto tramite il comando

./build-key nomeclient  

dove nomeclient dev'essere qualcosa di identificativo per la data persona o insieme di persone che si vogliono autenticare. E' importante notare che ancora una volta verrà richiesto il Common Name che in questo caso deve coincidere con nomeclient .

Procediamo ora con la configurazione del bridge. Per bridge si intende un particolare dispositivo di rete virtuale che è in grado di accorpare dispositivi fisici facendoli risultare come un'unico dispositivo di rete con un indirizzo IP globale. Grazie a questa tecnica è possibile accorpare la scheda della rete privata virtuale del VPN con quella fisica della macchina consentendo il corretto passaggio dei pacchetti di broadcast e dunque il funzionamento di applicazioni come le condivisioni di reti microsoft senza la necessità che i client accedano ad un server Wins. In particolare, è stato creato un comodo script per la configurazione automatica del bridging che verrà di seguito mostrato

vim /etc/openvpn/bridge-start   
#!/bin/bash

# In questsa sezione vengono specificati i parametri
# della rete da configurare. In particolare tutto ciò
# che comincia con eth indica la scheda di rete connessa
# alla sottorete che si vuole condividere. 
# N.B. La specifica del gateway si rende necessaria in quanto
# i comandi per il bridging cancellano le routing table associate
# all'interfaccia specificata in eth
br="br0"
tap="tap0"
eth="eth0"
eth_ip="160.78.28.61"
eth_netmask="255.255.255.0"
eth_broadcast="160.78.28.255"
eth_gw="160.78.28.1"

# Caricamento moduli kernel
modprobe bridge
modprobe tun

# Creazione dei dispositivi tap
for t in $tap; do
	openvpn --mktun --dev $t
done

# Creazione del bridge
brctl addbr $br

# Aggiunta interfacce al bridge
brctl addif $br $eth
for t in $tap; do
	brctl addif $br $t
done

# Impostazioni modalita' promiscua per tap ed eth
for t in $tap; do
	ifconfig $t 0.0.0.0 promisc up
done
ifconfig $eth 0.0.0.0 promisc up

# Configurazione del bridge
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast

# Aggiunta del gateway di default
route add default gw $eth_gw  

Con le operazioni viste fino ad ora siamo riusciti ad avere un'installazione di OpenVPN completa, ma tuttavia non ancora funzionante. Ciò che manca è la configurazione vera e propria del server. Di seguito viene citato per intero il file presente sul server, con i dovuti commenti che spiegano le diverse righe di codice

vim /etc/openvpn/server.conf

# Parametri per la connessione. Assicurarsi
# che il server sia accessibile dall'esterno
# sulla porta UDP 80. Tale valore che in origine
# era 1194 (quello di default) e' stato modificato
# in modo da garantire la connessione da quelle reti
# che consentono il solo traffico sulla porta 80. 
# Attenzione pero', alcuni proxy vogliono sulla porta
# 80 solo traffico di tipo http.
proto udp
port 80

# Specifica del dispositivo virtuale per le
# connessioni VPN. In questo caso si tratta
# di quello utilizzato per connessioni di
# tipo bridged
dev tap

# Configurazione dei percorsi per la certificate
# authority, i certificati del server e infine
# la chiave per l'algoritmo di Diffie-Hellman
tls-server
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem

# Diciamo ad openvpn di comportarsi come
# se fosse un server e dunque ascoltare
# per chiamate in ingresso
mode server

# Consentiamo a più client di collegarsi
# con lo stesso certificato. In questo modo
# è possibile creare delle sorte di "gruppi
# di client"
duplicate-cn

# Diamo ai client la possibilità di vedersi
# fra loro sul circuito di rete virtuale
client-to-client

# Configurazione dell'indirizzo IP che avrà
# il server VPN all'interno del circuito di
# rete virtuale
ifconfig 10.10.10.1 255.255.255.0

# Configurazione del pool di indirizzi che verrà
# associato ai client sul circuito VPN
ifconfig-pool 10.10.10.2 10.10.10.100 255.255.255.0

# E' possibile inviare opzioni in stile DHCP ai client,
# in questo caso si cita l'esempio di un DNS, ma viene
# lasciato commentato per evitare che chi si collega
# dall'esterno rigiri tutte le sue richieste DNS
# all'interno della VPN
#push "dhcp-option DNS 160.78.28.83"

# Configurazione della route privata per VPN
push "route 10.10.10.0 255.255.255.0 10.10.10.1"

# Configuriamo la route per la rete a cui e' connesso
# il server, disabilitando pero' il gateway e il server
# stesso, in modo da evitare problemi di loop nelle
# tabelle di routing. 
# N.B. La direttiva net_gateway non e' supportata
# da tutte le combinazioni client vpn/os
push "route 160.78.28.1 255.255.255.255 net_gateway"
push "route 160.78.28.61 255.255.255.255 net_gateway"
push "route 160.78.28.0 255.255.255.0 10.10.10.1"

# Impostazioni route verso altre reti d'interesse
push "route 160.78.27.0 255.255.255.0 10.10.10.1"

# Avvio script configurazione firewall e instradamento
up ./firewall.sh

# Impostazioni aggiuntive server per il cui dettaglio
# si rimanda a man openvpn
mtu-test
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
ping 10
ping-restart 120
push "ping 10"
push "ping-restart 60"
comp-lzo
status openvpn-status.log
verb 4  

Come visibile all'interno del file di configurazione del server, è presente una direttiva per l'esecuzione di un file esterno chiamato firewall.sh . Lo scopo di tale script è quello di preimpostare il server affinchè consenta il corretto instradamento dei pacchetti provenienti dalla rete 10.10.10.x verso le reti (nel caso in esempio) 160.78.28.x e 160.78.27.x. In particolare, tale script conterrà le direttive:

#!/bin/bash
echo 1 >> /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE  

La configurazione e installazione è così terminata. L'ultimo step da fare è aggiungere al runlevel di avvio gli script /etc/openvpn/bridge-start e il comando dell'openvpn stesso che di solito è situato in /etc/init.d/openvpn . N.B. è necessario assicurarsi che lo script di avvio di openvpn parta dopo quello di configurazione del bridge, altrimenti si verrebbero a generare conflitti sulla creazione dei dispositivi virtuali TAP.

Configurzione dei client

Per quanto riguarda la configurazione del client si procede in modo analogo indipendentemente dal sistema operativo su cui si installerà il servizio di OpenVPN. Non ci si soffermerà dunque sui singoli pacchetti disponibili per i diversi OS, quanto invece sulla configurazione che risulta essere uguale per tutti.

La prima cosa da fare è assicurarsi che il client abbia i suoi certificati per l'accesso creati con le procedure viste prima. In particolare i file richiesti sono

Supponendo di inserire tutti questi file all'interno di una directory keys all'interno di quella dove sono presenti i file di configurazione, un generico script di impostazioni risulta essere il seguente

vim /myfolder/client.conf

# Configurazione parametri della connessione
# ed in particolare del server remoto
proto udp
port 80
dev tap 
remote 160.78.28.61

# Configurazione posizionamento dei certificati
tls-client 
ca keys/ca.crt 
cert keys/nomeclient.crt
key keys/nomeclient.key

# Configurazione dei parametri di openvpn, in
# particolare questi devono essere gli stessi
# del server, con l'aggiunta del parametro pull
# che serve per l'estrazione dell'indirizzo del
# client dal pool a disposizione del server
mtu-test 
tun-mtu 1500 
tun-mtu-extra 32 
mssfix 1450 
pull
comp-lzo 
verb 4   

Installazione di un client Microsoft Windows

La procedura di installazione di un client Windows e molto rapida e semplice. Dalla sezione download di OpenVPN si può scaricare la versione per i sistemi della Microsoft che, come la versione Linux, può agire sia da client che da server. E' tuttavia preferibile utilizzare un client che includa anche un GUI come ad esempio quella sviluppata da Mathias Sundman

Per un utente normale non sono necessarie particolari attenzioni e l'installazione si conclude in pochi istanti. Per i sistemi Windows 2000/XP è importante confermare l'installazione dei drivers per la periferica virtuale TAP che essendo privi di firma digitale, non vengono installati automaticamente. Terminata l'installazione è sufficiente copiare il file di configurazione prodotto per il particolare server VPN e accertarsi di avere i certificati nei percorsi corretti.

Un icona nella Tray Bar si occupa di accedere rapidamente alle funzioni offerte da OpenVPN fra cui lo stato della connessione e i file di configurazione. Anche per i sistemi Windows, una volta effettuata la connessione, il sistema diventa trasparente all'utente.

Aspetti aggiuntivi di OpenVPN

Identificare i singoli Client

Come visto in precedenza è possibile specificare più di un certificato per client. A questo punto sorge spontanea la domanda: è possibile impostare criteri di accesso diversi a seconda del client? Certo, questo viene fatto da OpenVPN tramite il riconoscimento del certificato.

Esiste un particolare parametro identificato come client-config-dir che specifica la directory in cui si trovano i file di configurazione specifici per ogni client. Ad esempio client-config-dir ccd cercherà nella cartella ccd i file .conf il cui nome è pari a quello del certificato con cui l'utente si è autenticato.

Questo meccanismo consente di assegnare ad esempio degli indirizzi IP statici ai singoli client per poi applicare tramite iptables (nello script firewall.sh ) regole specifiche in merito all'instradamento dei pacchetti. Un'ulteriore aspetto interessasnte potrebbe essere quello di mandare tabelle di routing diverse a seconda dei client che si connettono, dunque limitare ad esempio la visibilità della rete.

In generale il file nomeclient.conf ha la stessa sintassi del server.conf , ma conterrà le sole direttive come ifconfig-pool o push "route..." .

Considerazioni sul bridging

La scelta del bridging è stata dettata dall'esigenze di condividere qualunque tipo di servizio sopra la rete, fra i quali anche quelli che utilizzano scambio di messaggi in broadcast, e che in generale non è possibile realizzare con la modalità di routing o di link punto punto.

I vantaggi fondamentali introdotti dal bridging non sono solo quelli appena citati, ma anche la non necessità di inviare ai client le tabelle di routing. Essi infatti risultano direttamente connessi alla rete del server VPN. Come si avrà avuto modo di notare dai file di configurazione quanto detto non è rispettato, dato che ai client vengono inviate diverse regole di routing. All'inizio della trattazione è stato detto che ci si trovava in una situazione leggermente "anomala", questo perchè si accede ad una macchina con IP pubblico il cui IP stesso è collocato all'interno della rete che si vuole condividere, ma che soprattutto è lo stesso su cui gira il server VPN.

Vi sono diversi problemi derivati da quest'ultimo aspetto, in particolare si citano le possibilità di loop all'interno delle tabelle di routing, warning sulla sicurezza forniti da OpenVPN, ma più in generale un servizio scarsamente affidabile. Infatti il push delle routes al client genera il loop perchè il client instrada i pacchetti del nodo remoto nel tunnel. La soluzione è stata quella di creare appunto una sorta di rete privata virtuale e tramite meccanissmi di NAT dare la possibilità agli utenti di navigare all'interno della rete.

In generale, se permesso dalla topologia della rete, è possibile seguire un approccio alternativo molto più semplice. Ovvero, dare la possibilità ai client di collegarsi su un gateway (con IP e classe diversi dal Server VPN) e far si che quest'ultimo dirottasse tutto il traffico sulla porta 1194 UDP verso il server 160.78.28.61. A questo punto l'IP a cui il client accede è diverso da quello del Server VPN ed è possibile sfruttare così la condivisione automatica di tutte le reti cui il server è connesso, fornendo al client IP di quella stessa rete e rimuovendo dunque la necessità di avere un nat translator (iptables) sul server VPN.