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.