Installare un server VPN con OpenVPN su Ubuntu Server

Qualche giorno fa, a lavoro ho configurato il mio primo server vpn. Avevamo la necessità di accedere alla rete dell’ufficio anche dall’esterno. Insomma ci avrebbe fatto comodo essere “virtualmente” in ufficio quando fisicamente non è possibile. Avevo ricevuto consigli in merito a queste necessità, e mi era stato detto che come OpenVPN non ce n’erano molti. Ovviamente Open VPN è un software gratuito e multipiattaforma, aveva quindi tutti i prerequisiti necessari per piacermi.

Diciamo che prima di intraprendere il lavoro ho perso qualche minuto a cercare la documentazione necessaria, che mi avrebbe accompagnato durante il cammino.

Inizialmente avevo preso un pc davvero modesto (con processore AMD Duron, qualcosa di simile al Sempron ma un po’ più vecchio ;-) ) con 40 ghiga di disco e 512 Mb di ram SO DIMM, credendo di usarlo come test per la macchina vera. Ovviamente ho installato Ubuntu server come sistema operativo, scaricando l’ultima versione (10.04) siccome è un LTS. Nell’installazione del S.O. non c’è stato alcun inghippo, oramai queste ultime versioni sono una pacchia, filano dritte dritte in pochi minuti verso il traguardo ;-).

Una volta installato Ubuntu ho seguito il wiki in inglese per la corretta installazione di open vpn. Come prima passo, la guida consiglia di configurare un bridge sulla scheda ethernet per consentire al segmento LAN di essere connesso al segmento WAN, consentendo (se si vuole) di filtrare i pacchetti che li attraversano con un firewall. Per fare ciò basta installare un pacchetto chiamato bridge-utils con il comando:

sudo apt-get install bridge-utils

Fatto ciò si deve editare il file di configurazione della rete con il comando:

sudo vim /etc/network/interfaces

modificarlo come segue:

auto lo
iface lo inet loopback

auto br0
iface br0 inet static
        address 192.168.0.10
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

Così facendo si assegna il bridge all’interfaccia eth0 con l’ip 192.168.0.10.

Adesso potete riavviare il servizio networking:

sudo /etc/init.d/networking restart

(per evitare di dover digitare sempre il comando sudo davanti ad ogni comando vi consiglio di digitare sudo su una volta per tutte)

Ora possiamo passare all’installazione vera e propria di OpenVPN:

apt-get install openvpn

Finita l’installazione del pacchetto creiamo una cartella che conterrà i programmi per generare le chiavi e le chiavi stesse:

cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/
mv /etc/openvpn/2.0 /etc/openvpn/easy-rsa

Dopodichè editiamo il file vars in modo da modificare le seguenti linee con le informazioni che ci riguardano:

export KEY_COUNTRY="US"
export KEY_PROVINCE="NC"
export KEY_CITY="Winston-Salem"
export KEY_ORG="Example Company"
export KEY_EMAIL="steve@example.com"

Salvate il file e chiudetelo. Accertandovi di essere loggati come utente di root, iniziate la procedura di generazione delle chiavi:

cd /etc/openvpn/easy-rsa/
source ./vars
./clean-all
./build-dh
./pkitool --initca
./pkitool --server server
cd keys
openvpn --genkey --secret ta.key
cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/

Ora che abbiamo generato le chiavi e i certificati per il server procediamo a generare quelli per il client (basterà ripetere la prossima procedura modificando l’identificativo del client per generare altre chiavi/certificati):

cd /etc/openvpn/easy-rsa/
source vars
./pkitool client1

Copiate ora sul client i file:

  • /etc/openvpn/ca.crt
  • /etc/openvpn/easy-rsa/keys/client1.crt
  • /etc/openvpn/easy-rsa/keys/client1.key
  • /etc/openvpn/ta.key

Ora non ci resta che editare i file di configurazione per server e client (partiamo da una configurazione di esempio):

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gzip -d /etc/openvpn/server.conf.gz
vim /etc/openvpn/server.conf

Accertatevi di correggere le seguenti linee con i vostri dati:

local 192.168.0.10
dev tap0
script-security 3
up "/etc/openvpn/up.sh br0"
down "/etc/openvpn/down.sh br0"
proto tcp
;server 10.8.0.0 255.255.255.0
server-bridge 192.168.0.10 255.255.255.0 192.168.0.100 192.168.0.110
push "route 192.168.0.1 255.255.255.0"
tls-auth ta.key 0 # This file is secret
user nobody
group nogroup
cipher AES-256-CBC

La voce local sarà quella corrispondente all’indirizzo del vostro bridge, come la prima voce accanto a server-bridge. La seconda voce di server-bridge sarà la subnet mask mentre la terza e la quarta sarà il range di ip che openvpn assegnerà ai client che si connetteranno alla rete.
Il comando push “route… servirà per creare una rotta sugli indirizzi della LAN.
Fatto ciò, creiamo i due script per l’avvio e la chiusura dell’interfaccia virtuale (la tap0 che vedete nel file di configurazione). Creiamo il file up.sh come segue:

vim /etc/openvpn/up.sh
#!/bin/sh
BR=$1
DEV=$2
MTU=$3
/sbin/ifconfig $DEV mtu $MTU promisc up
/usr/sbin/brctl addif $BR $DEV

e il file down.sh così:

vim /etc/openvpn/down.sh
#!/bin/sh
BR=$1
DEV=$2
/usr/sbin/brctl delif $BR $DEV
/sbin/ifconfig $DEV down

Rendiamoli eseguibili:

chmod 755 /etc/openvpn/down.sh
chmod 755 /etc/openvpn/up.sh

Ora che il server è correttamente configurato, possiamo dare una riavviata al servizion openvpn:

/etc/init.d/openvpn/restart

Adesso passiamo al file di configurazione del client:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn

Il quale dovrà contenere:

dev tap
proto tcp
remote 192.168.0.10 1194
cert client1.crt
key client1.key
tls-auth ta.key 1
cipher AES-256-CBC

Ora copiate nella cartella di configurazione del client il file appena editato (chiamatelo client1.conf o client1.ovpn). Ovviamente si presuppone che i file delle chiavi e dei certificati siano nella stessa cartella di quest’ultimo file (sul client). Riavviate anche qui openvpn e il gioco è quasi fatto. Dico quasi perchè per potervi connettere al server dall’esterno dovrete dire al vostro router di aprirvi la porta 1194 e reindirizzare il traffico proveniente dall’esterno verso l’ip 192.168.0.10 (quello del bridge).

Ora siete davvero pronti per collegarvi dall’esterno alla vostra LAN (così com’è stato configurato openvpn non è possibile accedere da dentro la LAN alla vpn appena creata).

Spero di non aver dimenticato niente! ;-)

Che ve ne pare?

13 Risposte a “Installare un server VPN con OpenVPN su Ubuntu Server”

  1. Andrea ha detto:

    Scusa, non riesco a configurare il bridging, premetto che mi connetto via wireless, ho provato a cambiare eth0 in wlan0, il mio server ha ip interno 192.168.1.100; il mio gateway è 192.168.1.1 e la subnet è 255.255.255.0 grazie mille per l’aiuto in anticipo

  2. Justin Radioactivetoy ha detto:

    mi congratulo! mi sto lambiccando il cervello da mesi con guide su open vpn completamente inutili! questa è la prima valida e che mi funziona!!!

  3. Pierluigi ha detto:

    Ciao Davide intanto ti faccio i miei complimenti per la bellissima guida che hai fatto :-) dopodichè ti volevo chiedere una cosa a riguardo… le interfacce di rete in questo caso 192.168.0.10 deve assolutamente essere ip statico o posso farlo assegnare dal mio dhcp? e poi un’altro cosa la configurazione del server.conf vedo che mancano le direttive dei certificati esempio server.crt server.key ca.crt è normale o le hai dimenticate?

    local 192.168.0.10
    dev tap0
    script-security 3
    up “/etc/openvpn/up.sh br0”
    down “/etc/openvpn/down.sh br0”
    proto tcp
    ;server 10.8.0.0 255.255.255.0
    server-bridge 192.168.0.10 255.255.255.0 192.168.0.100 192.168.0.110
    push “route 192.168.0.1 255.255.255.0”
    tls-auth ta.key 0 # This file is secret
    user nobody
    group nogroup
    cipher AES-256-CBC

    Grazie mille e scusa per il disturbo…!!!

  4. Luca ha detto:

    Ciao Davide, ottima guida, vorrei avere una info, ma se volessi che ci siano 3 o 4 client che si debbano collegare contemporaneamente al server come devo fare?
    Non mi interessa che i client si vedano, ma che dalla LAN a cui è connessa al server io possa raggiungere tutti i client.
    Grazie

  5. Luca ha detto:

    Ciao Davide,
    complimentoni per la guida. Ho fatto tutto come hai detto però ho un problema, credo alla fonte.
    Ho installato Ubuntu 10.04, installato Openvpn come da tua guida, ma il servizio openvpn non parte all’avvio. Quando cerco di farlo partire manualmente da terminale non parte…cosa posso fare?

    grazie per l’aiuto

    • davide ha detto:

      Ciao Luca, se non ricordo male avevo avuto anch’io qualche problema del genere… avevo sbattuto la testa sui programmi all’avvio ma da terminale era un gran casotto… hai mai provato webmin? se segui questa guida troverai le istruzioni su come installarlo e da lì riuscirai a gestire in tutta semplicità i programmi all’avvio… fammi sapere!

  6. Massimo Rossi ha detto:

    ciao Davide,
    bellissima guida. Avrei però una domanda…. se io volessi connettermi da internet alla VPN con un client Windows? come devo configurarlo?
    io ho un server ubuntu 13.04 sul quale ho delle cartelle condivise tramite samba per la mia lan composta da alcuni client windows.
    se volessi accedere ai miei file mentre sono fuori (con client windows), premesso che uso dyndns per raggiungere il mio router, come devo fare?
    Grazie

    • davide ha detto:

      Ciao Massimo, grazie per i complimenti. In ogni caso esiste il client openvpn anche per Windows e l’ho già testato con successo, anche avendo un server linux. In quel caso specifico avevo a disposizione una vecchia debian ma poco importa… ;)

  7. andrea ha detto:

    Ciao e se volessi fare collegare al server vpn un pc della stessa lan cosa dovrei modificare ? Grazie

  8. andrea ha detto:

    Poichè vorrei installare il vpn server su di una macchina dedicata a far solo questo e far in modo che i pc possano raggiungere il server presente nella lan su cui risiede il database. Grazie

Lascia un commento