Menu Chiudi

OpenVPN, ovvero Virtual Private Network made in Linux!

Introduzione

Introduzione

Una VPN (Virtual Private Network) si usa quando si ha la necessità di creare un collegamento tra due o più reti private attraverso una rete pubblica (come internet). Una volta stabilita la connessione tra le 2 reti private, gli utenti vedranno la rete opposta in modo del tutto trasparente come se fossero collegate fisicamente tra di loro. Bisogna tenere però conto che la velocità di connessione massima tra le due reti è definita dalla rete pubblica: se usassimo una connessione adsl normale con banda in upload di 256kbs ad esempio, la velocità massima di trasferimento dei file sarà circa 32kbyte al secondo, e non i classici 10/100mbit della LAN. Altra caratteristica molto importante tipica di OpenVPN è quella di creare un sistema di comunicazione protetto: potete stare quindi tranquilli anche nel caso dobbiate trasferire dati confidenziali e riservati.

 

 

Privata perchè offre un servizio praticamente identico ad una LAN privata.

Virtuale perchè in realtà il flusso dati passa dalla rete pubblica (Internet).

 

Serve:

  1. Alle aziende per collegare sedi staccate senza aver bisogno di connessioni dedicate.

  2. A due comuni utenti per condividere delle risorse attraverso internet

  3. Ad un admin per amministrare una macchina remota.

  4. A rendere confidenziale una rete condivisa (WLAN o LAN su hub).


    VPN: come funziona?

Tutto il traffico fra i due endpoint della VPN viene incapsulato in tunnel prestabiliti.

I tunnel possono essere su diversi livelli della pila ISO/OSI:

  1. IPSEC (a layer 3)

  2. PPTP (a layer 3)

  3. OpenVPN, l2tp, vtund, cipe, etc. (a layer 4)

 

 

Tunnel e incapsulamento

OpenVPN usa i device tun/ tap.

tun/ tap: interfacce virtuali che permettono ai programmi in user-space di spedire/ ricevere pacchetti. Ogni pacchetto mandato sul tunnel viene criptato –> confidenzialità

tun/ tap: differenze

  1. Tun:

    1. device virtuale IP punto-a-punto

    2. trasporta pacchetti IP

    3. simile all’interfaccia ppp

  2. Tap:

    1. interfaccia ethernet virtuale

    2. trasporta frame ethernet

    3. simile all’interfaccia eth

     

NB. Se si ha bisogno di broadcast ethernet, protocolli non-IP (Netbios), o creare LAN virtuali SI DEVE FORZATAMENTE RICORRERE A tap.

Ci sono tre modalità di funzionamento:

  1. Tunnel non criptato

  2. Crittografia a chiave condivisa (shared-key)

  3. TLS: autenticazione e scambio di chiavi

TLS

  1. Stabilisce un canale dati e un canale di controllo sopra una singola porta tcp/udp

  2. Canale di controllo: mutua autenticazione con certificati e Diffie-Hellman per scambio di chiavi (sicuro!)

  3. Canale dati: crittografia e autenticazione simmetrica (veloce!) Durante l’handshake un host avrà il ruolo di server l’altro (gli altri) di client.

 

Certificati X.509

In un sistema basato sui certificati ogni host deve disporre di una coppia chiave privata/ certificato.

CA: entita` di cui tutti gli host si devono fidare. Garantisce l’identita` degli host coinvolti.

Firma le richieste di certificato. Pubblica il proprio certificato che deve essere disponibile a tutti i partecipanti alla VPN.

 

Riassumendo

OpenVPN aiuta a creare VPN in modo semplice, e non soffre dei problemi di IPsec (nat)

L’infrastruttura TLS offre un ottimo grado di sicurezza e scalabilità

E` utile in diversi contesti

E` in costante e rapida crescita

Funziona su linux, *BSD, Win2k/WinXP, MacOSX, Solaris…

 

Quali sono le differenze tra modalità bridging e routing?

Bridging e routing sono due sistemi per collegare sistemi con VPN.

  1. Vantaggi Bridging

    1. I Broadcasts viaggiano sulla VPN — Questo permette ai software che fanno uso di broadcast di funzionare, come ad esempio la condivisione dei file di windows o i giochi in lan, di funzionare.

    2. Non sono necessarie configurazioni di routing.

    3. Funziona con tutti i protocolli che viaggiano su ethernet incluso IPv4, IPv6, Netware IPX, AppleTalk, etc.

    4. Relativamente facile da configurare per soluzioni roadwarriors (molteplici sedi distaccate, utenti che si collegano da posti diversi)

  2. Svantaggi Bridging

    1. Meno efficiente rispetto la modalità routing, e poca scalabilità.

  3. Vantaggi Routing

    1. Efficienza e scalabilità

    2. Permette un miglior runing dell’ MTU per una maggiore efficienza.

  4. Svantaggi Routing

    1. I client devono usare un WINS server (come samba) per poter usare la condivisione di file su VPN.

    2. Ogni instradamento deve essere configurato in modo da collegarsi alla subnet.

    3. I software che dipendono dai broadcast non vedono le altre macchine in lan sulla VPN.

    4. Funziona solo con IPv4, e IPv6 nel caso che i dispositivi che entrambi le parti lo supportino.

 

Installazione di Openvpn.

Per installare OpenVPN occorrono : libreria LZO, pacchetto iproute2 moduli tap/tun compilati nel kernel, il vostro gestore di pacchetti attivo e funzionante e… se proprio siete dei geeks, il vostro gcc sempre al vostro fianco per la compilazione da sorgenti del tutto 😀

 

Per quanto riguarda LZO ed iproute2 affidatevi al vostro gestore di pacchetti, che renderà le operazioni molto veloci. Come al solito riporto un breve elenco di come installare i pacchetti per la vostra distro preferita ( sempre che sia nell’elenco 😀 )

 

  • Debian/ Ubuntu:

    • apt-get install lzo iproute2 / aptitude install lzo iproute2

  • Slackware:

    • slapt-get –install lzo iproute2 / swaret install lzo iproute2

  • Fedora:

    • yum -y install lzo iproute2

  • Mandriva:

    • urpmi lzo iproute2

  • Freebsd:

    • pkg_add lzo iproute2 (sincronizzatevi col vostro mirror favorito prima )

  • Archlinux/Frugalware:

    • pacman -S lzo iproute2

  • Sabayon:

    • equo install lzo iproute2

 

A questo punto avremo sottomano tutto il necessario per poter installare OpenVpn con successo sia dai sorgenti sia da pacchetto precompilato. Per personalizzare al massimo il setup io consiglio di procedere col download da sorgente e compilare esplicitando le eventuali opzioni personali.

Arrivati sin qui dovrebbe essere possibile dare i comandi

 

  •  

      modprobe tun

      modprobe tap

 

senza ricevere alcun errore di sorta e lanciando un bel lsmod | grep tun ( tap ) dovremmo vederli apparire nell’elenco dei moduli attualmente in uso. A questo punto si parte col setup vero e proprio di OpenVPN da sorgenti.

 

# wget http://openvpn.net/release/openvpn-2.0_XXYY.tar.gz

# tar xvfz openvpn-2.0_XXYY.tar.gz

# cd openvpn-2.0_XXYY

# mkdir /etc/openvpn

# mkdir /etc/openvpn/keys

# ./configure –prefix=/usr –sysconfdir=/etc/openvpn –enable-iproute2

# make && make install

 

A questo punto ci servono gli script di esempio che andremo a modificare e gli script per la creazione dei certificati. Copiamo il contennuto delle dir easy-rsa e sample-config-files in /etc/openvpn/

 

# cd easy-rsa/

# cp -R * /etc/openvpn/

# cd ..

# cd sample-config-files/

# cp -R * /etc/openvpn/

 

Ora siamo pronti per creare i certificati e modificare il file di configurazione che si chiamerà server.conf . Se il file non esiste sarà creato tramite il comando touch nomefile.

 

# cd /etc/openvpn/

# touch server.conf

# nano server.conf

 

( Quel che segue è un file di configurazione base che può già andar bene per una connessione senza troppe pretese )

 

###########################################################

# Sample OpenVPN 2.0 config file for multi-client server.#

###########################################################

 

# Porta d’ascolto del demone OpenVpn

port 1194

 

# Specifica se ci si connette tramite protocollo TCP o UDP

;proto tcp

proto udp

 

# “dev tun” will create a routed IP tunnel,

# “dev tap” will create an ethernet tunnel.

;dev tap

dev tun

 

# SSL/TLS root certificate (ca), certificate

# (cert), and private key (key). Each client

# and the server must have their own cert and

# key file. The server and all clients will

# use the same ca file.

 

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/server.crt

key /etc/openvpn/keys/server.key # This file should be kept secret

 

# Diffie hellman parameters.

dh /etc/openvpn/keys/dh1024.pem

 

# Configure server mode and supply a VPN subnet for OpenVPN to draw client #addresses from.

# The server will take 10.0.0.1 for itself,the rest will be made available to #clients.

server 10.0.0.0 255.255.255.0

 

# Maintain a record of client <-> virtual IP address associations in this file.

ifconfig-pool-persist ipp.txt

 

# Certain Windows-specific network settings can be pushed to clients, such as

# DNS or WINS server addresses.

push “dhcp-option WINS 10.0.0.1”

 

# Uncomment this directive to allow different clients to be able to “see” each #other.

;client-to-client

 

# The keepalive directive causes ping-like messages to be sent back and forth

# over the link so that each side knows when the other side has gone down.

keepalive 10 120

 

# Enable compression on the VPN link. If you enable it here, you must also

# enable it in the client config file.

comp-lzo

 

# It’s good to reduce the OpenVPN daemon’s privileges after initialization.

user nobody

group nobody

 

# The persist options will try to avoid accessing certain resources on restart

# that may no longer be accessible because of the privilege downgrade.

persist-key

persist-tun

 

# Output a short status file showing current connections, truncated

# and rewritten every minute.

status openvpn-status.log

 

# By default, log messages will go to the syslog (or on Windows, if running as a # service, they will go to the “\Program Files\OpenVPN\log” directory).

log openvpn.log

log-append openvpn.log

 

# Set the appropriate level of log file verbosity.

verb 3

 

# Silence repeating messages. At most 20 sequential messages of the same

# message category will be output to the log.

;mute 20

 

La porta nella quale verrà messo in ascolto il server è quella di default 1194 (se il server è dietro un firewall occorre effettuare un natting per permettere che la porta 1194 punti all’interno su di lui).

 

Configurazione del server

 

A questo punto si creano i certificati e si modificano eventualmente i file di configurazione:

 

# cd /etc/openvpn/

# . ./vars

# ./clean-all

# ./build-ca

 

Qui si inseriranno le informazioni della VPN per la creazione dei certificati, e l’ unico parametro che andrà per forza esplicitato è Common Name (eg, your name or your server’s hostname) []:

in cui inserire l’ identificativo della VPN (VPN-Prova et similia :D).

Si creeranno ora i certificati e le chiavi:

 

# ./build-key-server server

 

Alla successiva richiesta di parametri di configurazione al punto Common Name: occorrerà riempire il campo con “server” e confermare con “y” le richieste successive, fino al completamento della configurazione dei certificati per il server.

Per creare i certificati per ogni client che si dovrà collegare al server occorrerà lanciare lo script:

 

# ./build-key clientXX

 

inserendo un nome univoco nel campo Common Name. Per proteggere le chiavi con una password si usa lo script build-key-pass.

 

Infine si passa alla generazione dei parametri Diffie Hellman

 

# ./build-dh

 

terminando così la configurazione dei certificati per server e client. Facendo riferimento alla tabella seguente sipotrà capire quali dei file generati occorrono al server, ai client od ad entrambi per il corretto funzionamento della VPN.

 

E’ lampante che i file necessari sul generico clientXX sono: ca.crt clientXX.crt clientXX.key

Usando il “server.conf” allegato verrà creata una VPN usando come device virtuale TUN (usato nel caso di routing) che stara in ascolto per i client sulla porta 1194 UDP e verranno assegnati ai client degli ip con subnet 10.0.0.0/24.

 

Nota: per caricare il dispositivo virtuale di routing per la VPN con kernel 2.6 è necessario caricare il modulo tun:

 

# modprobe tun

 

a questo punto possiamo effetivamente lanciare il server:

 

# openvpn /etc/openvpn/server.conf

 

Se tutto andrà correttamente si vedrà una output del tipo:

Significa che il dispositivo è stato inizializzato correttamente.

 

Installazione del client.

 

La procedura di installazione del client è esattamente la stessa di quella del server,ma in questo caso non vanno create le chiavi. Ecco di seguito un file di esempio utile a interagire col server appena creato:

 

##############################################################################
# Client-side OpenVPN 2.0 config file for connecting to multi-client server. #
##############################################################################

client
;dev tap
dev tun
;proto tcp
proto udp
remote server-1 1194
;remote server-2 1194
resolv-retry infinite
nobind
# Downgrade privileges after initialization (non-Windows only)
;user nobody
;group nobody
# Try to preserve some state across restarts.
persist-key
persist-tun
# SSL/TLS parms.
ca /etc/openvpn/keys/ca.crt
cert
/etc/openvpn/keys/client.crt
key
/etc/openvpn/keys/client.key
# Enable compression on the VPN link.
comp-lzo
# Set log file verbosity.
verb 3
# Silence repeating messages
;mute 20

Compilati correttamente i file, basta lanciare openvpn su entrambe le macchine, tenendo cura di utilizzare il giusto file di configurazione:

 

$ {sudo} openvpn –config xxxx.conf

 

Configurazione del client (Linux)

 

Per stabilire la connessione al server basta andare alla riga:

remote server-1 1194

e sostituire “server-1” con l’indirizzo ip o il nome dns del server su cui gira openvpn. Oltre ciò occorre copiare i file d’autenticazione dal server al client quindi:

Aprite una sessione ssh dal client al server e copiate i file ca.crt clientXX.crt clientXX.key in /etc/openvpn/keys del pc client, oppure copiateli con una pendrive del server al client.

Inserendo i path assoluti dei certificati è possibile lanciare openvpn da qualsiasi directory.

A questo punto il file client.conf conterrà delle righe simili a queste:

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/clientXX.crt

key /etc/openvpn/keys/clientXX.key

Ribadisco per l’ennesima volta che i file delle chiavi e del certificato devono avere lo stesso nome all’interno del file client.conf e nel filesystem e trovarsi nella directory da esso indicata, pena il mancato funzionamento della VPN!!

Adesso posizioniamoci ancora una volta sul client, carichiamo il modulo tun da console con un :

 

# modprobe tun

 

ed instauriamo la connessione, impartendo sul client il comando:

 

# openvpn /etc/openvpn/clientXX.conf

 

Un’alternativa ancor più elegante ed utile se si hanno diverse vpn per le mani è creare un file bash con le istruzioni per avviare automaticamente la connessione con un semplice doppio click o mediante invocazione da shell , eccone uno d’esempio:

 

#! /bin/sh

echo Connessione alla Vpn VPN

echo Attivazione moduli di rete …

modprobe -r tun

modprobe -a tun

echo Connessione in corso …

openvpn /etc/openvpn/clientXX.conf &

echo Connessione attivata!

 

 

 

Ecco fatto, salvatelo come connection-VOSTRA_VPN-start.sh e dategli i diritti d’esecuzione ed avrete la vostra vpn a portata di doppio click. 😉

 

Configurazione e installazione del client (Windows)

 

Scaricato il pacchetto binario per Windows e installatolo seguendo il wizard, apparirà la richiesta di installare un driver non certificato, e sarà necessario confermare la scelta per continuare l’installazione. Una volta installato, troveremo i file di configurazione sotto C:\Programmi\OpenVPN\config e il nome del file sarà stavolta clientXX.ovpn

Occorrerà come al solito copiare i certificati creati ca.crt,clientXX.crt,clientXX.key nella directory keys, andando a rinominare i file in modo che combacino con le direttive del file client.ovpn

cioè avremo una cosa del tipo:

ca C:\\Programmi\\OpenVPN\\keys\\ca.crt

cert C:\\Programmi\\OpenVPN\\keys\\clientXX.crt

key C:\\Programmi\\OpenVPN\\keys\\clientXX.key

occorre usare le “\\” per indicare che il percorso è assoluto. Inseriamo la riga con l’ip del server:

remote server-1 1194

salviamo e chiudiamo l’ editor.

 

A questo punto è sufficiente cliccare con il destro sull’icona OpenVpn nella barra di Windows e scegliere “Connect” per instaurare la connessione con il server e contemporaneamente aprire una console contente i log della connessione, in modo da capire se è tutto funzionante.

 

Verifica del funzionamento della VPN:

Basta un semplice ping per testare la connessione dal client al server che ha ip 10.0.0.1

 

$ ping 10.0.0.1

PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.

64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=3.08 ms

64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=3.01 ms

 

e viceversa:

 

$ ping 10.0.0.10

PING 10.0.0.10 (10.0.0.10) 56(84) bytes of data.

64 bytes from 10.0.0.10: icmp_seq=1 ttl=64 time=4.83 ms

64 bytes from 10.0.0.10: icmp_seq=2 ttl=64 time=4.41 ms

 

Openvpn & log

 

Per visualizzare lo stato della VPN basta aggiungere la riga al file .conf:

log /var/log/openvpn.log

Il file di log sara’piu’ o meno forbito in base al valore che avremo dato al parametro verb.

 

Concludendo …

 

OpenVPN rende possibile la creazione di VPN da applicativo ad applicativo, è multipiattaforma e non necessita di modifiche al kernel come nel caso di IPSEC, inoltre il livello di sicurezza che può raggiungere è molto elevato, rappresenta quindi un’ottima alternativa all’utilizzo di attrezzature HW dedicate e costose e in più è opensource!!

Come al solito vi invito a provare e sperimentare gente, perché testare, provare e riprovare è l’unico modo per far proprio un argomento, un metodo o qualsiasi altra conoscenza della vita in perfetto hacking-style, happy VP-Networking people 😉 !!

 

Autore:

Antonio Gentile

WordPress Appliance - Powered by TurnKey Linux