Vai al contenuto

WireGuard su Android e PC: come entrare nella rete di casa da fuori

Illustrazione 3D di uno smartphone connesso a distanza al router di casa.
Immagine generata con IA

Un server Linux acceso in casa può fare da ingresso alla rete domestica per telefono e PC, da qualsiasi connessione. WireGuard cifra i pacchetti IP e li trasporta su UDP. La guida va dall’installazione sul server Debian o Ubuntu al tunnel attivo su Android, iOS, Windows, macOS e Linux. Serve poter aprire una porta UDP sul router. I comandi e i file di configurazione vengono dalla documentazione ufficiale, elencata in fondo.

La configurazione del server segue la Debian Wiki ed è scritta per Debian, con una sessione di root. Per Ubuntu le pagine ufficiali usate riportano solo il comando di installazione. Dopo l’installazione i passaggi richiedono una shell di root, perché senza non si entra in /etc/wireguard. Su Ubuntu apri una shell di root prima di generare le chiavi.

Cosa serve

  • Un server di casa con Debian e accesso come root, oppure con Ubuntu e sudo.
  • Un kernel con WireGuard. WireGuard è integrato nel kernel Linux dalla versione 5.6. Sui kernel precedenti serve un modulo aggiuntivo o un backport. Per questa guida usa Debian 13: se hai una versione precedente a Bullseye, aggiorna prima il sistema, perché i vecchi backports, incluso buster-backports, sono archiviati.
  • Il pacchetto iptables sul server, perché lo usano le regole PostUp e PostDown.
  • L’accesso al pannello del router, per inoltrare una porta UDP verso il server.
  • Le app ufficiali sui client. Per Windows c’è un programma di installazione per le versioni 10, 11, 2016, 2019, 2022 e 2025. Per macOS e iOS l’app è sull’App Store. Per Android è sul Play Store oppure come file APK. Su un PC Linux serve il pacchetto wireguard.

Prima di iniziare: porta sul router, CGNAT e IP dinamico

Il client raggiunge il server attraverso il campo Endpoint: indirizzo pubblico di casa seguito da :51820. Il router deve avere un indirizzo pubblico e inoltrare la porta UDP 51820 al server.

Con la CGNAT il router non ha un indirizzo pubblico suo: l’operatore lo condivide fra più clienti. Aprire la porta non basta: questa configurazione non funziona. Se non sai come è configurata la linea, chiedilo all’operatore prima di cominciare.

Se l’indirizzo pubblico è tuo ma cambia nel tempo, l’Endpoint dei client smette di funzionare a ogni cambio. In quel caso puoi usare come Endpoint un nome di dominio tenuto aggiornato da un servizio di DNS dinamico. Sul client Linux con wg-quick, se l’IP cambia mentre il tunnel è attivo, riavvia il tunnel dopo l’aggiornamento del DNS oppure configura lo script reresolve-dns fornito dal progetto.

Gli esempi riprendono la rete 192.168.11.0/24 della Debian Wiki:

  • server: chiavi in /etc/wireguard, indirizzo 192.168.11.1;
  • PC Linux: cartella my_client1, indirizzo 192.168.11.2;
  • telefono: cartella my_client2 (solo con l’Alternativa B), indirizzo 192.168.11.3;
  • PC Windows o Mac: cartella my_client3, indirizzo 192.168.11.4.

Due dispositivi non devono mai avere la stessa chiave o lo stesso indirizzo.

Installare WireGuard sul server Debian o Ubuntu

Il pacchetto wireguard porta con sé wireguard-tools, con i comandi wg e wg-quick. Su Debian, come root:

apt install wireguard

Su Ubuntu:

sudo apt install wireguard

Su Debian 13 wireguard-tools raccomanda nftables oppure iptables, in alternativa: l’installazione può portare il primo e lasciare fuori il secondo. Controlla che iptables sia installato e, se manca, installalo con apt. Senza, le regole PostUp falliscono e il servizio non parte.

Da qui in poi lavora in una shell di root. Il cambio di cartella con cd e il comando fra parentesi tonde li esegue la shell: con sudo davanti non funzionano.

Generare le chiavi del server in /etc/wireguard

Ogni dispositivo ha una chiave privata, che resta lì, e una pubblica, che va nella configurazione dell’altro capo del tunnel. Entra nella cartella di configurazione:

cd /etc/wireguard/

Genera la coppia di chiavi del server:

( umask 0077 && wg genkey | tee privatekey | wg pubkey > publickey )

Con umask 0077 i file nuovi sono leggibili solo dal proprietario. Nella cartella compaiono privatekey e publickey. Proteggi privatekey: con quel file chiunque può farsi passare per il tuo server. Non incollarlo in chat, email o note sincronizzate.

Preparare le chiavi e il file di ogni client

Ogni client ha la sua cartella dentro /etc/wireguard. Comincia dal PC Linux. Crea la cartella:

mkdir my_client1

Entra nella cartella:

cd my_client1

Genera la coppia di chiavi del client:

( umask 0077 && wg genkey | tee privatekey | wg pubkey > publickey )

Per il PC Windows o Mac torna in /etc/wireguard con il comando cd del passaggio precedente e ripeti i tre comandi con my_client3. Fai lo stesso con my_client2 se per il telefono scegli l’Alternativa B.

Ogni client ha un suo file, per esempio /etc/wireguard/my_client1/client.conf, con queste righe:

  • [Interface]
  • PrivateKey = CHIAVE_PRIVATA_DEL_CLIENT: il contenuto del privatekey di quel client.
  • Address = 192.168.11.2/24: .2 per my_client1, .3 per il telefono, .4 per my_client3.
  • DNS = 192.168.11.1: solo se sul server gira un resolver DNS; altrimenti indica un resolver IPv4 raggiungibile attraverso il tunnel, per esempio quello del router di casa. Su Windows, con il singolo peer e AllowedIPs = 0.0.0.0/0, il kill switch blocca il traffico fuori dal tunnel: prima di attivarlo configura un DNS raggiungibile attraverso la VPN. Sul client Linux con wg-quick serve inoltre un comando resolvconf compatibile, fornito per esempio dal pacchetto openresolv su Debian. Se manca, predisponilo prima di avviare il tunnel.
  • [Peer]
  • PublicKey = CHIAVE_PUBBLICA_DEL_SERVER: il contenuto di /etc/wireguard/publickey, uguale per tutti.
  • AllowedIPs = 0.0.0.0/0
  • Endpoint = IP_PUBBLICO_O_NOME_DNS:51820
  • PersistentKeepalive = 20

Per il telefono la Debian Wiki descrive tre strade:

  • Alternativa A: crei la configurazione direttamente nell’app, poi trasferisci al server la chiave pubblica del telefono. La chiave privata nasce sul telefono e resta lì. La cartella my_client2 non serve, ma il telefono ha comunque il suo indirizzo e il suo [Peer] nel server.
  • Alternativa B: scrivi sul server il file del client con i dati di my_client2, lo metti in un archivio .zip, lo trasferisci sul telefono e lo importi nell’app.
  • Alternativa C: la wiki indica come metodo più sicuro l’importazione da QR code generato con qrencode. Qrencode non fa parte di WireGuard e questa guida non lo tratta.

Con l’Alternativa B, e con il file per Windows o macOS, viaggia anche la chiave privata. Trasferisci il file su un canale che controlli e cancellalo dal dispositivo dopo l’importazione.

Scrivere wg0.conf sul server e attivare l’inoltro IPv4

Crea /etc/wireguard/wg0.conf con un editor. Il nome del file è anche il nome dell’interfaccia. Le righe:

  • [Interface]
  • Address = 192.168.11.1/24
  • SaveConfig = true
  • PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  • PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
  • ListenPort = 51820
  • PrivateKey = CHIAVE_PRIVATA_DEL_SERVER: il contenuto di /etc/wireguard/privatekey.
  • [Peer] con PublicKey = CHIAVE_PUBBLICA_DI_MY_CLIENT1 e AllowedIPs = 192.168.11.2/32.
  • [Peer] con PublicKey = CHIAVE_PUBBLICA_DEL_TELEFONO e AllowedIPs = 192.168.11.3/32.
  • [Peer] con PublicKey = CHIAVE_PUBBLICA_DI_MY_CLIENT3 e AllowedIPs = 192.168.11.4/32.

Ogni [Peer] porta la chiave pubblica di un solo dispositivo; il /32 coincide con il suo Address. Secondo la man page di wg-quick, PostUp e PostDown sono comandi eseguiti da bash dopo l’avvio e dopo lo spegnimento dell’interfaccia; %i diventa il nome dell’interfaccia. La regola MASQUERADE fa uscire il traffico dei client da eth0 con l’indirizzo del server. Sostituisci eth0 con l’interfaccia che collega il server al router.

Con SaveConfig = true il file viene riscritto con lo stato dell’interfaccia allo spegnimento. Le modifiche fatte al file prima dello spegnimento vengono sovrascritte.

I client usano AllowedIPs = 0.0.0.0/0 e raggiungono la rete di casa attraverso il server: serve l’inoltro IPv4. Senza, il client non vede gli altri dispositivi di casa e perde la connettività IPv4 finché il tunnel è attivo. La Debian Wiki nota che per una VPN di base se ne può forse fare a meno: vale solo se i client parlano con il solo server, con AllowedIPs = 192.168.11.0/24.

Aggiungi la riga net.ipv4.ip_forward = 1 a /etc/sysctl.conf, come indica la wiki. Su Debian 13 systemd-sysctl non legge più quel file all’avvio, secondo le note di rilascio: crea anche /etc/sysctl.d/90-wireguard.conf con la stessa riga, così l’inoltro resta attivo dopo un riavvio.

Il comando che segue cambia il comportamento di rete del server: applica subito le impostazioni di /etc/sysctl.conf e da quel momento il server inoltra i pacchetti fra le sue interfacce. Prima controlla che la riga sia scritta correttamente e che il resto del file sia rimasto com’era.

sysctl -p

Avviare il tunnel sul server e farlo partire all’avvio

Il servizio wg-quick@wg0 legge wg0.conf e crea l’interfaccia. All’avvio le regole PostUp modificano il firewall del server e il server ascolta sulla porta UDP 51820. Prima controlla di aver sostituito eth0: con un nome sbagliato il traffico dei client non arriva alla rete di casa. Avvia il servizio:

systemctl start wg-quick@wg0

Abilitalo all’avvio del sistema:

systemctl enable wg-quick@wg0

Controlla l’interfaccia:

ip a show wg0

Deve comparire wg0 con l’indirizzo 192.168.11.1/24.

Per aggiungere un client o cambiare wg0.conf:

  1. ferma il servizio wg-quick@wg0 con systemctl;
  2. modifica il file;
  3. avvia di nuovo il servizio con systemctl start.

Se modifichi il file con il servizio attivo, l’arresto lo riscrive e la modifica va persa.

Aprire la porta UDP 51820 sul router

Con questa regola il server diventa raggiungibile da internet sulla porta 51820. WireGuard scarta i pacchetti che non si autenticano con le chiavi configurate. Inoltra solo quella porta, solo verso il server. Controlla l’IP locale del server prima di salvare: con l’indirizzo sbagliato esponi un altro dispositivo di casa.

Il percorso cambia da router a router. Cerca la voce per l’inoltro delle porte, spesso chiamata port forwarding. Crea una regola con protocollo UDP, porta esterna e interna 51820, destinazione l’IP locale del server. Assegna al server un indirizzo locale fisso o una prenotazione DHCP: la regola non segue il server se il suo IP cambia.

Collegare Android, iOS, Windows e macOS con le app ufficiali

Scarica l’app dalla pagina ufficiale di installazione:

  • Android: dal Play Store oppure come file APK.
  • iOS: dall’App Store.
  • Windows: programma di installazione per 10, 11, 2016, 2019, 2022 e 2025; sulla pagina ci sono anche i pacchetti MSI.
  • macOS: dall’App Store.

Con l’Alternativa A crea un tunnel nuovo nell’app e inserisci i campi del file client con i dati del telefono. Poi porta sul server la chiave pubblica che l’app associa al tunnel. Sul server ferma il servizio, aggiungi il [Peer] con quella chiave e AllowedIPs = 192.168.11.3/32, riavvia il servizio. Con l’Alternativa B importa nell’app l’archivio .zip di my_client2.

Su Windows e macOS usa il file di my_client3, mai quello di un altro dispositivo. Le pagine consultate non descrivono le schermate delle app desktop: cerca la funzione per importare un tunnel da file, oppure per crearne uno vuoto e incollarci le righe. Su ogni piattaforma il collegamento parte quando attivi il tunnel nell’app.

Collegare un PC Linux

Sul PC installa il pacchetto, come root. Su Ubuntu vale la forma con sudo vista prima.

apt install wireguard

Crea sul PC /etc/wireguard/wg0.conf con il file client di my_client1. Trasferisci la chiave privata con le stesse cautele degli altri file.

AllowedIPs decide quale traffico entra nel tunnel. Con 0.0.0.0/0 wg-quick imposta il tunnel come percorso predefinito per IPv4. La guida non configura IPv6, che può continuare a passare fuori dal tunnel. Per instradare solo il traffico verso casa scrivi un elenco separato da virgole, per esempio 192.168.11.0/24 e la sottorete di casa indicata dal router.

PersistentKeepalive serve quando il client è dietro NAT o un firewall. Il Quick Start di WireGuard indica 25 secondi come intervallo adatto a molti firewall; la Debian Wiki usa 20.

Il comando che segue cambia la connessione del PC. Con 0.0.0.0/0 il traffico IPv4 passa dal server di casa: se il server non risponde, le connessioni IPv4 possono smettere di funzionare finché non fermi il tunnel con systemctl. Non è garantito il blocco completo di internet, perché IPv6 resta fuori dalla configurazione. Avvia il tunnel:

systemctl start wg-quick@wg0

Verificare la connessione e tornare indietro

Sul server o sul PC Linux mostra lo stato del tunnel:

wg show wg0

Ogni peer collegato deve avere un handshake recente e dati trasferiti in entrata e in uscita. Un peer senza handshake non ha raggiunto il server: ricontrolla chiavi, Endpoint e regola sul router. Per l’indirizzo dell’interfaccia:

ip addr show dev wg0

Per tornare indietro sul server:

  1. ferma il servizio wg-quick@wg0 e disabilitane l’avvio automatico con systemctl; allo spegnimento PostDown toglie le regole iptables;
  2. rimuovi il pacchetto wireguard con apt;
  3. elimina dal router la regola sulla porta 51820;
  4. se l’inoltro non serve più, togli la riga net.ipv4.ip_forward = 1 da /etc/sysctl.conf e da /etc/sysctl.d/90-wireguard.conf.

Se qualcosa va storto

  • Debian precedente a Bullseye: aggiorna prima il sistema. I vecchi backports, incluso buster-backports, sono archiviati e non si abilitano seguendo le istruzioni per i repository correnti.
  • Il modulo non si carica: con kernel.modules_disabled = 1, modprobe può restituire modprobe: ERROR: could not insert 'wireguard': Operation not permitted. La Debian Wiki indica di creare /etc/modules-load.d/wireguard.conf con il contenuto wireguard e riavviare.
  • Le modifiche a wg0.conf spariscono: è l’effetto di SaveConfig = true. Ferma il servizio, modifica il file, riavvialo.

Documentazione di riferimento

Pagine consultate il 28 ottobre 2026.

Leggi anche