OpenVPN is a free and open source virtual private network (VPN) program for creating point-to-point or server-to-multiclient encrypted tunnels between host computers. It is capable of establishing direct links between computers across network address translators (NATs) and firewalls. It was written by James Yonan and is published under the GNU General Public License (GPL).

Bene, procediamo.

Supponiamo di avere due host e di creare una VPN tra loro, installiamo su entrambi openvpn:

apt-get install openvpn

Adesso usiamo la Debian Way e quindi utilizziamo gli script per la creazione dei certificati e delle chiavi.

Facciamo un link simbolico:

ln -s /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/easy-rsa

Editiamo il file /etc/openvpn/easy-rsa/vars con i parametri che fanno al caso nostro:

export KEY_COUNTRY=
export KEY_PROVINCE=
export KEY_CITY=
export KEY_ORG=”"
export KEY_EMAIL=”"

Il file contiene tutto variabili d’ambiente e quindi con questo comando:

source /etc/openvpn/easy-rsa/vars

Esportiamo le variabili.

Adesso generiamo la chiave della CA visto che saremo noi stessi a fare da certification authority:

/etc/openvpn/easy-rsa/build-ca

Le chiavi andranno a finire sotto:

/etc/openvpn/easy-rsa/keys

Adesso creiamo la chiave per il server:

/etc/openvpn/easy-rsa/build-key-server server

Seguendo le facili istruzioni a video verrà creata la chiave.

Abilitiamo lo scambio di chiavi Diffie-Hellman

Lo Scambio di chiavi Diffie-Hellman (Diffie-Hellman key exchange) è un protocollo crittografico che consente a due entità di stabilire una chiave condivisa e segreta utilizzando un canale di comunicazione insicuro (pubblico) senza la necessità che le due parti si siano scambiate informazioni o si siano incontrate in precedenza. La chiave ottenuta mediante questo protocollo può essere successivamente impiegata per criptare le comunicazioni successive tramite uno schema di crittografia simmetrica.

eseguendo questo comando:

/etc/openvpn/easy-rsa/build-dh

Adesso manca solo il certificato TLS, che va creato così:

openvpn –genkey –secret /etc/openvpn/easy-rsa/keys/ta.key

Abbiamo tutto il necessario per il server, va solo configurato attraverso il file /etc/openvpn/server.conf:

local
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
cipher BF-CBC
server 10.0.0.0 255.255.255.0
ifconfig-pool-persist ip_client.txt
comp-lzo
persist-key
persist-tun
keepalive 10 360
verb 4
mute 20
log-append /var/log/openvpn/openvpn.log
status /var/log/openvpn/openvpn-status.log

Da notare la direttiva ifconfig-pool-persist ip_client.txt che memorizza gli IP assegnati ai client per dare lo stesso IP in futuro.
Va creata le directory sotto /var/log sua sul server che sul client:

mkdir /var/log/openvpn

Ora è possibile lanciare OpenVPN:

/etc/init.d/openvpn start

Se l’output è questo:

Starting virtual private network daemon: server(OK).

Potete vedere tramite ifconfig la nuova interfaccia tun0.

Siamo a metà dell’opera, manca il client.
Per comodità generiamo le chiavi del client sul server…so che non andrebbe fatto ma visto che non c’è una vera CA penso sia la cosa più veloce!

Creiamo la chiave:

/etc/openvpn/easy-rsa/build-key

Seguendo le istruzioni avremo la chiave per il client e sicomme Debian è la migliore distribuzione al mondo, è anche verificata tramite CA (la nostra!).

Spostiamo i file (IN MODO SICURO) sul client, ma quali file?

  • ca.crt
  • ta.key
  • <client>.crt
  • <client>.key

Sul client metteremo questi file sotto /etc/openvpn, occhio ai permessi:

-rw-r–r–    ca.crt
-rw-r–r–    <client>.crt
-rw-r–r–    <client>.key
-rw——-    ta.key

Creiamo il file di configurazione del client (/etc/openvpn/client.conf):

client
dev tun
proto udp
remote 85.25.71.39 1194
resolv-retry infinite
ca ca.crt
cert <client>.crt
key <client>.key
tls-auth ta.key 1
cipher BF-CBC
comp-lzo
ping 10
verb 3
mute 10
log-append /var/log/openvpn/openvpn.log
status /var/log/openvpn/openvpn-status.log

E’ il momento di far partire il client:

/etc/init.d/openvpn start

Se l’output è questo:

Starting virtual private network daemon: client(OK).

Abbiamo finito!:)

Proviamo la VPN con un ping dal client verso il server (10.0.0.1) per vedere se è tutto ok.