Guida passo-passo per creare una VPN fai-da-te

27 Ottobre 2023
Hai mai pensato di creare una VPN (Virtual Private Network) fai-da-te? Sei nel posto giusto! In questa guida passo-passo, ti mostrerò come configurare un server VPN utilizzando Ubuntu 20.04. Con questa soluzione, potrai accedere in modo sicuro e protetto a Internet dal tuo smartphone o laptop, anche quando ti connetti a reti non attendibili come il Wi-Fi di un hotel o di un bar.
Prerequisiti
Prima di iniziare, assicurati di avere i seguenti prerequisiti:
- Un server Ubuntu 20.04 con un utente non root abilitato al comando sudo e un firewall attivo. Se non hai ancora configurato il tuo server, puoi seguire la guida “Initial Server Setup with Ubuntu 20.04” per farlo.
- Un server CA (Certificate Authority) separato configurato come Ubuntu 20.04. Puoi seguire la guida “How To Set Up and Configure a Certificate Authority (CA) on Ubuntu 20.04” per configurarlo.
- Una macchina client Ubuntu 20.04 che utilizzerai per connetterti al server VPN. Per comodità, puoi utilizzare il tuo computer locale come client VPN.
Passo 1: Installazione di OpenVPN e Easy-RSA
Il primo passo per configurare il tuo server VPN è installare OpenVPN e Easy-RSA. Entrambi i pacchetti sono disponibili nei repository predefiniti di Ubuntu e possono essere installati utilizzando il comando apt:
sudo apt update
sudo apt install openvpn easy-rsa
Successivamente, crea una nuova directory sul tuo server OpenVPN chiamata easy-rsa utilizzando il tuo utente non root:
mkdir ~/easy-rsa
Crea quindi un collegamento simbolico dalla directory easyrsa al percorso di installazione di easy-rsa:
ln -s /usr/share/easy-rsa/* ~/easy-rsa/
Infine, assicurati che il proprietario della directory sia il tuo utente non root e limita l’accesso a tale utente utilizzando il comando chmod:
sudo chown your_user ~/easy-rsa
chmod 700 ~/easy-rsa
Passo 2: Creazione di una PKI per OpenVPN
Prima di poter generare la chiave privata e il certificato del tuo server OpenVPN, devi creare una directory PKI locale sul tuo server OpenVPN. Utilizzerai questa directory per gestire le richieste di certificato del server e dei client anziché farle direttamente sul tuo server CA.
Per creare la directory PKI sul tuo server OpenVPN, apri il file vars all’interno della directory easy-rsa utilizzando il tuo editor di testo preferito:
nano ~/easy-rsa/vars
All’interno del file, incolla le seguenti due righe:
~/easy-rsa/vars
set_var EASYRSA_ALGO “ec”
set_var EASYRSA_DIGEST “sha512”
Queste due righe assicurano che le tue chiavi private e le richieste di certificato siano configurate per utilizzare la moderna crittografia a curva ellittica (ECC) per generare chiavi e firme sicure per i tuoi client e il server OpenVPN.
Una volta popolato il file vars, puoi procedere con la creazione della directory PKI eseguendo lo script easyrsa con l’opzione init-pki:
./easyrsa init-pki
Questa operazione inizializzerà la tua PKI sul server OpenVPN. La PKI sul tuo server VPN viene utilizzata solo come luogo conveniente e centralizzato per archiviare le richieste di certificato e i certificati pubblici. Il tuo server CA si occuperà di convalidare e firmare i certificati.
Dopo aver inizializzato la tua PKI sul server OpenVPN, sei pronto per passare al passaggio successivo, ovvero la creazione della richiesta di certificato e della chiave privata del server OpenVPN.
Passo 3: Creazione di una richiesta di certificato e di una chiave privata per il server OpenVPN
Ora che il tuo server OpenVPN dispone di tutti i prerequisiti installati, puoi procedere con la generazione di una chiave privata e una richiesta di certificato sul server OpenVPN. Successivamente, trasferirai la richiesta al tuo server CA per la firma e installerai il certificato sul server.
Per iniziare, accedi alla directory easy-rsa sul tuo server OpenVPN utilizzando il tuo utente non root:
cd ~/easy-rsa
Quindi, esegui lo script easyrsa con l’opzione gen-req seguita dal nome comune (CN) per il server. Il CN può essere quello che preferisci, ma è utile renderlo descrittivo. In questa guida, utilizzeremo “server” come CN. Assicurati di includere anche l’opzione nopass per evitare la protezione con password del file di richiesta, che potrebbe causare problemi di autorizzazioni in seguito:
./easyrsa gen-req server nopass
Questo comando creerà una chiave privata per il server e un file di richiesta di certificato chiamato server.req. Copia la chiave del server nella directory /etc/openvpn/server:
sudo cp pki/private/server.key /etc/openvpn/server/
Una volta completati questi passaggi, hai creato con successo una chiave privata per il tuo server OpenVPN e hai generato una richiesta di certificato per il server. La CSR è pronta per essere firmata dal tuo server CA. Nel prossimo passaggio, imparerai come firmare una CSR utilizzando la chiave privata del server CA.
Passo 4: Firma della richiesta di certificato del server OpenVPN
Nel passaggio precedente hai creato una richiesta di certificato (CSR) e una chiave privata per il server OpenVPN. Ora il server CA deve essere informato del certificato del server e deve convalidarlo. Una volta che il CA convalida e invia indietro il certificato al server OpenVPN, i client che si fidano del CA saranno in grado di fidarsi anche del server OpenVPN.
Sul server OpenVPN, utilizzando il tuo utente non root, utilizza SCP o un altro metodo di trasferimento per copiare la richiesta di certificato server.req sul server CA per la firma:
scp pki/reqs/server.req sammy@your_ca_server_ip:/tmp
Se hai seguito i prerequisiti della guida “How To Set Up and Configure a Certificate Authority (CA) on Ubuntu 20.04“, il passaggio successivo consiste nell’effettuare il login al server CA utilizzando l’utente non root creato per gestire il CA. Successivamente, accedi alla directory easy-rsa in cui hai creato la tua PKI e importa la richiesta di certificato utilizzando lo script easyrsa:
cd ~/easy-rsa
./easyrsa import-req /tmp/server.req server
Quindi, firma la richiesta eseguendo lo script easyrsa con l’opzione sign-req, seguita dal tipo di richiesta e dal nome comune. Il tipo di richiesta può essere “client” o “server“. Poiché stiamo lavorando con la richiesta di certificato del server OpenVPN, assicurati di utilizzare il tipo di richiesta “server“:
./easyrsa sign-req server server
Nel risultato otterrai una richiesta di conferma per verificare che la richiesta provenga da una fonte affidabile. Digita “yes” e premi INVIO per confermare:
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 3650 days:
subject=commonName = server
Type the word ‘yes’ to continue, or any other input to abort.
Confirm request details: yes
Nota: se hai crittografato la tua chiave privata CA, ti verrà richiesta la password in questo punto.
Con questi passaggi completati, hai firmato la richiesta di certificato del server OpenVPN utilizzando la chiave privata del server CA. Il file server.crt risultante contiene la chiave pubblica del server OpenVPN, nonché una firma del server CA. Lo scopo della firma è informare chiunque si fidi del server CA che può anche fidarsi del server OpenVPN quando si connette ad esso.
Per completare la configurazione dei certificati, copia i file server.crt e ca.crt dal server CA al server OpenVPN:
scp pki/issued/server.crt sammy@your_vpn_server_ip:/tmp
scp pki/ca.crt sammy@your_vpn_server_ip:/tmp
Torna sul tuo server OpenVPN e copia i file da /tmp a /etc/openvpn/server:
sudo cp /tmp/server.crt /etc/openvpn/server/
sudo cp /tmp/ca.crt /etc/openvpn/server/
Ora il tuo server OpenVPN è quasi pronto per accettare le connessioni. Nel passaggio successivo eseguirai alcune operazioni aggiuntive per aumentare la sicurezza del server.
Passo 5: Configurazione del materiale crittografico di OpenVPN
Per aggiungere un ulteriore livello di sicurezza, aggiungeremo una chiave segreta condivisa extra che il server e tutti i client utilizzeranno con la direttiva tls-crypt di OpenVPN. Questa opzione viene utilizzata per oscurare il certificato TLS utilizzato quando un server e un client si connettono inizialmente tra loro. Viene anche utilizzata dal server OpenVPN per eseguire controlli veloci sui pacchetti in entrata: se un pacchetto è firmato utilizzando la chiave pre-condivisa, il server lo elabora; se non è firmato, il server sa che proviene da una fonte non attendibile e può eliminarlo senza dover eseguire ulteriori operazioni di decrittazione.
Questo permetterà al tuo server OpenVPN di gestire il traffico non autenticato, le scansioni delle porte e gli attacchi Denial of Service, che possono saturare le risorse del server. Inoltre, rende più difficile identificare il traffico di rete OpenVPN.
Per generare la chiave pre-condivisa tls-crypt, esegui il seguente comando nella directory easy-rsa del tuo server OpenVPN:
cd ~/easy-rsa
openvpn –genkey –secret ta.key
Il risultato sarà un file chiamato ta.key. Copialo nella directory /etc/openvpn/server:
sudo cp ta.key /etc/openvpn/server/
Con questi file posizionati sul server OpenVPN, sei pronto per creare certificati e file chiave per i tuoi utenti, che utilizzerai per connetterti alla VPN.
Passo 6: Generazione di un certificato e una chiave per il client
Sebbene tu possa generare una chiave privata e una richiesta di certificato sulla tua macchina client e poi inviarla al CA per la firma, in questa guida ti mostrerò un processo per generare la richiesta di certificato sul server OpenVPN. Il vantaggio di questo approccio è che possiamo creare uno script che genererà automaticamente file di configurazione client che conterranno tutte le chiavi e i certificati necessari. In questo modo, eviterai di dover trasferire chiavi, certificati e file di configurazione ai client e semplificherai il processo di connessione alla VPN.
Genereremo una singola chiave e un certificato client per questa guida. Se hai più client, puoi ripetere questo processo per ognuno di essi. Tuttavia, dovrai passare un valore di nome unico allo script per ogni client. In tutta questa guida, il primo certificato/chave è chiamato client1.
Inizia creando una struttura di directory all’interno della tua directory home per archiviare i file di chiave e certificato del client:
mkdir -p ~/client-configs/keys
Poiché archivierai le coppie di chiavi e certificati e i file di configurazione dei tuoi client in questa directory, dovresti limitare i permessi per motivi di sicurezza:
chmod -R 700 ~/client-configs
Torna alla directory easy-rsa e crea la richiesta di certificato eseguendo lo script easyrsa con l’opzione gen-req seguita dal nome comune per il client. Assicurati di includere anche l’opzione nopass per evitare la protezione con password del file di richiesta:
cd ~/easy-rsa
./easyrsa gen-req client1 nopass
Premi INVIO per confermare il nome comune. Successivamente, copia il file client1.key nella directory ~/client-configs/keys/ che hai creato in precedenza:
cp pki/private/client1.key ~/client-configs/keys/
Trasferisci quindi il file client1.req sul tuo server CA utilizzando un metodo sicuro (ad esempio, SCP):
scp pki/reqs/client1.req sammy@your_ca_server_ip:/tmp
Effettua nuovamente il login al tuo server CA. Quindi, vai alla directory easy-rsa e importa la richiesta di certificato:
cd ~/easy-rsa
./easyrsa import-req /tmp/client1.req client1
Successivamente, firma la richiesta in modo simile a quanto hai fatto per il server nel passaggio precedente, assicurandoti di specificare il tipo di richiesta “client”:
./easyrsa sign-req client client1
Quando richiesto, inserisci “yes” per confermare che intendi firmare la richiesta di certificato e che proviene da una fonte attendibile.
Questo creerà un file di certificato client chiamato client1.crt. Trasferisci questo file nuovamente sul tuo server OpenVPN:
scp pki/issued/client1.crt sammy@your_server_ip:/tmp
Torna sul tuo server OpenVPN e copia il certificato client nella directory ~/client-configs/keys/:
cp /tmp/client1.crt ~/client-configs/keys/
Successivamente, copia anche i file ca.crt e ta.key nella directory ~/client-configs/keys/ e imposta le autorizzazioni appropriate:
sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
sudo cp ~/easy-rsa/ta.key ~/client-configs/keys/
sudo chown sammy.sammy ~/client-configs/keys/*
Con questo, i certificati e le chiavi del tuo server e dei tuoi client sono stati generati e archiviati nelle directory appropriate sul tuo server OpenVPN. Ci sono ancora alcune azioni da eseguire con questi file, ma verranno trattate nel passaggio successivo. Per ora, puoi passare alla configurazione di OpenVPN.
Passo 7: Configurazione di OpenVPN
Come molti altri strumenti open source ampiamente utilizzati, OpenVPN offre numerose opzioni di configurazione per personalizzare il server in base alle tue esigenze specifiche. In questa sezione, forniremo istruzioni su come configurare OpenVPN utilizzando uno dei file di configurazione di esempio inclusi nella documentazione del software.
Inizia copiando il file di configurazione del client di esempio come punto di partenza per la tua configurazione:
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
Apri il nuovo file con il tuo editor di testo preferito:
sudo nano ~/client-configs/base.conf
Modifica alcune righe in questo file. Trova la direttiva remote che indica all’applicazione client l’indirizzo del tuo server OpenVPN. Se hai cambiato la porta su cui il server OpenVPN è in ascolto, dovrai anche modificare 1194 con la porta selezionata:
remote your_server_ip 1194
Assicurati che il protocollo corrisponda al valore utilizzato nella configurazione del server:
proto udp
Sotto questa riga, aggiungi la direttiva user e group, rimuovendo il punto e virgola all’inizio di ciascuna riga:
user nobody
group nogroup
Trova le direttive che impostano ca, cert e key. Commenta queste direttive poiché aggiungerai i certificati e le chiavi all’interno del file stesso:
;ca ca.crt
;cert client.crt
;key client.key
Commenta anche la direttiva tls-auth, poiché aggiungerai ta.key direttamente nel file di configurazione del client (il server è configurato per utilizzare tls-crypt):
;tls-auth ta.key 1
Ripeti la cifratura e le impostazioni di autenticazione che hai impostato nel file di configurazione del server:
cipher AES-256-GCM
auth SHA256
Aggiungi anche la direttiva key-direction in qualche punto del file. Dovresti impostarla su “1” affinché la VPN funzioni correttamente sulla macchina client:
key-direction 1
Infine, aggiungi alcune righe commentate per gestire i vari metodi che i client VPN basati su Linux utilizzeranno per la risoluzione DNS. Aggiungi due gruppi di linee simili, ma separate. Il primo gruppo è per i client che non utilizzano systemd-resolved per la gestione della risoluzione DNS. Questi client si basano sull’utilità resolvconf per aggiornare le informazioni DNS per i client Linux:
; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf
Aggiungi un altro gruppo di righe per i client che utilizzano systemd-resolved per la risoluzione DNS:
; script-security 2
; up /etc/openvpn/update-systemd-resolved
; down /etc/openvpn/update-systemd-resolved
Salva e chiudi il file quando hai finito.
Hai ora completato la configurazione di OpenVPN per il tuo server. Nel passaggio successivo, personalizzerai le opzioni di rete del server.
Passo 8: Regolazione della configurazione di rete del server OpenVPN
Ci sono alcuni aspetti della configurazione di rete del server che devono essere regolati affinché OpenVPN possa instradare correttamente il traffico attraverso la VPN. Il primo di questi è il forwarding IP, un metodo per determinare dove instradare il traffico IP. Questo è essenziale per la funzionalità VPN che il tuo server fornirà.
Per regolare l’impostazione predefinita del forwarding IP del tuo server OpenVPN, apri il file /etc/sysctl.conf utilizzando nano o il tuo editor di testo preferito:
sudo nano /etc/sysctl.conf
Aggiungi la seguente riga alla fine del file:
net.ipv4.ip_forward = 1
Salva e chiudi il file quando hai finito.
Per leggere il file e caricare i nuovi valori per la sessione corrente, esegui il seguente comando:
sudo sysctl -p
Ora il tuo server OpenVPN sarà in grado di inoltrare il traffico in arrivo da un dispositivo Ethernet a un altro. Questa impostazione assicura che il server possa instradare il traffico dai client che si connettono all’interfaccia VPN virtuale su altri dispositivi Ethernet fisici. Questa configurazione instraderà tutto il traffico Web del client tramite l’indirizzo IP del tuo server e l’indirizzo IP pubblico del client sarà effettivamente nascosto.
Nel passaggio successivo, configurerai alcune regole del firewall per garantire che il traffico da e verso il tuo server OpenVPN venga instradato correttamente.
Passo 9: Configurazione del firewall
Finora, hai installato OpenVPN sul tuo server, lo hai configurato e hai generato le chiavi e i certificati necessari per consentire ai tuoi client di accedere alla VPN. Tuttavia, non hai ancora fornito a OpenVPN alcuna istruzione su dove inviare il traffico Web in ingresso dai client. Puoi specificare come il server dovrebbe gestire il traffico del client stabilendo alcune regole del firewall e configurazioni di routing.
Supponendo di aver seguito i prerequisiti all’inizio di questa guida, dovresti già avere UFW installato e in esecuzione sul tuo server. Per consentire a OpenVPN di passare attraverso il firewall, è necessario abilitare il masquerading, un concetto di iptables che fornisce una traduzione dinamica degli indirizzi di rete (NAT) per instradare correttamente le connessioni dei client.
Prima di aprire il file di configurazione del firewall per aggiungere le regole di mascheramento, devi prima trovare l’interfaccia di rete pubblica della tua macchina. Per farlo, digita il seguente comando:
ip route list default
L’interfaccia pubblica è la stringa trovata all’interno dell’output del comando che segue la parola “dev”. Ad esempio, questo risultato mostra l’interfaccia chiamata eth0:
default via 159.65.160.1 dev eth0 proto static
Una volta identificata l’interfaccia associata alla tua route predefinita, apri il file /etc/ufw/before.rules per aggiungere la configurazione di mascheramento appropriata:
sudo nano /etc/ufw/before.rules
Le regole UFW vengono normalmente aggiunte utilizzando il comando ufw. Tuttavia, le regole elencate nel file before.rules vengono lette e applicate prima delle regole UFW convenzionali. Verso l’inizio del file, aggiungi le seguenti linee evidenziate. Questo imposterà la politica predefinita per la catena POSTROUTING nella tabella di rete NAT e maschera tutto il traffico proveniente dalla VPN. Ricorda di sostituire eth0 nella riga -A POSTROUTING con l’interfaccia che hai trovato nel comando precedente:
## rules.before
## Rules that should be run before the ufw command line added rules. Custom
## rules should be added to one of these chains:
## ufw-before-input
## ufw-before-output
## ufw-before-forward
## START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
## END OPENVPN RULES
## Don’t delete these required lines, otherwise there will be errors
*filter
…
Salva e chiudi il file quando hai finito.
Successivamente, devi dire a UFW di consentire pacchetti inoltrati per impostazione predefinita. Per fare ciò, apri il file /etc/default/ufw:
sudo nano /etc/default/ufw
All’interno, trova la direttiva DEFAULT_FORWARD_POLICY e cambia il valore da DROP a ACCEPT:
DEFAULT_FORWARD_POLICY=”ACCEPT”
Salva e chiudi il file quando hai finito.
Successivamente, adatta il firewall stesso per consentire il traffico a OpenVPN. Se non hai modificato la porta e il protocollo nel file /etc/openvpn/server/server.conf, dovrai aprire il traffico UDP sulla porta 1194. Se hai modificato la porta e/o il protocollo, sostituisci i valori selezionati.
Se hai dimenticato di aggiungere la porta SSH durante la guida dei prerequisiti, aggiungila qui:
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
Nota: se stai utilizzando un firewall diverso o hai personalizzato la configurazione di UFW, potresti dover aggiungere regole del firewall aggiuntive. Ad esempio, se decidi di instradare tutto il tuo traffico di rete tramite la connessione VPN, dovrai assicurarti che il traffico sulla porta 53 sia consentito per le richieste DNS e che le porte come 80 e 443 siano consentite per il traffico HTTP e HTTPS rispettivamente. Se ci sono altri protocolli che stai utilizzando tramite la VPN, dovrai aggiungere regole anche per quelli.
Dopo aver aggiunto queste regole, disabilita e riabilita UFW per riavviarlo e caricare le modifiche dai file modificati in precedenza:
sudo ufw disable
sudo ufw enable
Il tuo server è ora configurato per gestire correttamente il traffico OpenVPN. Con le regole del firewall in atto, possiamo avviare il servizio OpenVPN sul server.
Passo 10: Avvio di OpenVPN
OpenVPN viene eseguito come servizio di sistema, quindi possiamo utilizzare systemctl per gestirlo. Configureremo OpenVPN per avviarsi all’avvio in modo da poterti connettere alla tua VPN in qualsiasi momento, purché il tuo server sia in esecuzione. Per fare ciò, abilita il servizio OpenVPN aggiungendolo a systemctl:
sudo systemctl -f enable openvpn-server@server.service
Avvia quindi il servizio OpenVPN:
sudo systemctl start openvpn-server@server.service
Verifica che il servizio OpenVPN sia attivo con il seguente comando. Dovresti vedere “active (running)” nell’output:
sudo systemctl status openvpn-server@server.service
- openvpn-server@server.service – OpenVPN service for server
Loaded: loaded (/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-04-29 15:39:59 UTC; 6s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 16872 (openvpn)
Status: “Initialization Sequence Completed”
Tasks: 1 (limit: 1137)
Memory: 1.0M
CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
└─16872 /usr/sbin/openvpn –status /run/openvpn-server/status-server.log –status-version 2 –suppress-timestamps –c>
Hai completato la configurazione del lato server per OpenVPN. Successivamente, configurerai la macchina client e ti connetterai al server OpenVPN.