
Cos’è una VPN, perché usarla e come installarla

Cos’è una VPN e quali benefici offre
Una VPN (Virtual Private Network) crea un canale cifrato fra il tuo dispositivo e un server remoto. Il traffico che passa nel tunnel non è visibile a ISP e reti intermedie. Risultato: sicurezza su reti non fidate (es. Wi‑Fi pubblici), privacy dall’esposizione dell’IP reale e accesso remoto ai servizi interni come se fossi in LAN.
Benefici principali
- Confidenzialità del traffico grazie alla cifratura end‑to‑end client↔server.
- Integrità: riduzione di attacchi MITM e di manipolazioni del traffico.
- Accesso sicuro a pannelli di amministrazione, database, SMB/NFS, SSH.
- Privacy IP (in modalità full‑tunnel): i siti vedono l’IP del server.
- Controllo: decidi cosa instradare (tutto o solo reti specifiche).
Perché scegliere WireGuard
- Veloce e leggero: implementazione minimale e performante.
- Sicurezza moderna: set di primitive crittografiche attuali e ben scelte.
- Semplicità: configurazione chiara, file
wg0.confcompatto. - Portabilità: client per Linux/macOS/Windows/iOS/Android; supporto QR.
Prerequisiti
- Ubuntu Server 22.04+ con privilegi
sudo. - IP pubblico e porta UDP dedicata (default
51820). - Firewall gestibile (UFW o Firewalld). NAT/forwarding attivabili.
- Eventuale web server Apache sullo stesso host (nessun conflitto: TCP vs UDP).
Installazione server WireGuard su Ubuntu
1) Pacchetti
sudo apt update
sudo apt install -y wireguard qrencode
2) Coppia di chiavi del server
sudo umask 077
sudo wg genkey | sudo tee /etc/wireguard/privatekey \
| wg pubkey | sudo tee /etc/wireguard/publickey
3) File /etc/wireguard/wg0.conf
Rete VPN d’esempio: 10.0.0.0/24, server 10.0.0.1:
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <CONTENUTO_DI_/etc/wireguard/privatekey>
# Regole idempotenti per firewall/NAT
PostUp = sysctl -w net.ipv4.ip_forward=1; \
iptables -I INPUT -p udp --dport 51820 -j ACCEPT; \
iptables -I FORWARD -i wg0 -o eth0 -j ACCEPT; \
iptables -I FORWARD -i eth0 -o wg0 -j ACCEPT; \
iptables -t nat -I POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -D INPUT -p udp --dport 51820 -j ACCEPT; \
iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT; \
iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT; \
iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
Nota: sostituisci eth0 con l’interfaccia WAN reale (es. ens3, enp0s3…). Evita SaveConfig = true sul server, perché può riscrivere il file in modo inatteso (es. aggiungendo Endpoint ai peer lato server).
4) Abilitazione e avvio
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
sudo systemctl status wg-quick@wg0 --no-pager
5) Aggiunta peer (metodo sicuro)
Per ogni dispositivo: genera chiavi, assegna un IP univoco e aggiungi un blocco [Peer]. Esempio per un PC 10.0.0.2:
[Peer]
# Client PC
PublicKey = <CLIENT_PC_PUBLIC_KEY>
AllowedIPs = 10.0.0.2/32
Firewall, IP forwarding e NAT
IP forwarding permanente
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
sysctl net.ipv4.ip_forward
UFW (server o client)
sudo ufw allow 51820/udp
sudo ufw status verbose
Se usi UFW e vuoi full‑tunnel, aggiungi il MASQUERADE (già presente in PostUp sopra).
Firewalld (server)
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
In alternativa: assegna wg0 alla zona trusted e lascia il masquerade sulla public.
Nota su iptables vs nftables
Su Ubuntu recenti può coesistere nftables con un layer di compatibilità iptables (iptables-nft). Mantieni coerenza: se scrivi regole via iptables in PostUp, continua con quello, oppure migra tutto a nft.
Configurazione client PC (Linux)
1) Installazione
sudo apt update
sudo apt install -y wireguard
2) Chiavi client
umask 077
wg genkey | tee ~/client_private.key | wg pubkey | tee ~/client_public.key
3) File /etc/wireguard/wg0.conf (client)
[Interface]
Address = 10.0.0.2/24
PrivateKey = <CLIENT_PRIVATE_KEY>
# Imposta DNS solo se necessario (alcuni NM richiedono valore se IPv4=Manuale)
DNS = 1.1.1.1, 8.8.8.8
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = <SERVER_IP_PUBBLICO>:51820
# Full‑tunnel
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
4) Avvio
sudo systemctl enable --now wg-quick@wg0
wg show
ip route
NetworkManager GUI può “nascondere” il campo PrivateKey dopo il salvataggio per sicurezza. Assicurati che il file in /etc/wireguard/ contenga la chiave corretta.
Configurazione smartphone via QR
- Prepara il profilo del telefono (IP dedicato, es.
10.0.0.3/24):
[Interface]
Address = 10.0.0.3/24
PrivateKey = <PHONE_PRIVATE_KEY>
DNS = 1.1.1.1, 1.0.0.1
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = <SERVER_IP_PUBBLICO>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
- Aggiungi al server il peer dello smartphone:
[Peer]
# Smartphone
PublicKey = <PHONE_PUBLIC_KEY>
AllowedIPs = 10.0.0.3/32
- Genera il QR code e scansiona dall’app ufficiale:
sudo qrencode -t ansiutf8 < /etc/wireguard/clients/phone.conf
Importante: Ogni dispositivo deve avere chiavi e IP univoci (es. 10.0.0.4, 10.0.0.5…). Non condividere lo stesso profilo tra device.
Routing: full‑tunnel vs split‑tunneling
Full‑tunnel (AllowedIPs = 0.0.0.0/0, ::/0): tutto il traffico del client passa nella VPN e “esce” su Internet con l’IP del server. Semplice e ideale per privacy e per far rispettare policy centralizzate (DNS, filtraggio).
Split‑tunneling: instradi solo reti/subnet specifiche (es. 10.0.0.0/24) lasciando il resto del traffico fuori dal tunnel. Riduce utilizzo banda del server e minimizza problemi con servizi che bloccano IP di hosting/VPN.
| Modalità | Pro | Contro |
|---|---|---|
| Full‑tunnel | Privacy massima, semplice da capire | Alcuni siti possono bloccare IP di hosting; più banda sul server |
| Split‑tunneling | Meno blocchi, meno banda | Configurazione più fine; alcune app possono “uscire” fuori VPN |
Coesistenza con Apache e best practice
- Nessun conflitto porte: Apache usa TCP 80/443; WireGuard usa UDP 51820.
- Firewall: consenti 80/443 TCP e 51820 UDP. Se usi Firewalld, mantieni il masquerade sulla zona public.
- DNS interni: puoi pubblicare un host solo interno (es.
intranet.local) e risolverlo via DNS forniti dal server VPN. - Virtualmin/Panel: se amministri Firewalld via pannello, verifica che non sovrascriva le regole manuali.
Troubleshooting avanzato (casi reali)
1) Packet filtered ping 8.8.8.8 dal client
- Controlla che il client abbia default route via wg0 in full‑tunnel:
ip route. - Verifica NAT sul server:
iptables -t nat -vnL(regola MASQUERADE sueth0per10.0.0.0/24). - Assicurati che
net.ipv4.ip_forward=1sia attivo (sysctle file in/etc/sysctl.d). - Firewalld/UFW: consentire
51820/udpe forwardingwg0↔eth0.
2) wg-quick@wg0 fallisce con “wg0 already exists”
Il dispositivo è già presente. Esegui: sudo wg-quick down wg0 || true, poi sudo wg-quick up wg0. In caso di stallo: ip link delete wg0.
3) resolvconf: command not found sul client
Alcuni script di wg-quick provano a invocarlo quando definisci DNS= nell’[Interface]. Installa resolvconf (o rimuovi temporaneamente la direttiva DNS): sudo apt install resolvconf.
4) Firewalld e zone “trusted/public” che sovrascrivono iptables
Verifica il ruleset nft: sudo nft list ruleset. Se hai creato regole via Firewalld GUI/Virtualmin, assicurati che wg0 sia nella zona corretta e che il masquerade sia attivo sulla zona WAN.
5) SaveConfig = true aggiunge Endpoint lato server
È normale: al wg-quick down/up il file può essere riscritto con lo stato runtime, incluso l’IP/porta dinamici del client. Per evitare confusione, non usare SaveConfig sul server e gestisci i peer manualmente.
6) Lock‑out SSH dopo aver messo AllowedIPs=0.0.0.0/0 su un peer server‑side
Non inserire mai sul server un peer con AllowedIPs=0.0.0.0/0 se quel peer non è un gateway reale. Potresti creare rotte indesiderate e tagliarti l’accesso. In caso di lock‑out su provider cloud, usa la rescue mode, monta il disco e correggi wg0.conf.
7) Android: “Servizio VPN non autorizzato”
Concedi il permesso all’app WireGuard (impostazioni → Rete & Internet → VPN). Alcune ROM richiedono di sbloccare l’avvio della VPN on‑demand.
8) NetworkManager/GUI non salva la PrivateKey
È spesso mascherata. Verifica il file reale in /etc/wireguard/. In alternativa importa/esporta direttamente un .conf.
9) DNS non risolve con la VPN attiva
- Testa con IP (es.
ping 8.8.8.8) per separare routing vs DNS. - Imposta
DNS=nel client oppure configura un resolver interno sulla VPN. - Verifica che il sistema DNS sia applicato (NetworkManager,
resolvconf,systemd-resolved).
10) Siti che bloccano il traffico via VPN
Molti servizi controllano ASN/IP reputation, firme di hosting, pattern di traffico e liste note di endpoint VPN/Proxy. Per ridurre blocchi, valuta lo split‑tunneling o usa un IP residenziale per l’uscita Internet.
Sicurezza & hardening
- Conserva la chiave privata del server solo su disco con permessi
600. - Usa chiavi e IP univoci per ogni peer (revoca semplice).
- Limita
AllowedIPsdei peer ai minimi indispensabili. - Valuta un resolver DNS locale (Unbound/Bind) dietro la VPN.
- Monitora con
wg show,journalctl -u wg-quick@wg0e log firewall.
FAQ
Posso usare WireGuard e Apache sullo stesso server?
Sì. Apache usa TCP 80/443; WireGuard usa UDP 51820. Basta aprire entrambe le porte.
Full‑tunnel obbligatorio?
No. Puoi scegliere split‑tunneling definendo in AllowedIPs solo le subnet interne.
Quanti peer posso aggiungere?
Molti (limite pratico: risorse server e gestione). Ogni peer ha chiavi/IP univoci.
Serve IPv6?
Opzionale. Se vuoi full‑tunnel anche per IPv6 aggiungi ::/0 nel client e abilita forward/NAT IPv6.




