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: