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.conf compatto.
  • 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

  1. 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
  1. Aggiungi al server il peer dello smartphone:
[Peer]
# Smartphone
PublicKey = <PHONE_PUBLIC_KEY>
AllowedIPs = 10.0.0.3/32
  1. 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àProContro
Full‑tunnelPrivacy massima, semplice da capireAlcuni siti possono bloccare IP di hosting; più banda sul server
Split‑tunnelingMeno blocchi, meno bandaConfigurazione 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 su eth0 per 10.0.0.0/24).
  • Assicurati che net.ipv4.ip_forward=1 sia attivo (sysctl e file in /etc/sysctl.d).
  • Firewalld/UFW: consentire 51820/udp e forwarding wg0↔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 AllowedIPs dei peer ai minimi indispensabili.
  • Valuta un resolver DNS locale (Unbound/Bind) dietro la VPN.
  • Monitora con wg show, journalctl -u wg-quick@wg0 e 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.

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *