Introduzione

Questo tutorial nasce dalla necessità di accedere ad alcuni servizi posti in un altro server senza esporli all'esterno, per esempio nel mio caso ho necessità di accedere a mariadb e a ssh configurati in un altro server che si trova localizzato in un altro edificio. Avrei potuto aprire le porte del firewall e configurare mariadb e ssh per restare in ascolto sull'ip wan ma certamente sarebbe stata una soluzione poco salutare, per questo motivo mi accingo a creare una vpn tra i due server per far convogliare le informazioni in maniera criptata e più sicura

Prerequisiti e Installazione

2 server ubuntu 16.04 con accesso root

I pacchetti da installare per entrambe le macchine sono gli stessi, openvpn e easy-rsa quindi su entrambe le macchine digiteremo:

apt install openvpn easy-rsa

Configurazione lato server

Innanzitutto bisognerà decidere quale delle due macchine farà da server openvpn e quale il client che effettuerà la connessione, una volta fatto questo spostiamoci sulla macchina che abbiamo scelto come server e iniziamo la sua configurazione.

Modificare /etc/sysctl.conf e togliere il commento alla seguente riga per abilitare l'inoltro con IP:

#net.ipv4.ip_forward=1

Quindi ricaricare sysctl.

sysctl -p /etc/sysctl.conf

ci spostiamo nella cartella /etc/openvpn dove dovremmo creare i certificati per il server e creare un file di configurazione per far partire il servizio. Un file di configurazione di esempio è gia disponibile con l'installazione di openvpn, non dobbiamo fare altro che prelevarlo dalla sua attuale posizione per poi editarlo a nostro piacimento.

cd /etc/openvpn

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

nano server.conf

All'interno del file di configurazione decommentate

user nobody
group nogroup

Creiamo i certificati e le chiavi necessarie per il server openvpn

Con questa procedura creeremo dei certificati per permettere al server di identificare il client e viceversa al client di identificare il server, una volta fatta questa verifica e constatato che client e server si possono fidare a vicenda inizieranno la procedura di scambio dati. Per generare questi certificati ci appoggeremo agli script precedentemente installati cioè easy-rsa. Copieremo il necessario nella nostra cartella openvpn dopodiche modificheremo alcuni parametri per permettere la creazione dei certificati in maniera corretta. procediamo come segue:

cp -r /usr/share/easy-rsa/ /etc/openvpn
mkdir /etc/openvpn/easy-rsa/keys
nano /etc/openvpn/easy-rsa/vars

Vars è il file di configurazione di easy-rsa da cui prende i parametri per la creazione dei certificati. al suo interno dovremmo modificare le seguenti voci inserendo i nostri dati

export KEY_COUNTRY="US"
export KEY_PROVINCE="TX"
export KEY_CITY="Dallas"
export KEY_ORG="My Company Name"
export KEY_EMAIL="Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo."
export KEY_OU="MYOrganizationalUnit"

Per comodità dato che è specificato all'interno del file di configurazione di openvpn modifichiamo anche il seguente parametro come segue:

export KEY_NAME="server"

Salviamo e iniziamo a generare i parametri di Deffie-Hellman con il seguente comando:

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

spostiamoci di directory

cd /etc/openvpn/easy-rsa

E inizializziamo il PKI (Public Key Infrastructure). facendo attenzione alla sintassi, c'e' un punto-spazio-punto-slash-vars.

. ./vars

Ignoriamo pure quanto ci viene indicato dall'output ( NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys ) non abbiamo ancora generato niente nella cartella keys

Procediamo con una pulizia e con la creazione del CA (certificate authority)

./clean-all
./build-ca

Semplicemente premiamo invio fino alla fine confermando quanto ci viene proposto, i dati presentati sono quelli che abbiamo inserito editando precedentemente vars

Generiamo certificato e chiave per il server

./build-key-server server

Anche in uqesto caso premiamo invio confermando i parametri, ci saranno richieste due informazioni in più rispetto a prima ma che possiamo lasciare in bianco

Please enter the following 'extra' attributes to be sent with your certificate request

A challenge password []:
An optional company name []:

Alla presenza delle seguenti domande rispondiamo di si (y)

Sign the certificate? [y/n]
1 out of 1 certificate requests certified, commit? [y/n]

A questo punto abbiamo generato quanto ci serviva, non dobbiamo far altro che spostare i certificati nella cartella giusta:

cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn

avviamo il server openvpn e verifichiamo che tutto funzioni analizzando syslog

service openvpn start

in syslog dovremmo trovare tutte le informazioni sull'avvio di ovpn-server ed eventualmente capire cosa e' andato storto.

 

Generazione certificati e chiavi per il client

Sempre restando sulla macchina che abbiamo scelto come server openvpn dobbiamo generare i certificati per il client, per questo ci viene in aiuto easy-rsa ancora una volta.

spostiamoci nella cartella se non ci siamo gia e procediamo come segue:

cd /etc/openvpn/easy-rsa
./build-key client1

Vi verranno proposti gli stessi parametri di prima che non dobbiamo far altro che confermare premendo invio, lasciando vuoti password e nome opzionale e rispondendo si (y) alle domande che ci vengono proposte.

Trasferiamo certificati e chiavi al client

A questo punto dobbiamo trasferire le chiavi generate al client, ci sono diversi modi per farlo, con una chiavetta usb, con ftp, con scp etc etc.

nel mio caso ho utilizzato scp (secure copy) per trasferire i tre file di cui abbiamo bisogno per il client che sono i seguenti:

/etc/openvpn/easy-rsa/keys/client1.crt

/etc/openvpn/easy-rsa/keys/client1.key

/etc/openvpn/ca.crt

procedendo come segue e modificando i parametri di conseguenza

scp /etc/openvpn/esy-rsa/keys/client1.crt nomeutente@your-server-ip:/home/nomeutente
scp /etc/openvpn/esy-rsa/keys/client1.key nomeutente@your-server-ip:/home/nomeutente
scp /etc/openvpn/ca.crt nomeutente@your-server-ip:/home/nomeutente

Configurazione lato client

Spostiamoci ora sulla macchina che abbiamo scelto come client, anche qui abbiamo bisogno di creare un file di configurazione per far capire a openvpn che qui ha il ruolo di client, una base da cui partire è gia presente nel nostro server percui non ci resta che copiarlo nella giusta posizione e editarlo di conseguenza:

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

Assicuriamoci di copiare anche i file precedentemente trasmessi via scp nella cartella /etc/openvpn nel mio caso li avevo trasmessi nella cartella home del mio utente quindi aggiustate il comando di conseguenza

mv /home/nomeutente/{client1.crt,client1.key,ca.crt} /etc/openvpn

A questo punto dobbiamo editare il file client.conf , i parametri principali da modificare sono i seguenti:

# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote my-server 1194
;remote my-server-2 1194

Sostituendo myserver con l'indirizzo ip del server a cui ci dobbiamo collegare

decommentiamo anche quanto segue:

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

Salviamo il tutto. Ora dobbiamo configurare l'avvio di openvpn in modo tale che il servizio parta con i giusti parametri, ricordando che con systemd i parametri in /etc/default/openvpn sono ignorati dobbiamo modificare l'avvio del servizio con il comando, fate attenzione al @client dopo openvpn in quanto qui lo dobbiamo avviare in modalità client 

systemctl enable openvpn@client

Salviamo e proviamo ad avviare il servizio. se tutto è andato a buon fine openvpn aprirà il tunnel tra client e server.

service openvp@client start

ifconfig su entrambe le macchine dovrebbe mostrarci qualcosa di molto simile a questo:

sul client:

tun0      Link encap:UNSPEC  IndirizzoHW 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          indirizzo inet:10.8.0.6  P-t-P:10.8.0.5  Maschera:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:61 errors:0 dropped:0 overruns:0 frame:0
          TX packets:89 errors:0 dropped:0 overruns:0 carrier:0
          collisioni:0 txqueuelen:100
          Byte RX:9611 (9.6 KB)  Byte TX:10568 (10.5 KB)

sul server:

tun0      Link encap:UNSPEC  IndirizzoHW 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          indirizzo inet:10.8.0.1  P-t-P:10.8.0.2  Maschera:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:70 errors:0 dropped:0 overruns:0 frame:0
          TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
          collisioni:0 txqueuelen:100
          Byte RX:9428 (9.4 KB)  Byte TX:9611 (9.6 KB)

quindi se dal client provo ad esempio a collegarmi in ssh al server da ora in poi digiterò ssh nomeutente@10.8.0.1

oppure ancora avrò la possibilità di collegarmi al database mariadb utilizzando il tunnel appena creato anziche esporre tutto verso l'ip wan

Importante ricordo che in caso di problemi dovreste esaminare /var/log/syslog dove vengono registrate le operazioni di openvpn inoltre assicuratevi che il firewall sia configurato di conseguenza aprendo la porta 1194 udp

e configurare iptables comesegue:

/sbin/iptables -A INPUT -i tun0 -j ACCEPT
/sbin/iptables -A OUTPUT -j ACCEPT

E' possibile ottenere inoltre configurazioni molto più avanzate osservando il file server.conf , se foste interessati per una spiegazione piu approfondita vi rimando a questo link:

https://help.ubuntu.com/16.04/serverguide/openvpn.html