Configurare Wireguard VPN

In questo articolo esamineremo l’installazione e la configurazione di un server VPN con WireGuard, nonché il suo utilizzo su dispositivi Android e Linux.

  ·   9 min read

Una VPN (Virtual Private Network) è una rete privata virtuale che consente di stabilire connessioni tra soggetti. Sono nate inizialmente con lo scopo di fornire alle aziende, a costi inferiori, le stesse funzionalità delle linee private a noleggio, creando una rete LAN virtuale e privata che simula un’infrastruttura fisica dedicata.

Questo consente alle aziende di collegare in modo sicuro diversi siti dislocati su un ampio territorio, facilitando l’accesso remoto alle risorse aziendali come cartelle condivise, gestionali e posta elettronica, risultando particolarmente utile ai dipendenti che lavorano da remoto, poiché possono accedere alla rete aziendale come se fossero fisicamente presenti in ufficio.

Per gli utenti privati, é importante ricordare che una VPN, sia essa gratuita o a pagamento, non garantisce l'anonimato o l'invisibilità su Internet. L’indirizzo IP rappresenta solo uno dei numerosi metodi attraverso cui è possibile essere identificati; pertanto, semplicemente cambiando l’indirizzo IP non si diventa automaticamente anonimi.

Se l’obiettivo è semplicemente evitare la profilazione pubblicitaria, una VPN non è una soluzione efficace. Essa non offre protezione contro le numerose tecniche utilizzate per raccogliere informazioni sui dispositivi e sugli utenti, come i cookie, il fingerprinting, ecc. Pertanto, per affrontare queste problematiche, è necessario considerare altre misure, come l’uso di browser orientati alla privacy, estensioni per il blocco dei tracker e tecniche di anonimizzazione più avanzate. Lo slogan una VPN ti fa navigare in modo anonimo è solo marketing.

Tuttavia, una VPN può rivelarsi utile in diverse situazioni. Ad esempio, può contribuire a nascondere il traffico dati al proprio provider di servizi Internet (ISP). Da notare che, mentre il traffico è nascosto al provider locale, esso viene comunque instradato attraverso il server del provider della VPN; di conseguenza, la fiducia nel provider diventa un elemento cruciale.

Infine, una VPN può essere impiegata per aggirare restrizioni geografiche su determinati servizi. Se un servizio è bloccato nel proprio paese, l’utilizzo di una VPN consente di mascherare la propria posizione e far apparire la connessione come se provenisse da un altro Stato, facilitando così l’accesso a contenuti altrimenti inaccessibili.

Wireguard #

WireGuard è un protocollo e un programma VPN open source, progettato per offrire prestazioni superiori rispetto a soluzioni come IPsec e OpenVPN.

A differenza di altre VPN che operano nello spazio utente, WireGuard è integrato direttamente nel kernel di Linux, garantendo prestazioni elevate e una gestione ottimale delle risorse.

Utilizza un sistema di crittografia basato su chiavi pubbliche e private per stabilire tunnel crittografati tra i peer, similmente a SSH. Ogni client e server nella rete WireGuard genera una coppia di chiavi: la chiave pubblica viene condivisa con gli altri nodi, mentre la chiave privata rimane segreta. Questo approccio riduce la complessità rispetto alle VPN tradizionali, evitando l’uso di certificati.

Obiettivo #

L’obiettivo finale di questa guida è self-hostare una VPN utilizzando WireGuard. I principali vantaggi di questa configurazione includono la personalizzazione dell’esperienza e il controllo (quasi) totale sull’infrastruttura VPN.

Tuttavia, ci sono anche alcuni svantaggi da considerare. Uno dei principali è la minore anonimizzazione dell'indirizzo IP. A meno che non si condivida la VPN con un numero elevato di familiari e amici, l’utente sarà l’unico a utilizzare l’indirizzo IP in uscita della VPN. Questo rappresenta comunque un codice univoco che solo l’utente utilizza, rendendo più facile il tracciamento delle sue attività online.

Inoltre, anche se non si forniscono dati a un fornitore VPN commerciale, configurando questo sistema su una VPS a noleggio, si trasferisce la fiducia da un fornitore ad un altro. Pertanto, è fondamentale scegliere con attenzione il provider del server VPS o eseguire questa configurazione su una macchina non intestata all’utente, per garantire un livello adeguato di privacy e sicurezza.

Installazione #

Su Debian e derivate, eseguire il seguente comando:

apt update && apt install wireguard qrencode

Creare la directory che conterrá le configurazioni dei peer: mkdir -p /etc/wireguard/client-configs

Configurazione del server WireGuard #

Generazione delle chiavi #

Una volta installato WireGuard, il passo successivo è generare una coppia di chiavi privata e pubblica per il server. Si consiglia di modificare i permessi per le chiavi generate, poiché per impostazione predefinita sono leggibili da qualsiasi utente.

wg genkey | tee /etc/wireguard/private.key
chmod 600 /etc/wireguard/private.key

Il passo successivo è creare la corrispondente chiave pubblica, che è derivata dalla chiave privata:

cat /etc/wireguard/private.key | wg pubkey | tee /etc/wireguard/public.key

Scelta di un intervallo IPv4 #

È necessario ora definire una subnet di indirizzi IPv4 privati, cosí da poter assegnare degli indirizzi IP corrispondenti ai client e all’interfaccia virtuale del server. È possibile scegliere un range qualsiasi all’interno dei seguenti intervalli:

  • 10.0.0.0/8
  • 172.16.0.0/12 (da 172.16.0.0 a 172.31.255.255)
  • 192.168.0.0/16

Per questo tutorial, utilizzeremo la subnet 10.8.0.0/24, che consente di gestire fino a 255 connessioni diverse, il che è generalmente sufficiente per la maggior parte delle configurazioni di rete domestiche.

Il server WireGuard utilizzerà un singolo indirizzo IP all’interno di questo intervallo. In questo caso, utilizzeremo 10.8.0.1/24 come indirizzo del server, ma è possibile utilizzare qualsiasi indirizzo compreso tra 10.8.0.1 e 10.8.0.255.

File di configurazione del server #

Editare il file /etc/wireguard/wg0.conf, aggiungendo le seguenti righe:

[Interface]
PrivateKey = [CHIAVE_PRIVATA_SERVER]
Address = 10.8.0.1/24
ListenPort = 51820

PostUp = ufw route allow in on wg0 out on eth0 ; ufw route deny out on wg0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0 ; ufw route delete deny out on wg0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Le righe PostUp verranno eseguite quando il server WireGuard avvia il tunnel VPN.

  • ufw route allow in on wg0 out on eth0 ; ufw route deny out on wg0: questa regola consente il traffico in ingresso sull’interfaccia VPN wg0 e lo inoltra all’interfaccia di rete pubblica eth0, permettendo ai client VPN di accedere all’interfaccia di rete del server. Inoltre, questa regola nega il traffico in uscita dall’interfaccia VPN wg0, cosicché i client VPN non possono inviare traffico verso altre destinazioni al di fuori della VPN
  • iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE: questa regola fa apparire le connessioni in uscita come se provenissero dall’indirizzo IP pubblico del server, in modo da nascondere l’indirizzo IP dei client VPN

Le regole PreDown vengono eseguite quando il server WireGuard interrompe il tunnel VPN. Queste regole sono l’inverso delle regole PostUp e servono a annullare le regole per l’interfaccia VPN quando questa viene stoppata.

Forward del traffico ipv4 #

Per fare in modo che il client VPN instradi il suo traffico Internet attraverso il server, è necessario abilitare l’IP forwarding (inoltro dell’indirizzo IP). Questo consente al server di ricevere richieste dai client VPN, inoltrarle a Internet e restituire loro le risposte. In questo modo, il traffico appare come se provenisse dall’indirizzo IP del server, nascondendo l’indirizzo IP pubblico del client.

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

Se invece si desidera utilizzare WireGuard solo per consentire a un peer di accedere ai servizi presenti sul server (senza necessità di navigare in Internet), non è necessario configurare l’IP forwarding.

UFW #

Infine, bisogna consentire il traffico UDP sulla porta 51820, su cui il server WireGuard é in ascolto, come da file di configurazione:

ufw allow 51820/udp

Avvio del server #

wg-quick up wg0
systemctl enable --now wg-quick@wg0.service
systemctl status wg-quick@wg0.service

Configurazione di un client mobile #

Per semplicitá, genereremo le chiavi sul server, tuttavia, diverse applicazioni permettono di generare la coppia di chiavi direttamente in-app.

Generazione della coppia di chiavi #

wg genkey | tee /etc/wireguard/client-configs/client_private.key | wg pubkey > /etc/wireguard/client-configs/client_public.key
chmod 600 /etc/wireguard/client-configs/client_private.key

File di configurazione del client #

Aggiungere le righe seguenti al file /etc/wireguard/client-configs/client_wg0.conf:

[Interface]
PrivateKey = [CHIAVE_PRIVATA_CLIENT]
Address = 10.8.0.2/32
DNS = 9.9.9.9

[Peer]
PublicKey = [CHIAVE_PUBBLICA_SERVER]
Endpoint = [IP_PUBBLICO_SERVER]:51820
AllowedIPs = 0.0.0.0/0

Inserire in coda al file /etc/wireguard/wg0.conf i dati del peer:

[Peer]
PublicKey = [CHIAVE_PUBBLICA_CLIENT]
AllowedIPs = 10.8.0.2/32

Riavviare al termine il servizio:

systemctl restart wg-quick@wg0.service

## Oppure

wg-quick down wg0 && wg-quick up wg0

Importazione del certificato su Android #

Scaricare l’applicazione Rethink sul proprio cellulare. Questa applicazione offre la possibilità di utilizzare una VPN tramite WireGuard e di configurare DNS personalizzati utilizzando DNS over TLS (DoT) o DNS over HTTPS (DoH). In questo contesto, utilizzeremo NextDNS, che offre funzionalità avanzate come il blocco degli annunci, la protezione contro il tracciamento e la personalizzazione delle impostazioni di privacy.

Arrivati a questo punto, é possibile importare il file di configurazione /etc/wireguard/client-configs/client_wg0.conf sul cellulare oppure generare un qr-code direttamente sul server col comando:

qrencode -t ansiutf8 < /etc/wireguard/client-configs/client_wg0.conf

rethink-home

rethink-import

Selezionare quindi tutte le applicazioni che si desidera instradare e avviare la VPN.

Dalle impostazioni di rete su Android, é possibile abilitare una specie di Kill Switch, bloccando tutto il traffico al di fuori della VPN. Il Kill Switch è difatti una funzionalità di sicurezza che interrompe automaticamente la connessione di un dispositivo nel momento in cui la connessione VPN cade o si interrompe inaspettatamente.

kill-switch

Lo stesso, anche dalle impostazioni di Rethink

rethink-always-on

In questo modo, si garantisce che, nel caso in cui la connessione VPN fosse interrotta, l’accesso a Internet venga bloccato automaticamente.

Per verificare che tutto stia funzionando correttamente, utilizzando l’applicazione Find my IP o visitando il sito whatismyipaddress.com, dovremmo vedere l’indirizzo IP pubblico del server Wireguard: ció significa che la VPN è attiva e funzionante correttamente.

Configurazione di un client Linux #

Prenderemo come esempio un client Debian based. Installeremo il software necessario, configureremo il tunnel e avvieremo la connessione.

apt install wireguard-tools

Generare la coppia di chiavi:

wg genkey | tee /etc/wireguard/client_private.key | wg pubkey > /etc/wireguard/client_public.key
chmod 600 /etc/wireguard/*

ls -lh /etc/wireguard/
-rw------- 1 root root 45 Jul 20 16:43 client_private.key
-rw------- 1 root root 45 Jul 20 16:43 client_public.key

Creare il file di configurazione per il client

etc/wireguard/vpn0.conf
[Interface]
PrivateKey = [CHIAVE_PRIVATA_CLIENT]
Address = 10.8.0.3/32
DNS = 1.1.1.1

[Peer]
PublicKey = [CHIAVE_PUBBLICA_SERVER]
Endpoint =  [IP_PUBBLICO_SERVER]:51820
AllowedIPs = 0.0.0.0/0

Infine, sul server VPN, aggiungere il client alla lista dei peer autorizzati:

cat /etc/wireguard/vpn0.conf

[...]

[Peer]
PublicKey = [CHIAVE_PUBBLICA_CLIENT_0]
AllowedIPs = 10.8.0.2/32

[Peer]
PublicKey = [CHIAVE_PUBBLICA_CLIENT_1]
AllowedIPs = 10.8.0.3/32

Avviare sul client la VPN:

wg-quick up wg0

Per verificare il corretto instradamento, è possibile ottenere l’indirizzo IP pubblico con cui ci si presenta su Internet col comando curl ipinfo.io/ip. Questo comando restituirà l’indirizzo IP pubblico attualmente in uso, consentendo di confermare se il traffico sta passando attraverso la VPN.

Network Manager #

Da utente root, per importare la VPN nell’applet di Network Manager, facilitando la gestione della connessione, utilizzare il comando:

nmcli connection import type wireguard file /etc/wireguard/vpn0.conf

wireguard-nm

Video #

Oppure

Riferimenti #