Tutorial > Creare e configurare una VPN utilizzando OpenVPN su Ubuntu 18.04

Creare e configurare una VPN utilizzando OpenVPN su Ubuntu 18.04

Pubblicato il: 17 novembre 2019

Sicurezza Ubuntu VPN

Una VPN è una Rete Privata Virtuale che ti consente di accedere ad Internet o a determinati servizi anche da una rete non attendibile. In pratica è come se fossi connesso fisicamente ad una rete privata: potrai ad esempio accedere al tuo conto corrente o effettuare pagamenti senza aver timore che qualcuno stia intercettando il traffico generato dal tuo device.

OpenVPN è un software open source che permette di creare una VPN e si basa sui protocolli TLS/SSL (Transport Layer Security/Secure Sockets Layer), utilizzando dei certificati per criptare il traffico in modo sicuro tra il server e il client.

In questo tutorial vedrai come installare e configurare OpenVPN su un server Linux con Ubuntu 18.04.

Per seguire le istruzioni contenute nella guida avrai bisogno di un server principale e di una seconda macchina che agirà da CA ovvero da Autorità di certificazione, quest'ultima avrà il compito di verificare la validità dei certificati.

Dovrai connetterti al tuo server e alla tua CA tramite una connessione SSH. Se non l’hai ancora fatto, ti consigliamo di seguire la nostra guida per connetterti in sicurezza con il protocollo SSH. In caso di server locale puoi passare al punto successivo e aprire il terminale del tuo server.

Installare OpenVPN

Per prima cosa accedi al tuo server e installa OpenVPN.

N.B. OpenVPN è disponibile già nel repository ufficiale di Ubuntu quindi non devi aggiungerne ulteriori.

Digita:

$ sudo apt update

$ sudo apt install openvpn

A questo punto avrai installato con successo OpenVPN sul tuo server.

Installare EasyRSA

Prosegui scaricando EasyRSA sul tuo server e sulla tua CA digitando su entrambe le macchine:

$ wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz

L’ultima versione la puoi scaricare da https://github.com/OpenVPN/easy-rsa/releases

$ cd ~
$ sudo tar xvf EasyRSA-3.0.4.tgz

N.B. Il nome può essere diverso in base alla versione scaricata.

Configurare il server

Completa la configurazione del server digitando:

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

Trova la sezione che fa riferimento ad HMAC (“tls-auth”). Qualora la linea fosse commentata, rimuovi il “;”.
Trova la sezione sulla cifratura (“cipher"). Qualora fosse commentata, rimuovi il “;” e aggiungi una nuova linea subito sotto contenente il testo “auth SHA256”.
Trova la sezione “dh” che definiscono i parametri Diffie-Hellman e rimuovi “2048” dal nome (Dovresti avere “dh dh.pem”).

Trova la sezione “user” e “group” e rimuovi i “;” per rendere le righe non commentate.

Configurare EasyRSA sulla CA

Sulla tua CA, dopo aver installato EasyRSA è stato creato un file di configurazione utile per definire le variabili per il tuo CA. Digita:

$ cd ~/EasyRSA-3.0.4/

$ sudo cp vars.example vars

$ sudo nano vars

Decommenta le istruzioni mostrate in figura:Modifica le variabili
Avvia lo script “easyrsa” per inizializzare l’Infrastruttura della Key Pubblica (PKI):

$ sudo ./easyrsa init-pki

$ sudo ./easyrsa build-ca nopass

Con questo comando verranno creati due file:

  • ca.crt: certificato pubblico del CA utilizzata da server e client per notificarsi reciprocamente che fanno parte della stessa rete attendibile.
  • ca.key: chiave privata che la macchina CA utilizza per firmare chiavi e certificati per server e client. Questo file deve essere mantenuto solo sulla macchina CA (non accessibile da terzi) perchè altrimenti la sicurezza della rete può essere compromessa.

Ti verrà richiesto di inserire un nome. Lascia vuoto e premi Invio.

Richiedere un certificato per il server alla CA

Ora che hai la Macchina CA configurata devi far generare dal server una chiave privata ed una richiesta di certificato ed inviarli sulla Macchina CA per farli firmare:

$ cd ~/EasyRSA-3.0.4

$ sudo ./easyrsa init-pki

$ sudo ./easyrsa gen-req server nopass

Per semplicità lascia “server” come nome della macchina o dovrai effettuare diverse modifiche successivamente.

Hai appena creato una chiave privata per il server e una richiesta di certificato chiamato “server.req”:

$ sudo cp ~/EasyRSA-v3.0.6/pki/private/server.key /etc/openvpn/

Copia il file server.req sulla macchina CA:

$ sudo scp ~/EasyRSA-3.0.4/pki/reqs/server.req user@your_CA_ip:/tmp

Generare e firmare il certificato

Sulla tua CA nella cartella EasyRSA, importa il file appena copiato e firmalo:

$ cd ~/EasyRSA-3.0.4/
$ sudo ./easyrsa import-req /tmp/server.req server
$ sudo ./easyrsa sign-req server server

Digita “yes” e premi Invio.

Trasferisci il certificato firmato e il ca.crt al server VPN:

$ sudo scp pki/issued/server.crt user@your_server_ip:/tmp

$ sudo scp pki/ca.crt user@your_server_ip:/tmp

Successivamente nel tuo server copia i file ricevuti nelle apposite directory:

$ sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/

$ cd ~/EasyRSA-3.0.4/

e genera una chiave di scambio:

$ sudo ./easyrsa gen-dh

$ sudo openvpn --genkey --secret ta.key

Copia i file generati nella cartella “/etc/openvpn/”:

$ sudo cp ~/EasyRSA-3.0.4/ta.key /etc/openvpn/

$ sudo cp ~/EasyRSA-3.0.4/pki/dh.pem /etc/openvpn/

Configurare un client

Crea una cartella per archiviare certificati e chiavi del client. Avendo un solo client in questa guida verrà chiamato “client1”, ma l’operazione dovrai ripeterla per ogni client cambiando nome.

$ sudo mkdir -p ~/client-configs/keys

$ sudo chmod -R 700 ~/client-configs

$ cd ~/EasyRSA-3.0.4/

$ sudo ./easyrsa gen-req client1 nopass

Premi Invio per accettare il nome standard proposto. 
Copia la chiave del client nella cartella creata in precedenza:

$ sudo cp pki/private/client1.key ~/client-configs/keys/

Invia il file client1.req alla macchina CA:
$ sudo scp pki/reqs/client1.req user@your_CA_IP:/tmp

Importa la richiesta di certificato sulla tua CA:

$ cd ~/EasyRSA-3.0.4/

$ sudo ./easyrsa import-req /tmp/client1.req client1

$ sudo ./easyrsa sign-req client client1


Digita “yes” per autorizzare la firma.
Trasferisci il certificato sull atua macchina server:

$ sudo scp pki/issued/client1.crt utente@IP_SERVER:/tmp

Nel tuo server copia i seguenti file nelle apposite cartelle:

$ sudo mkdir -p ~/client-configs/keys

$ sudo chmod -R 700 ~/client-configs

$ sudo cp /tmp/client1.crt ~/client-configs/keys/

$ sudo cp ~/EasyRSA-3.0.4/ta.key ~/client-configs/keys/

$ sudo  cp /etc/openvpn/ca.crt ~/client-configs/keys/

Al momento sia i certificati che le chiavi del server e del client sono stati generati.

Configurare l'instradamento degli IP e il Firewall

Ora devi modificare le regole di forwarding degli IP.

$ sudo nano /etc/sysctl.conf

Trova la sezione “net.ipv4.ip_forward” e rimuovi il “#” per rendere l’istruzione non commentata.

Devi modificare alcune regole del firewall per poter instradare correttamente le connessioni dei client.

$ ip route | grep default

Memorizza il nome dopo “dev” (in figura il nome è “eth0”).

Configura la rete di OpenVPN
$ sudo nano /etc/ufw/before.rules

Aggiungi i comandi come in figura sottostante, sostituendo “eth0” con il nome della tua interfaccia di rete.
Configura la rete di OpenVPN Salva ed esci. 

$ sudo nano /etc/default/ufw

Modifica il valore del parametro “DEFAULT_FORWARD_POLICY” con “ACCEPT“.

Abilita la porta 1194 per il traffico UDP e la porta 22 per il traffico SSH:

$ sudo ufw allow 1194/udp $ sudo ufw allow OpenSSH
 

Riavvia il firewall:

$ sudo ufw disable
$ sudo ufw enable
 

Avvia il servizio di OpenVPN:

$ sudo systemctl start openvpn

Verifica lo stato del servizio. Se tutto è andato a buon fine troverai una schermata simile a quella in figura.

$ sudo systemctl status openvpn
Stato del servizio di OpenVPN

Fai eseguire il servizio all’avvio del server:

$ sudo systemctl enable openvpn

Crea la configurazione base per i client:

$ sudo mkdir -p ~/client-configs/files

$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

$ sudo nano ~/client-configs/base.conf

Trova la sezione “remote” e assicurati che sia scritto “remote IP_Server 1194”

  • IP_Server: Scrivi l’IP del Server
  • 1194: porta scelta in precedenza.

Trova la sezione “proto” per assicurarsi che il server sia impostato su UDP (troverai la linea del TCP commentata con un “;”).

Trova la sezione “user” e “group” e rimuovi i “;” per renderle “non commenti”.

Trova le sezioni “ca.crt” - “client.crt” - “client.key” - “ta.key” e commentale con un “#” all’inizio di ogni linea.

Trova la sezione “cipher” e aggiungi l’istruzione “auth SHA256” sotto all’istruzione “cipher AES-256-CBC”.

Aggiungi in un qualsiasi punto l’istruzione “key-direction 1”.

Aggiungi in un qualsiasi punto queste linee commentate. Qualora il client dovesse essere una macchina Linux, dovranno essere rese non commentate.

# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

Salva ed esci.

Generare la configurazione per i client

Sul tuo server crea uno script che compilerà la configurazione di un client in maniera automatica:

$ sudo nano ~/client-configs/make_config.sh

Copia e incolla il testo sottostante:

#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn 


Salva il file e rendilo eseguibile:

$ sudo chmod 700 ~/client-configs/make_config.sh

Infine prova a generare la configurazione per il client "client1":

$ cd ~/client-configs

$ sudo ./make_config.sh client1

Verrà creato il file client1.ovpn.

Ora devi trasferire questo file sul dispositivo che intendi utilizzare in quanto verrà usato dal software VPN per la connessione.

Revocare i certificati dei client

Per revocare i certificati di un client esegui i seguenti comandi sulla tua CA: 

 

$ cd EasyRSA-3.0.4/
$ sudo ./easyrsa revoke client1


client1 è il nome del client al quale si vogliano revocare le autorizzazioni.

Digita “yes” per confermare.

Genera il file crl.pem e invialo al tuo server:

$ sudo ./easyrsa gen-crl
$ sudo scp ~/EasyRSA-3.0.4/pki/crl.pem user@IP_Server:/tmp

Aggiorna la configurazione sul tuo server per verificare la revoca:

$ sudo cp /tmp/crl.pem /etc/openvpn
$ sudo nano /etc/openvpn/server.conf

Alla fine del file aggiungi “crl-verify crl.pem”.

Salva e chiudi.

$ sudo systemctl restart openvpn@server

Riavvia il server per rendere le modifiche effettive.