WireGuard su Raspberry Pi 5: guida completa passo-passo dall’installazione alla misurazione della velocità

In breve

Guida passo-passo per principianti all’installazione di un server WireGuard su Raspberry Pi 5: dalla preparazione e configurazione ai test di carico e alla velocità reale. In 2-3 ore configurerai il tuo VPN personale, verificherai la larghezza di banda e ottimizzerai le prestazioni.

WireGuard su Raspberry Pi 5: guida completa passo-passo dall’installazione alla misurazione della velocità

Introduzione

In questa guida passo-passo installerai da solo un server VPN veloce e affidabile su Raspberry Pi 5 usando WireGuard, configurerai routing e crittografia, collegherai clienti da computer e telefono, testerai la velocità reale, effettuerai test di carico e imparerai a diagnosticare e risolvere problemi comuni. Alla fine avrai un tunnel VPN personale per accedere in sicurezza alla tua rete domestica, criptare il traffico in reti pubbliche e bypassare restrizioni.

A chi è rivolta questa guida. A utenti principianti di Raspberry Pi che non hanno mai configurato una VPN e a chi ha già dimestichezza col terminale e vuole una guida dettagliata più qualche trucco avanzato. Spieghiamo ogni passaggio chiaramente, aggiungendo blocchi di ottimizzazione per chi vuole spremere il massimo in velocità e stabilità.

Cosa sapere prima. Nozioni base su Raspberry Pi e disponibilità a inserire comandi nel terminale. Non servono conoscenze approfondite di Linux, ma attenzione è fondamentale. Spieghiamo i concetti chiave in modo semplice.

Quanto tempo serve. Installazione del sistema e aggiornamenti prendono 20–40 minuti. Configurazione base di WireGuard e aggiunta dei primi clienti 30–60 minuti. Configurazione del router e test 20–40 minuti. In tutto prendi 2–3 ore eseguendo tutto con calma e cura.

Preparazione preliminare

Strumenti e accessi necessari. Ti serve un Raspberry Pi 5, alimentatore USB-C da 27 W o uno 5V 5A di qualità, microSD da 32–128 GB classe almeno A1, cavo di rete per collegare al router di casa, computer con Raspberry Pi Imager installato, accesso al router per aprire porte e credenziali del provider per verificare eventuale CGNAT. Utile avere monitor e tastiera per il primo avvio, ma si può fare anche headless.

Requisiti di sistema. Consigliata Raspberry Pi OS 64-bit (Bookworm o superiore), kernel con supporto WireGuard attivo di default. Per velocità fino a 1 Gbps basta la build standard. Per stabilità meglio collegare il Pi via cavo, non Wi-Fi. Su client qualunque WireGuard aggiornato per mobile o desktop va bene.

Cosa scaricare e installare. Sul computer Raspberry Pi Imager. Prepara immagine Raspberry Pi OS Lite 64-bit per ambiente minimale. Su Raspberry Pi installeremo wireguard-tools, iperf3 per test, nftables o iptables-nft per NAT e qrencode per aggiungere clienti mobili facilmente.

Backup. Se sulla scheda hai dati o sistema importanti, fai un backup con un tool a piacere. Dopo la configurazione di WireGuard spieghiamo come salvare configurazioni per ripristini rapidi su nuova scheda in caso di guasti.

Concetti base

Termini chiave spiegati semplice. WireGuard è un protocollo VPN moderno che crea un tunnel criptato tra dispositivi. Il server è il tuo Raspberry Pi 5 che accetta connessioni. Il client è telefono o notebook che si collega al server. Le chiavi sono coppie private e pubbliche per crittografia e autenticazione. L’interfaccia wg0 è un adattatore virtuale di rete attraverso cui passa il traffico criptato. AllowedIPs è la lista di subnet e indirizzi instradati tramite il tunnel.

Principi di funzionamento. Ogni nodo ha chiavi fisse e un indirizzo in una subnet virtuale, tipo 10.6.0.0/24. Il client invia pacchetti UDP all’IP pubblico e porta del server. Il server decripta e manda il traffico su internet o rete locale, secondo le impostazioni. I percorsi sul client sono definiti in AllowedIPs, sul server tramite regole di routing e NAT.

Cosa capire prima di iniziare. La velocità di WireGuard dipende da CPU, MTU, qualità della rete e routing tra provider. Raspberry Pi 5 è potente abbastanza per avvicinarsi a 1 Gbps in LAN e centinaia di Mbps su internet, se canale e routing sono favorevoli. Impostazione corretta di MTU e NAT è fondamentale per stabilità e performance.

Passo 1: Preparare Raspberry Pi 5 e sistema operativo

Obiettivo

Preparare una fresh install 64-bit di Raspberry Pi OS Lite, attivare SSH e configurare parametri base per iniziare l’installazione di WireGuard.

Istruzioni passo-passo

  1. Apri Raspberry Pi Imager sul computer. Seleziona Raspberry Pi OS Lite (64-bit).
  2. Seleziona la microSD come device. Verifica che sia quella giusta per evitare di cancellare dati su altri supporti.
  3. Clicca sulle impostazioni (icona ingranaggio). Abilita «Enable SSH», scegli «Use password authentication» o inserisci la chiave SSH pubblica. Imposta nome utente, es. «pi» e password complessa di almeno 12 caratteri.
  4. Imposta hostname, es. «rpi5-wg». Scegli paese, lingua e layout tastiera. Attiva Wi-Fi solo se non usi Ethernet, inserisci SSID e password. Consigliato Ethernet.
  5. Clicca «Save» poi «Write». Attendi completamento scrittura e verifica. Prenderà 3–10 minuti.
  6. Inserisci la scheda nel Raspberry Pi 5. Collega cavo Ethernet al router e alimentazione al Pi. Attendi boot (20–60 secondi).
  7. Individua IP del Pi. Controlla client list del router o usa app per scansione rete sul telefono. Spesso sarà 192.168.1.xx.
  8. Connettiti via SSH: «ssh pi@192.168.1.xx». Alla prima connessione accetta fingerprint e inserisci password.
  9. Aggiorna sistema: «sudo apt update && sudo apt full-upgrade -y». Poi riavvia: «sudo reboot» e riconnetti via SSH.
  10. Installa firmware e tool più recenti: «sudo rpi-eeprom-update -a». Se richiesto, riavvia con «sudo reboot».

⚠️ Attenzione: Non spegnere o staccare alimentazione durante scrittura scheda o aggiornamento firmware, può danneggiare file system della microSD.

Consiglio: Dai al Pi un hostname unico per non confonderti se hai più dispositivi in rete.

✅ Verifica: «uname -m» deve mostrare «aarch64», «cat /etc/os-release» conferma Raspberry Pi OS Bookworm. SSH deve connettersi senza errori.

Risultato atteso. Sistema 64-bit fresco di Raspberry Pi OS Lite, SSH stabile, device visibile e raggiungibile in rete locale.

Problemi comuni e soluzioni. Se SSH non funziona, controlla che sia abilitato in Imager. Se il device non appare, verifica cavo Ethernet e porta, prova un’altra porta del router. Se il sistema non parte, riscrivi la scheda o prova un’altra microSD.

Passo 2: Configurazione rete, IP statico e accesso SSH

Obiettivo

Assegnare IP locale statico a Raspberry Pi 5, impostare fuso orario e verificare accesso SSH stabile. Importante per port forwarding e gestione futura.

Istruzioni passo-passo

  1. Imposta fuso orario: «sudo raspi-config», poi «Localization Options» e scegli la tua zona. Aiuta nei log e diagnosi.
  2. Verifica interfaccia usata: «ip -4 addr». Di solito Ethernet è «eth0» con indirizzo 192.168.x.y.
  3. Assegna IP statico tramite prenotazione DHCP nel router. Trova il MAC con «ip link show eth0» e crea riserva IP tipo 192.168.1.10. È l’opzione più semplice e raccomandata.
  4. Se non puoi fare prenotazioni DHCP, configura IP statico localmente. Modifica «sudo nano /etc/dhcpcd.conf» aggiungendo:
    interface eth0
    static ip_address=192.168.1.10/24
    static routers=192.168.1.1
    static domain_name_servers=1.1.1.1 8.8.8.8
    Salva e riavvia servizio con «sudo systemctl restart dhcpcd».
  5. Verifica connessione internet: «ping -c 3 1.1.1.1» e «ping -c 3 debian.org». Se risponde, rete OK.
  6. Riconnettiti via SSH all’IP statico: «ssh pi@192.168.1.10».

Consiglio: Appunta l’IP statico e attaccala sulla scocca del Pi per risparmiarti ricerche successive.

✅ Verifica: «ip route» deve mostrare gateway di default verso router, «ip -4 addr show eth0» deve avere l’IP statico scelto. SSH stabile sull’IP nuovo.

Risultato atteso. Raspberry Pi ha IP statico, internet funziona, orario corretto, pronta la configurazione per WireGuard.

Problemi comuni e soluzioni. Se internet non raggiungibile, verifica gateway e DNS. Se IP statico crea conflitti, scegli un indirizzo diverso nel range della tua rete.

Passo 3: Installare WireGuard e preparare kernel

Obiettivo

Installare strumenti WireGuard, verificare kernel e modulo WireGuard, preparare il sistema per creare il tunnel.

Istruzioni passo-passo

  1. Aggiorna lista pacchetti: «sudo apt update».
  2. Installa WireGuard e strumenti: «sudo apt install -y wireguard wireguard-tools qrencode iperf3 nftables resolvconf». Non serve wireguard-dkms su kernel aggiornato, modulo è integrato.
  3. Controlla modulo: «modprobe wireguard» poi «lsmod | grep wireguard». Se appare «wireguard», modulo caricato.
  4. Attiva auto-start servizi: «sudo systemctl enable nftables» e «sudo systemctl enable systemd-resolved». Quest’ultimo aiuta DNS.
  5. Verifica versione tool: «wg --version». Deve mostrare versione wg-quick e wireguard-tools.

⚠️ Attenzione: Evita di installare contemporaneamente iptables-legacy e nftables con regole in conflitto. Usiamo nftables, più moderno e funzionante in Debian Bookworm.

Consiglio: Se aggiorni kernel, riavvia Raspberry Pi prima di testare modulo per evitare problemi di caricamento.

✅ Verifica: «wg» senza opzioni non deve mostrare errori, «lsmod | grep wireguard» mostra modulo. Nessun errore all’installazione.

Risultato atteso. WireGuard installato, modulo caricato, strumenti da linea di comando pronti, nftables abilitato per NAT.

Problemi comuni e soluzioni. Se modulo non si carica, controlla versione kernel con «uname -r» e aggiorna sistema. Se pacchetto manca, verifica fonti in «/etc/apt/sources.list» e ripeti «sudo apt update».

Passo 4: Creazione chiavi, piano indirizzi e configurazione base wg0

Obiettivo

Generare chiavi per server, definire schema indirizzi VPN e creare configurazione dell’interfaccia wg0 per avviare il tunnel server.

Istruzioni passo-passo

  1. Crea cartella per configurazioni e chiavi: «sudo mkdir -p /etc/wireguard && sudo chmod 700 /etc/wireguard».
  2. Genera chiavi server: «umask 077; wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key > /dev/null». Chiavi avranno permessi corretti.
  3. Visualizza chiave privata: «sudo cat /etc/wireguard/server_private.key». Copiala, serve per configurazione. Chiave pubblica «sudo cat /etc/wireguard/server_public.key» serve ai client.
  4. Scegli subnet VPN. Usare 10.6.0.0/24 con server 10.6.0.1. È una rete privata libera senza conflitti con subnet casalinghe comuni.
  5. Crea configurazione interfaccia: «sudo nano /etc/wireguard/wg0.conf». Inserisci:
    [Interface]
    Address = 10.6.0.1/24
    ListenPort = 51820
    PrivateKey = TUA_CHIAVE_PRIVATA
    SaveConfig = true
    Tieni PostUp/PostDown vuoti per ora, configureremo NAT al passo successivo.
  6. Imposta permessi stretti per il file: «sudo chmod 600 /etc/wireguard/wg0.conf».
  7. Abilita forwarding IP IPv4: «echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-sysctl.conf». Applica con «sudo sysctl --system» e verifica «sysctl net.ipv4.ip_forward» che deve mostrare «1».
  8. Avvia prima volta interfaccia: «sudo wg-quick up wg0». Se tutto ok, «ip addr show wg0» mostrerà interfaccia con 10.6.0.1/24.
  9. Abilita auto-start: «sudo systemctl enable wg-quick@wg0».

Consiglio: Puoi cambiare nome interfaccia da wg0 a altro, ma per semplicità lasciamo wg0. Se prevedi più tunnel, usa wg1, wg2, ecc.

✅ Verifica: «wg show» mostra wg0 con ListenPort 51820 e chiave pubblica server. Nessun errore in «wg-quick up wg0». «ip a» mostra wg0 UP.

Risultato atteso. Interfaccia WireGuard del server attiva, ascolta UDP 51820, forwarding abilitato, configurazione base pronta per aggiungere client.

Problemi comuni e soluzioni. Errore «RTNETLINK answers: File exists» indica conflitti di routes residue, esegui «sudo wg-quick down wg0» e riavvia. Se «Cannot find device wg0», controlla modulo e configurazione.

Passo 5: Routing, NAT e port forwarding sul router

Obiettivo

Attivare NAT con nftables per permettere ai client di uscire su internet tramite server, aprire porta UDP 51820 sul router perché il server sia raggiungibile dall’esterno.

Istruzioni passo-passo

  1. Identifica interfaccia esterna: «ip route get 1.1.1.1». Troverai «dev eth0» o analoghi, che è l’interfaccia esterna (es. eth0).
  2. Crea configurazione base nftables: «sudo nano /etc/nftables.conf». Inserisci:
    flush ruleset
    table inet wg {
    chain prerouting { type nat hook prerouting priority -100; }
    chain input { type filter hook input priority 0; policy accept; }
    chain forward { type filter hook forward priority 0; policy accept; }
    chain output { type filter hook output priority 0; policy accept; }
    chain postrouting { type nat hook postrouting priority 100; }
    }
    Salva.
  3. Nel chain postrouting aggiungi regola MASQUERADE: «oifname "eth0" ip saddr 10.6.0.0/24 counter masquerade». Cambia eth0 con tua interfaccia esterna.
  4. Carica regole: «sudo nft -f /etc/nftables.conf». Controlla con «sudo nft list ruleset». Devi vedere tabella inet wg e regola MASQUERADE.
  5. Aggiungi PostUp/PostDown su «/etc/wireguard/wg0.conf» sotto [Interface]:
    PostUp = nft -f /etc/nftables.conf
    PostDown = nft flush ruleset
    Questo applica le regole quando attivi o disattivi wg0. Per ora va bene, ma in pratica conviene una gestione più stabile senza flush totale al down.
  6. Riavvia interfaccia: «sudo wg-quick down wg0 || true && sudo wg-quick up wg0». Ricontrolla «nft list ruleset» e «wg show».
  7. Apri porta 51820/UDP sul router. Nel pannello del router cerca Port Forwarding o NAT e crea regola: porta esterna 51820/UDP verso IP interno 192.168.1.10 (IP statico Pi) porta 51820/UDP. Salva.
  8. Verifica porta in ascolto su Pi: «sudo ss -ulnpt | grep 51820». Devi vedere UDP *:51820 aperto.

⚠️ Attenzione: Se il tuo provider usa CGNAT, port forwarding dall’esterno non funziona. Consulta provider per IP pubblico dedicato o usa VPS esterno per tunnel inverso o modalità client-server transit di WireGuard.

Consiglio: Se il router usa UPnP, disattiva UPnP per porta 51820 per evitare conflitti con il forwarding statico.

✅ Verifica: Dentro la rete esegui «nc -u -zv 192.168.1.10 51820». Deve risultare «succeeded» o niente «Permission denied». Fuori dalla rete prova dal cellulare con rete mobile e verifica handshake con «wg show».

Risultato atteso. NAT attivo, traffico client mascherato con IP del Pi, porta UDP 51820 aperta e server accessibile da internet se hai IP pubblico.

Problemi comuni e soluzioni. Se il client non naviga via VPN, controlla net.ipv4.ip_forward=1 e regola MASQUERADE. Se server non raggiungibile da fuori, verifica presenza di doppio NAT (modem+router), metti modem in bridge o configura port forwarding adeguato.

Passo 6: Aggiunta client (telefono, laptop), QR e test iniziale

Obiettivo

Creare configurazioni client, aggiungerle al server come peer, collegare telefono e laptop, verificare che il traffico passi nel tunnel.

Istruzioni passo-passo

  1. Genera chiavi per client1: «wg genkey | tee client1_private.key | wg pubkey | tee client1_public.key». Per sicurezza usa l’utente corrente e limita permessi a 600.
  2. Determina IP pubblico o DNS del server. Se hai IP dinamico, configura DDNS nel router. Per test temporanei usa IP pubblico attuale, puoi sapere con «curl ifconfig.me» da Raspberry Pi.
  3. Crea file client1.conf su Pi:
    [Interface]
    PrivateKey = CHIAVE_PRIVATA_CLIENT
    Address = 10.6.0.2/32
    DNS = 1.1.1.1

    [Peer]
    PublicKey = CHIAVE_PUBBLICA_SERVER
    Endpoint = TUO_IP_O_DNS:51820
    AllowedIPs = 0.0.0.0/0, ::/0
    PersistentKeepalive = 25
    Questo fa passare tutto il traffico del client dentro la VPN.
  4. Aggiungi client al server: modifica «sudo nano /etc/wireguard/wg0.conf» e aggiungi a fine:
    [Peer]
    PublicKey = CHIAVE_PUBBLICA_CLIENT
    AllowedIPs = 10.6.0.2/32
    Salva.
  5. Applica configurazione con «sudo wg addconf wg0 <(wg-quick strip wg0)» oppure riavvia interfaccia «sudo wg-quick down wg0 && sudo wg-quick up wg0».
  6. Genera QR per client mobile: «qrencode -t ansiutf8 < client1.conf». Apparirà QR in console. Nell’app WireGuard su iOS/Android scegli «Create from QR code» e scansiona con la fotocamera del telefono.
  7. Sul laptop installa app ufficiale WireGuard, importa client1.conf e salva profilo.
  8. Attiva tunnel client. Sul telefono abilita connessione, sul laptop clicca «Activate». Sul server «sudo wg show» dovrebbe mostrare «latest handshake» e contatori di traffico in aumento.

Consiglio: Se vuoi che il client usi internet locale e solo la rete domestica passi dalla VPN, cambia AllowedIPs in «10.6.0.0/24, 192.168.1.0/24» rimuovendo 0.0.0.0/0 per split-tunnel.

✅ Verifica: Dal telefono visita siti di controllo IP. Deve mostrare IP pubblico della tua connessione. Ping a 10.6.0.1 e 192.168.1.1 funzionano se hai permessi LAN.

Risultato atteso. Client connessi al server, traffico VPN fluido, contatori in «wg show» crescono, latenza stabile.

Problemi comuni e soluzioni. Se handshake non c’è, controlla porta 51820/UDP sul router e IP pubblico. Se handshake c’è ma internet non va, verifica MASQUERADE nft e ip_forward. Per disconnessioni mobili aumenta PersistentKeepalive a 25–30.

Passo 7: Test velocità, carico, diagnostica colli di bottiglia

Obiettivo

Misurare in modo oggettivo la banda di WireGuard su Raspberry Pi 5, valutare carico CPU, determinare velocità reale in locale e via internet, individuare e risolvere colli di bottiglia.

Istruzioni passo-passo

  1. Installa iperf3 su entrambi i lati. Su Raspberry Pi è già installato. Sul laptop installalo. Avvia server su Pi: «iperf3 -s». Lascia finestra aperta.
  2. Da client connettiti tramite tunnel: «iperf3 -c 10.6.0.1 -P 4 -t 20». L’opzione «-P 4» usa 4 stream paralleli per saturare meglio la linea. Prendi velocità media.
  3. Fai test a stream singolo: «iperf3 -c 10.6.0.1 -P 1 -t 20». Serve per capire prestazioni senza aggregazione flussi.
  4. Controlla carico CPU su Pi: apri altra finestra e digita «top» o «htop». Nota uso core durante test. WireGuard sfrutta multi-thread, Pi 5 con Cortex-A76 2.4 GHz gestisce centinaia di Mbps facilmente.
  5. Misura velocità internet da tunnel. Usa server iperf3 su VPS o endpoint esterno, poi da client fai «iperf3 -c SERVER -P 4 -t 20» con VPN attiva. In alternativa confronta speedtest-cli con e senza VPN per valutare overhead crittografia e routing.
  6. Ottimizza MTU. Prova «sudo ping -M do -s 1380 1.1.1.1» da Pi su internet. Se non ci sono frammentazioni puoi impostare MTU=1420 di default. Se ci sono problemi, riduci MTU in wg0.conf con riga «MTU = 1380» in [Interface]. Riavvia interfaccia.
  7. Aggiorna code qdisc per diminuire bufferbloat: esegui «sudo tc qdisc replace dev eth0 root fq_codel» e «sudo tc qdisc replace dev wg0 root fq_codel». Migliora latenza sotto carico.
  8. Ripeti test iperf3. Confronta dati prima e dopo ottimizzazioni. Verifica stabilità, jitter e picchi.

Consiglio: Per stress test usa «-P 8» e «-t 60». Capirai meglio comportamento sotto carico lungo, eventuale surriscaldamento o throttling se raffreddamento insufficiente.

Consiglio: Attiva governor CPU ad alte prestazioni: «sudo apt install -y cpufrequtils» e «echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils && sudo systemctl restart cpufrequtils». A volte migliora la velocità 5–10% sotto picco.

✅ Verifica: In LAN via tunnel dovrebbe andare a centinaia di Mbps, spesso 700–900 Mbps con stream multipli e MTU corretta. Su internet i valori dipendono dal provider e endpoint remoto. Handshake stabili e assenza di ritrasmissioni iperf3 indicano MTU corretta.

Risultati attesi e "velocità reale". Su Raspberry Pi 5 in LAN WireGuard spesso limita a velocità Ethernet gigabit e TCP stack. Pratica mostra 0.7–0.95 Gbps totali su UDP multi stream con MTU giusta. Via internet i valori sono di norma limitati da colli di bottiglia esterni: peer dei provider e routing. Su buona linea 300–600 Mbps via WireGuard sono normali, a volte sopra 700. Se molto meno, cerca MTU sbagliata, surriscaldamento o CGNAT transit.

Problemi comuni e soluzioni. Se CPU va a 100% su singolo core e velocità bassa, verifica che iperf3 usi più stream e che qdisc non sovraccarichi CPU. Se alto jitter e perdite, controlla cavo, porta e impostazioni offloading con «sudo ethtool -K eth0 tx off rx off gso off gro off tso off», confronta comportamento, ma di solito configurazioni standard sono ok.

Verifica finale

Checklist: cosa deve funzionare. Interfaccia wg0 WireGuard è attiva e si avvia automaticamente. Porta UDP 51820 è aperta sul router. Client si connettono con handshake stabile. Internet è raggiungibile via VPN, DNS risolve correttamente. Con iperf3 ottieni velocità attese per il tuo canale. NAT su nftables funziona, ip_forward è attivo. Nei log non ci sono errori critici.

Come testare. Disattiva Wi-Fi sul telefono, attiva rete mobile, connetti VPN e apri vari siti. Su server esegui «wg show» e guarda ultimo handshake. Da client fai «traceroute 1.1.1.1» e verifica primo hop sia 10.6.0.1. Lancia «iperf3 -c 10.6.0.1 -P 4 -t 20» e controlla velocità. Fai «dig example.com» e valuta tempi DNS.

Indicatori di successo. Nessun timeout nei siti, handshake stabile ogni 20-30 secondi con traffico attivo, velocità coerenti col canale, assenza di disconnessioni occasionali. Nei log di «sudo journalctl -u wg-quick@wg0 -b» minimi avvisi, zero errori.

Errori comuni e soluzioni

  • Problema: client non si connette, niente handshake. Causa: port forwarding errato o CGNAT. Soluzione: verifica NAT nel router, assicurati IP pubblico reale; se CGNAT chiedi IP pubblico o usa VPS esterno come transit.
  • Problema: handshake ma client senza internet. Causa: ip_forward disabilitato o assente MASQUERADE. Soluzione: controlla «sysctl net.ipv4.ip_forward=1», regola nftables in postrouting, riavvia wg0.
  • Problema: nessun accesso LAN. Causa: client ha solo 0.0.0.0/0 senza LAN, firewall router blocca. Soluzione: aggiungi subnet LAN tipo 192.168.1.0/24 in AllowedIPs client, assicurati firewall non blocca traffico interno.
  • Problema: siti parzialmente non raggiungibili o velocità instabile. Causa: MTU errato e frammentazione. Soluzione: testa PMTU con «ping -M do», imposta MTU fra 1380 e 1420 in wg0 e client, di solito 1420 basta.
  • Problema: DNS non risolve via VPN. Causa: configurazione DNS client sbagliata. Soluzione: usa «DNS = 1.1.1.1» o resolver locale server, verifica systemd-resolved attivo e client con «Block untunneled traffic» se serve.
  • Problema: velocità molto inferiore al previsto. Causa: test singolo stream, throttling CPU, canale debole o Pi 5 surriscaldato. Soluzione: usa «-P 4..8» in iperf3, raffredda bene con ventola e dissipatore, attiva governor performance.
  • Problema: tunnel non parte dopo reboot. Causa: servizio non abilitato o PostDown errati. Soluzione: «sudo systemctl enable wg-quick@wg0», controlla «systemctl status wg-quick@wg0», semplifica PostDown, evita flush totale senza ricaricare regole.

Funzionalità aggiuntive

Configurazioni avanzate

  • Split-tunnel per domini. Puoi instradare solo domini aziendali via VPN lasciando il resto diretto. Usa DNS-over-WG e policy routing sul client, anche se WireGuard non filtra domini nativamente e serve software ausiliario client-side.
  • Accesso a più subnet. Aggiungi più reti in AllowedIPs client, tipo 192.168.1.0/24 e 192.168.50.0/24 se hai VLAN multiple. Sul server configura rotte e regole firewall nftables se necessario.
  • Isolamento client. WireGuard di default non fa routing traffico fra client. Per maggiore isolamento non aggiungere rotte incrociate e blocca traffico inter-client in nftables.
  • Accesso tramite nome dominio. Configura DDNS sul router e usa nome in Endpoint client per gestire IP dinamico. Monitora aggiornamenti periodici della voce.
  • Logging e monitoring. Installa Netdata o Prometheus node-exporter per monitorare latenza, traffico e carico. Per controlli semplici usa «wg show» e «nft list ruleset» regolarmente.

Ottimizzazioni

  • MTU "tartaruga". Per reti con frammentazione problematica inizia con MTU=1280 su wg0 e client, aumenta gradualmente fino a 1420 senza perdite.
  • FQ-CoDel su WAN e WG. Applica fq_codel su eth0 e wg0 per combattere bufferbloat, utile specialmente per videochiamate e streaming.
  • Stream paralleli. Per carichi usa più stream TCP, download manager e «-P 4..8» in iperf3 per sfruttare meglio banda.

Altre raccomandazioni

  • Accesso a due fattori. Conserva config dei client in password manager, abilita blocco device. Perdita telefono? Rimuovi subito la chiave da «wg0.conf» e riavvia interfaccia.
  • Backup. Salva «/etc/wireguard» e «/etc/nftables.conf» in archivio criptato. Tieni microSD di riserva preparata. Testa backup regolarmente usando un Pi di scorta o temporaneamente lo stesso.

Consiglio: Se vuoi un VPN personale facile e veloce senza linea di comando, considera soluzioni pronte tipo vpn.how. Offrono server personali con IP dedicato (no shared), supporto WireGuard, OpenVPN, IKEv2, L2TP, SSTP — scegli protocollo adatto. Sono disponibili sedi a Mosca, San Pietroburgo, Amsterdam, Francoforte, Londra, New York, San Jose, Chicago, Singapore, Sydney, Madrid, Helsinki, Stoccolma, Varsavia, Copenaghen e Stavanger. Accettano carte russe (comprese Tinkoff e Ozon), SBP, USDT e BTC. Prezzi da 490 ₽ al giorno e 2490 ₽ al mese con sconti su periodi lunghi, attivazione automatica in 5 minuti, senza log. È comodo quando non vuoi perdere tempo su hardware, backup e monitoraggio: un server fai-da-te su Raspberry Pi dà flessibilità, ma richiede ore di configurazione, aggiornamenti regolari e backup.

FAQ

Domanda: Come capire se il provider usa CGNAT e serve IP pubblico? Risposta: Confronta IP pubblico nel pannello del router e quello mostrato sui siti di verifica IP. Se nel router l’indirizzo è privato (100.64.0.0/10 o 10.0.0.0/8), è CGNAT. In questo caso port forwarding da internet non funziona.

Domanda: Posso usare una porta diversa da 51820? Risposta: Sì, cambia il valore di «ListenPort» e configuralo sul router. A volte i provider filtrano UDP, cambiare porta aiuta.

Domanda: Come aggiungere più client? Risposta: Per ciascuno genera coppia chiavi nuova, assegna indirizzo univoco 10.6.0.X/32, aggiungi peer separato in «wg0.conf» e distribuisci config client. Non usare chiavi duplicate su dispositivi diversi.

Domanda: Cosa fare se ho perso la chiave privata server? Risposta: Genera nuova coppia, aggiorna «wg0.conf» e distribuisci nuova chiave pubblica ai client. Ricorda di aggiornare Endpoint client se cambi porta o nome dominio.

Domanda: Come impedire ai client accesso alla rete domestica, lasciando solo uscita internet? Risposta: Di default non viene instradato traffico LAN. Assicurati che sul server non ci siano rotte statiche verso LAN per client e non inserire subnet LAN in AllowedIPs client.

Domanda: Servono certificati come in OpenVPN? Risposta: No, WireGuard usa crittografia semplice e veloce con chiavi, senza certificati. Questo contribuisce a velocità e facilità d’uso.

Domanda: Come proteggere file di configurazione? Risposta: Imposta permessi 600, mantieni backup criptati, non inviare chiavi private su canali non sicuri. Scambia config client tramite messaggistica sicura o QR sul posto.

Domanda: Posso attivare WireGuard solo quando un client si connette? Risposta: Sì, WireGuard non mantiene connessione continua senza traffico. Però interfaccia wg0 deve essere UP, client eseguiranno handshake quando serve.

Domanda: Come fare per alcuni client che usano tutta la connessione via VPN e altri solo la rete domestica? Risposta: Gestisci client-side con AllowedIPs: quelli a tutto traffico usano «0.0.0.0/0, ::/0», quelli solo rete locale «10.6.0.0/24, 192.168.1.0/24». Nessun cambiamento sul server.

Domanda: Perché iperf3 mostra velocità maggiore del browser? Risposta: iperf3 trasferisce flussi grandi con overhead minimo, mentre browser scaricano limitati da handshake TCP, TLS, parallelismo e policy server. È normale. Considera flussi multipli e test a lungo termine.

Conclusione

Riassunto. Hai preparato Raspberry Pi 5, installato sistema 64-bit aggiornato, attivato SSH e IP statico. Installato WireGuard e tool, generato chiavi, creato configurazione wg0 e abilitato IP forwarding. Configurato NAT con nftables e port forwarding nel router. Aggiunto client, connesso telefono e laptop, verificato tunnel e fatto test iperf3. Ottimizzato MTU e qdisc per stabilità e bassa latenza. Analizzato errori comuni e backup configurazioni.

Prossimi passi. Aggiungi nuovi client, organizza spazio indirizzi, implementa monitoraggio e backup. Se serve, configura accesso multipla subnet e split-tunnel per dispositivi. Aggiorna sistema regolarmente e controlla log.

Dove approfondire. Impara automazione con ansible per distribuire config, scopri policy routing e marcatura traffico per split flessibile, sperimenta multihoming e failover. Studia comportamento con vari qdisc e MTU e adatta alla tua rete. Con queste competenze potrai creare VPN sicure e performanti non solo a casa ma anche in piccoli uffici.

Consiglio: Tieni sempre traccia delle tue configurazioni in un posto unico, magari repository privato, aggiorna commenti in «wg0.conf». Dopo sei mesi ti ringrazierai per la documentazione chiara.

Consiglio: Non trascurare il raffreddamento del Raspberry Pi 5. L’uso costante di crittografia e routing scalda il SoC, e goderti velocità sopra 800 Mbps è più piacevole senza throttling.

Ora il tuo server VPN personale su Raspberry Pi 5 è pronto. Sai come gestirlo, testarlo e ottenere il massimo delle prestazioni. Ottimo lavoro!

Roman Melnikov

Roman Melnikov

Technical Writer and System Administrator

Technical writer and DevOps engineer with 9 years of experience. Created over 50 detailed guides on system configuration and administration. His instructions helped thousands of professionals successfully solve technical tasks. Popular author on Habr and YouTube.
Bauman Moscow State Technical University. Information Systems and Technologies
Technical Documentation DevOps System Administration Linux Docker and Kubernetes CI/CD Infrastructure Automation Cloud Technologies System Monitoring Bash and Python Scripting

Condividi questo articolo: