Introduzione a WireGuard
WireGuard è un protocollo VPN di nuova generazione che ha rivoluzionato il mondo delle reti private virtuali. Rispetto ai veterani come OpenVPN e IPSec, WireGuard offre una codebase ridottissima (circa 4.000 righe di codice contro le 100.000+ di OpenVPN), una crittografia moderna basata su algoritmi come ChaCha20, Curve25519 e BLAKE2s, e prestazioni nettamente superiori.
Integrato nel kernel Linux dalla versione 5.6 (marzo 2020), WireGuard è oggi la scelta preferita da sysadmin, sviluppatori e professionisti della sicurezza informatica che necessitano di una VPN affidabile, veloce e facile da gestire. In questa guida completa vedremo come installarlo, configurarlo e ottimizzarlo su un server Linux Ubuntu/Debian.
Prerequisiti
Prima di iniziare, assicurati di avere a disposizione:
- Un server Linux con Debian/Ubuntu 22.04 LTS o superiore
- Accesso root o utente con privilegi sudo
- Kernel Linux versione 5.6 o superiore (verifica con
uname -r) - Un indirizzo IP pubblico statico sul server
- Porta UDP aperta nel firewall (default: 51820)
- Conoscenza base della riga di comando Linux
Se il tuo kernel è precedente alla 5.6, puoi installare WireGuard come modulo separato. Tuttavia, consigliamo vivamente di utilizzare una distribuzione aggiornata per beneficiare dell’integrazione nativa e delle patch di sicurezza più recenti.
Installazione di WireGuard su Linux
Step 1: Aggiornare il sistema e installare WireGuard
Inizia aggiornando i pacchetti del sistema e installando WireGuard tramite il gestore pacchetti:
sudo apt update && sudo apt upgrade -y sudo apt install wireguard wireguard-tools -y
Su sistemi Fedora/CentOS/RHEL, usa invece:
sudo dnf install wireguard-tools -y
Step 2: Generare le chiavi crittografiche
WireGuard utilizza una coppia di chiavi asimmetriche per autenticare server e client. Genera le chiavi del server con i seguenti comandi:
wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key sudo chmod 600 /etc/wireguard/server_private.key
Salva queste chiavi in un posto sicuro. La chiave privata non deve mai essere condivisa; la chiave pubblica verrà distribuita ai client.
Step 3: Creare il file di configurazione del server
Crea il file di configurazione principale di WireGuard. Sostituisci YOUR_PRIVATE_KEY con il contenuto del file server_private.key:
sudo nano /etc/wireguard/wg0.conf
Inserisci il seguente contenuto:
[Interface] Address = 10.0.0.1/24 ListenPort = 51820 PrivateKey = YOUR_PRIVATE_KEY PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = CLIENT_PUBLIC_KEY AllowedIPs = 10.0.0.2/32
Nota: Sostituisci eth0 con il nome della tua interfaccia di rete principale (verifica con ip link show) e CLIENT_PUBLIC_KEY con la chiave pubblica del client che configurerai nel passo successivo.
Step 4: Abilitare il forwarding IP
Per permettere al server VPN di instradare il traffico dei client verso Internet, è necessario abilitare il forwarding IP:
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf sudo sysctl -p
Verifica che il forwarding sia attivo con:
cat /proc/sys/net/ipv4/ip_forward
Il risultato deve essere 1.
Step 5: Avviare e abilitare il servizio WireGuard
Avvia l’interfaccia WireGuard e configurala per partire automaticamente al boot del sistema:
sudo systemctl enable wg-quick@wg0 sudo systemctl start wg-quick@wg0 sudo systemctl status wg-quick@wg0
Se tutto è corretto, vedrai il servizio in stato active (running).
Configurazione del client WireGuard
Step 6: Generare le chiavi del client
Sul computer client (può essere Linux, Windows, macOS, Android o iOS), genera la coppia di chiavi:
wg genkey | tee client_private.key | wg pubkey > client_public.key
Step 7: Creare il profilo di connessione del client
Crea il file di configurazione del client:
[Interface] Address = 10.0.0.2/24 PrivateKey = CLIENT_PRIVATE_KEY DNS = 1.1.1.1 [Peer] PublicKey = SERVER_PUBLIC_KEY Endpoint = SERVER_IP:51820 AllowedIPs = 0.0.0.0/0 PersistentKeepalive = 25
Il parametro AllowedIPs = 0.0.0.0/0 fa sì che tutto il traffico del client venga instradato attraverso il tunnel VPN. Se vuoi usare WireGuard solo per reti specifiche (split tunneling), inserisci i CIDR desiderati.
Il parametro PersistentKeepalive = 25 è utile quando il client si trova dietro NAT: invia un pacchetto keepalive ogni 25 secondi per mantenere attiva la connessione.
Step 8: Aggiungere il client al server
Ora aggiungi la chiave pubblica del client nel file di configurazione del server (/etc/wireguard/wg0.conf) nella sezione [Peer], oppure usa il metodo dinamico senza riavviare il servizio:
sudo wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.0.0.2/32
Verifica lo stato della connessione con:
sudo wg show
Ottimizzazione delle prestazioni
WireGuard è già estremamente veloce by design, ma puoi spingere ulteriormente le prestazioni con alcune configurazioni avanzate.
MTU e frammentazione
Imposta l’MTU corretto per evitare la frammentazione dei pacchetti. Il valore ottimale per WireGuard su connessioni standard è generalmente 1420:
[Interface] MTU = 1420
Ottimizzazione del buffer di rete
Aumenta i buffer del kernel per migliorare il throughput su connessioni ad alta velocità:
sudo sysctl -w net.core.rmem_max=2500000 sudo sysctl -w net.core.wmem_max=2500000
Utilizzo di più core CPU
WireGuard supporta nativamente il multi-threading attraverso il modulo kernel. Su server con molti core, puoi configurare il numero di thread con:
echo 'options wireguard nr_cpu_ids=4' | sudo tee /etc/modprobe.d/wireguard.conf
Sostituisci 4 con il numero di core disponibili sul tuo server.
Troubleshooting: problemi comuni e soluzioni
Problema 1: Il servizio non si avvia
Se systemctl status wg-quick@wg0 mostra errori, verifica che il file di configurazione sia corretto e che le chiavi siano nel formato giusto:
sudo wg-quick up wg0
Questo comando mostra l’output di errore in modo più dettagliato rispetto a systemctl.
Problema 2: Il client non si connette
- Verifica che la porta 51820/UDP sia aperta nel firewall del server:
sudo ufw allow 51820/udp - Controlla che l’IP pubblico del server sia corretto nel file di configurazione del client
- Assicurati che le chiavi pubbliche siano state inserite correttamente (nessuno spazio aggiuntivo)
- Usa
sudo wg showper vedere se il peer è stato riconosciuto
Problema 3: Il traffico Internet non funziona dopo la connessione
Questo problema è quasi sempre legato al forwarding IP o alle regole iptables. Verifica:
cat /proc/sys/net/ipv4/ip_forward sudo iptables -L -n -v | grep FORWARD
Se il forwarding è 0, esegui di nuovo sudo sysctl -p. Se le regole iptables mancano, controlla che le direttive PostUp e PostDown nel file di configurazione siano corrette e che il nome dell’interfaccia (eth0) corrisponda a quella reale del tuo sistema.
Problema 4: Latenza elevata o throughput basso
Se le prestazioni non soddisfano le aspettative, prova questi passaggi diagnostici:
- Esegui un test di velocità baseline senza VPN con
iperf3 - Verifica il carico della CPU del server durante la trasmissione:
htop - Controlla il valore MTU e prova a ridurlo a 1380 se noti problemi di frammentazione
- Assicurati di usare un kernel aggiornato per beneficiare delle ottimizzazioni più recenti
Problema 5: La connessione si interrompe periodicamente
Se il client si disconnette periodicamente, specialmente quando si trova dietro NAT, aumenta la frequenza del keepalive:
PersistentKeepalive = 15
Un valore di 15-25 secondi è generalmente sufficiente per mantenere aperto il mapping NAT sulla maggior parte dei router.
Sicurezza avanzata: best practice
Per un deployment in produzione, considera queste misure di sicurezza aggiuntive:
- Chiavi pre-condivise (PSK): aggiungi un ulteriore livello di sicurezza con
wg genpske il parametroPresharedKeynella sezione[Peer] - Firewall restrittivo: usa ufw o iptables per limitare l’accesso solo alle porte necessarie
- Rotazione periodica delle chiavi: ruota le chiavi ogni 3-6 mesi come buona pratica di sicurezza
- Monitoring: integra WireGuard con strumenti come Prometheus e Grafana per monitorare connessioni attive e traffico
- Fail2ban: configura fail2ban per limitare tentativi di connessione anomali sulla porta UDP
Conclusione
WireGuard rappresenta lo stato dell’arte nel mondo delle VPN: una codebase snella, crittografia moderna, integrazione nativa nel kernel Linux e prestazioni eccezionali lo rendono la scelta ideale sia per ambienti domestici che per infrastrutture aziendali ad alta disponibilità.

