COMPUTING > Virtual Private Cloud > VMware Cloud Director > Come realizzare una connessione VPN con OpenVPN su Ubuntu 20.04

3.10.1.2 Come realizzare una connessione VPN con OpenVPN su Ubuntu 20.04

Una VPN (Virtual Private Network) è una rete privata virtuale che consente di connettere tra loro, in sicurezza, due reti informatiche indipendenti esposte su internet. Tramite una VPN è possibile, dunque, da un server o PC (client) connesso in un certo punto della rete internet accedere alle risorse della rete di un altro server, creando virtualmente un collegamento di rete diretto tra i due ed in pratica facendo si che venga emulato il collegamento fisico tra i due punti della rete.

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 questa guida è descritta la configurazione/implementazione di una VPN utilizzando OpenVPN, su un Server ed un Client entrambi Linux con Ubuntu 20.04. Ciò non toglie che le indicazioni fornite possano essere utilizzate in parte (quelle relative al Server o al Client) per configurazioni/implementazioni ibride (ad esempio Server Linux e Client Windows o viceversa).

Per seguire le istruzioni contenute nella guida avrai bisogno di:
  • Server - server principale (Ubuntu) per la connessione VPN;
  • Macchina CA - server (Ubuntu) che agirà da macchina CA ovvero da Autorità di certificazione ed avrà il compito di verificare la validità dei certificati (potrebbe coincidere con il Server principale per la connessione VPN);
  • Client - device secondario (Ubuntu) per la connessione VPN.
Dovrai connetterti al tuo Server, alla tua macchina CA ed al Client tramite una connessione SSH.
 
Per prima cosa accedi al tuo Server ed installa OpenVPN (queste indicazioni sono valide anche lato Client).
 
L'installer può essere utilizzato sia lato Server che lato Client su sistema operativo Linux.

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.
 
Le stesse operazioni di installazione di OpenVPN saranno da replicare lato Client.
Prosegui scaricando EasyRSA sul tuo Server e sulla tua macchina 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.
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.
Sulla tua macchina 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 della macchina 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.
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

Sulla tua macchina 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/

Adesso è necessario accedere alla macchina Ubuntu che fungerà da Client nella connesione VPN.

Dopo aver eseguito l'installazione di OpenVPN su questa macchina, 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 macchina 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.
Ora lato Server 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.
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 come Client in quanto verrà usato dal software VPN per la connessione.
Per revocare i certificati di un Client esegui i seguenti comandi sulla tua macchina 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.