Come configurare WireGuard tra Raspberry Pi e VPS Hetzner: guida completa 2026

Se hai un Raspberry Pi a casa che fa girare servizi raggiungibili dall’esterno o che effettua chiamate verso API e servizi cloud, ti sarai accorto di un problema: il tuo IP pubblico cambia. La maggior parte degli ISP italiani, infatti, assegna IP dinamici alle utenze residenziali. Questo è un problema quando vuoi che servizi esterni riconoscano sempre il tuo Raspberry Pi con lo stesso indirizzo, ad esempio per whitelisting, accesso SSH stabile, o per servizi che richiedono un IP statico in uscita.

La soluzione che ti mostro in questa guida è semplice ed elegante: instradiamo tutto il traffico in uscita del Raspberry Pi attraverso un tunnel WireGuard verso un VPS Hetzner con IP fisso. In questo modo, ogni richiesta che parte dal Pi appare al mondo esterno come se provenisse dal VPS, garantendoti un IP pubblico stabile e prevedibile a meno di 12€ al mese.

In questo articolo vedremo passo-passo come:

  • Creare e mettere in sicurezza un VPS Hetzner economico
  • Installare e configurare WireGuard sia lato server (VPS) che client (Raspberry Pi)
  • Instradare tutto il traffico in uscita del Pi attraverso il tunnel
  • Verificare che funzioni e gestire il troubleshooting più comune

Tutto il setup è basato su componenti open source, completamente self-hosted, e ti darà il pieno controllo sulla tua infrastruttura. Cominciamo.

Architettura della soluzione

In questa sezione vediamo il quadro generale: quali componenti sono coinvolti, come comunicano tra loro, e quale percorso fa il traffico una volta che il tunnel è attivo.

Componenti coinvolti

Il setup è composto da due macchine:

  • Raspberry Pi (nel mio caso l’ho chiamato RaspberryMichiganMammaMia): è il client WireGuard. Si trova nella tua rete domestica, collegato al router di casa. Può essere qualsiasi modello, dal Pi 3 in su.
  • VPS Hetzner: è il server WireGuard. Ha un IP pubblico fisso e funge da punto di uscita per tutto il traffico del Raspberry Pi. Ho scelto un CPX22 (2 vCPU, 4GB RAM, 80GB SSD) che costa €9,75/mese — più che sufficiente per questo scopo.

Flusso del traffico

Ecco cosa succede quando il Raspberry Pi fa una richiesta verso Internet (ad esempio un curl verso un’API esterna):

  1. La richiesta parte dal Raspberry Pi
  2. Viene instradata nel tunnel WireGuard verso il VPS Hetzner
  3. Il VPS fa NAT (Network Address Translation) e inoltra la richiesta verso Internet usando il suo IP pubblico fisso
  4. La risposta torna al VPS, che la rimanda al Raspberry Pi attraverso il tunnel

Per il mondo esterno, tutto il traffico sembra provenire dal VPS Hetzner. Il tuo ISP di casa vede solo traffico cifrato verso un singolo IP (quello del VPS).

Schema del flusso di traffico attraverso il tunnel WireGuard

Prerequisiti

Hardware necessario

  • Un Raspberry Pi (3B+ o superiore) con Raspberry Pi OS (o qualsiasi distribuzione basata su Debian)
  • Connessione Internet domestica funzionante
  • Un computer per accedere via SSH sia al Pi che al VPS

Account e servizi

  • Un account Hetzner Cloud (registrazione gratuita su hetzner.com/cloud)
  • Un metodo di pagamento per il VPS (il costo è circa 9,75€/mese)
  • Accesso SSH configurato su entrambe le macchine

Conoscenze richieste

  • Familiarità base con il terminale Linux (cd, nano/vim, sudo, systemctl)
  • Concetti base di networking (IP, subnet, NAT, routing)
  • Aver già configurato SSH con chiave pubblica/privata (consigliato ma non obbligatorio)

Se qualcuno di questi punti non ti è chiaro, non preoccuparti: ogni step della guida include i comandi completi da eseguire.

Step 1: Setup del VPS Hetzner

Creazione dell’istanza

Accedi alla console Hetzner Cloud (console.hetzner.cloud) e crea un nuovo server con queste specifiche:

  • Type: CPX22 (2 vCPU, 4GB RAM, 80GB disco SSD) — il più economico è sufficiente
  • Location: Nuremberg (Germania) o Helsinki (Finlandia) — scegli quello geograficamente più vicino a te
  • Image: Ubuntu 24.04 LTS
  • Networking: lasciare entrambi gli ip, se si vuole si puo’ disattivare l’IPv6
  • SSH Key: aggiungi la tua chiave pubblica SSH se la si vuole altrimenti non selezionare niente per ricevere la password di root via mail
  • Volumes/Fiewalls/Backups/Placement groups: non selezionare nulla
  • Labels/Cloud config: anche qui non selezionare nulla
  • Nome: qualcosa di riconoscibile, ad esempio “wireguard-vpn”

Dopo pochi secondi il server sarà attivo. Prendi nota dell’IP pubblico assegnato — ci servirà in tutta la guida. Lo chiameremo IP_VPS

Configurazione iniziale di sicurezza

Collegati al VPS via SSH utilizzando la chiave ssh creata sopra:

ssh root@IP_VPS

Aggiorna il sistema:

apt update && apt upgrade -y

Configura il firewall UFW per permettere solo SSH e WireGuard:

ufw allow 22/tcp
ufw allow 51820/udp
ufw enable

La porta 51820/udp è quello di default di WireGuard. Se vuoi maggiore sicurezza puoi cambiarlo, ma per questa guida usiamo quello standard.

Installazione di WireGuard

apt install wireguard -y

Verifica che sia installato:

wg --version

Dovresti vedere qualcosa come wireguard-tools v1.0.x.

Step 2: Configurazione del server WireGuard sul VPS

Generazione delle chiavi

WireGuard usa un sistema di chiavi pubbliche/private, simile a SSH. Generiamo la coppia per il server:

cd /etc/wireguard
wg genkey | tee server_private.key | wg pubkey > server_public.key
chmod 600 server_private.key

Visualizza le chiavi (ti serviranno tra poco):

cat server_private.key
cat server_public.key

Importante: la chiave privata non deve mai essere condivisa. La chiave pubblica è quella che darai al client (Raspberry Pi).

File di configurazione wg0.conf

Crea il file di configurazione dell’interfaccia WireGuard:

nano /etc/wireguard/wg0.conf

Incolla questo contenuto (sostituisci SERVER_PRIVATE_KEY con la tua chiave privata generata sopra):

[Interface]
PrivateKey = SERVER_PRIVATE_KEY
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32

Alcune note sulla configurazione:

  • Address 10.0.0.1/24: è l’IP del server dentro il tunnel VPN. Usiamo una subnet privata dedicata.L’ip privato del nostro server hetzner che imposteremo.
  • ListenPort 51820: la porta UDP su cui WireGuard ascolta.
  • PostUp/PostDown: queste regole iptables abilitano il NAT. Quando il traffico arriva dal tunnel, il VPS lo “maschera” con il suo IP pubblico prima di inoltrarlo verso Internet. eth0 è l’interfaccia di rete pubblica del VPS — verificala con ip a (su Hetzner potrebbe essere ens3 o simile).

    Nel caso di eth0 dovessi avere appunto ens3 nella configurazione del punto sopra nella riga PostUp e PostDown invece di scrivere eth0 inserire ens3.
  • CLIENT_PUBLIC_KEY: la inseriremo dopo, quando genereremo le chiavi sul Raspberry Pi.

Abilitazione IP forwarding e NAT

Per permettere al VPS di inoltrare il traffico dal tunnel verso Internet, dobbiamo abilitare l’IP forwarding:

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

Verifica che sia attivo:

cat /proc/sys/net/ipv4/ip_forward

Deve restituire 1.

Avvio del servizio

Non avviamo ancora WireGuard sul server — prima dobbiamo configurare il client (Raspberry Pi) e inserire la sua chiave pubblica nel file wg0.conf creato sopra. Lo faremo nello step successivo.

Step 3: Setup del Raspberry Pi come client

Installazione di WireGuard su Raspbian

Collegati al tuo Raspberry Pi via SSH e installa WireGuard:

sudo apt update && sudo apt upgrade -y
sudo apt install wireguard -y

Verifica l’installazione:

wg --version

Generazione delle chiavi del client

Generiamo la coppia di chiavi per il Raspberry Pi:

cd /etc/wireguard
sudo wg genkey | sudo tee client_private.key | wg pubkey | sudo tee client_public.key
sudo chmod 600 client_private.key

Visualizza la chiave pubblica — questa è quella che dovrai inserire nel file wg0.conf del VPS Hetzner:

sudo cat client_public.key

Copia il risultato e torna sul VPS Hetzner per inserirlo nel file /etc/wireguard/wg0.conf nella sezione [Peer], al posto di CLIENT_PUBLIC_KEY

Visualizza la chiave privata— questa è quella che dovrai inserire nel file di configurazione del raspberry piu’ sotto.

sudo cat client_private.key

Configurazione del client

Crea il file di configurazione WireGuard sul Raspberry Pi:

sudo nano /etc/wireguard/wg0.conf

Incolla questo contenuto (sostituisci i valori in maiuscolo con i tuoi):

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.0.0.2/24

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = IP_VPS:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Alcune note importanti sulla configurazione:

  • CLIENT_PRIVATE_KEY: la chiave privata del Raspberry Pi, ottenuta con sudo cat client_private.key
  • SERVER_PUBLIC_KEY: la chiave pubblica del VPS Hetzner, ottenuta con cat server_public.key sul VPS
  • Address 10.0.0.2/24: l’IP del Raspberry Pi dentro il tunnel. Il server è 10.0.0.1, il client è 10.0.0.2
  • Endpoint: l’IP pubblico del tuo VPS Hetzner seguito dalla porta 51820. Ottenibile dalla console/pagina di Hetzner.
  • AllowedIPs 0.0.0.0/0: questo significa “instrada TUTTO il traffico attraverso il tunnel”. È la chiave di tutto il setup
  • PersistentKeepalive 25: manda un pacchetto ogni 25 secondi per mantenere il tunnel attivo anche dietro NAT del router domestico

Test della connessione

Ora che entrambi i file di configurazione sono pronti, avviamo WireGuard. Prima sul VPS Hetzner:

sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

Poi sul Raspberry Pi:

sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

Il primo comando avvia il tunnel, il secondo lo rende automatico al boot.

Verifica che il tunnel sia attivo dal Raspberry Pi:

sudo wg show

Dovresti vedere qualcosa come:

interface: wg0
  public key: (la tua chiave pubblica)
  private key: (hidden)
  listening port: (un numero)

peer: (chiave pubblica del server)
  endpoint: IP_VPS:51820
  allowed ips: 0.0.0.0/0
  latest handshake: (un timestamp recente)
  transfer: X received, Y sent

Se vedi “latest handshake” con un timestamp recente, il tunnel è attivo e funzionante. Se non appare, controlla che le chiavi siano state inserite correttamente e che la porta 51820/udp sia aperta sul firewall del VPS.

Step 4: Routing del traffico in uscita tramite il tunnel

Verifica dell’IP pubblico in uscita

Il momento della verità. Dal Raspberry Pi, esegui:

curl ifconfig.me

Se tutto è configurato correttamente, il risultato sarà l’IP pubblico del VPS Hetzner, non quello del tuo ISP domestico. Questo conferma che tutto il traffico in uscita del Raspberry Pi sta passando attraverso il tunnel.

Per confronto, puoi controllare il tuo IP domestico disconnettendo temporaneamente il tunnel:

sudo wg-quick down wg0
curl ifconfig.me
sudo wg-quick up wg0

Vedrai che l’IP cambia: con il tunnel attivo esce quello del VPS, senza il tunnel esce quello del tuo ISP.

A questo punto, tutto il traffico in uscita del Raspberry Pi viene instradato attraverso il tunnel WireGuard. Questo significa che per qualsiasi servizio esterno, l’IP che risulterà visibile non sarà quello assegnato dal tuo ISP domestico, ma quello del VPS Hetzner. Il tuo IP reale è completamente mascherato.

Troubleshooting comune

Se il tunnel si collega ma curl ifconfig.me restituisce ancora l’IP domestico, il problema è quasi sempre uno di questi:

  • AllowedIPs non è 0.0.0.0/0: se hai messo un valore diverso (es. 10.0.0.0/24), solo il traffico verso la subnet del tunnel viene instradato nel VPN. Per far passare TUTTO il traffico serve 0.0.0.0/0
  • IP forwarding non attivo sul VPS: verifica con cat /proc/sys/net/ipv4/ip_forward che restituisca 1
  • Regole iptables errate: controlla che l’interfaccia nelle regole PostUp/PostDown sia quella giusta (eth0 o ens3). Verifica con ip a sul VPS
  • DNS non funziona: aggiungi DNS = 1.1.1.1, 8.8.8.8 nella sezione [Interface] del file wg0.conf del Raspberry Pi

Se il tunnel non si stabilisce proprio (nessun handshake):

  • Verifica che le chiavi pubblica/privata non siano invertite
  • Controlla che la porta 51820/udp sia aperta con sudo ufw status sul VPS
  • Verifica che l’Endpoint nel file del Raspberry Pi sia l’IP corretto del VPS

Considerazioni di sicurezza

Backup delle chiavi

Le chiavi WireGuard sono l’unico elemento critico da preservare. Se le perdi, devi rigenerare tutto e riconfigurare entrambi i lati del tunnel. Salvale in un luogo sicuro — un password manager come Bitwarden o KeePass è ideale. Non salvarle mai in chiaro su cloud (Google Drive, Dropbox) senza cifratura.

Monitoraggio del tunnel

Per verificare che il tunnel sia sempre attivo, puoi creare un semplice cron job sul Raspberry Pi che controlla lo stato e lo riavvia se necessario:

sudo crontab -e

Aggiungi questa riga:

*/5 * * * * ping -c 1 10.0.0.1 > /dev/null 2>&1 || sudo wg-quick down wg0 && sudo wg-quick up wg0

Questo script ogni 5 minuti fa un ping al server attraverso il tunnel. Se il ping fallisce, riavvia WireGuard automaticamente.

Costi e alternative

Quanto costa questo setup mensilmente

Facciamo i conti:

  • VPS Hetzner CPX22: €9,75/mese (server + IPv4 incluso)
  • Traffico incluso: 20 TB/mese, più che sufficiente per un tunnel VPN
  • Raspberry Pi: costo una tantum (~40-70€ a seconda del modello), probabilmente già in vostro possesso
  • Corrente elettrica Raspberry Pi: circa €12/anno (5W medi × 24h × 365 giorni × €0.28/kWh), quindi circa €1/mese
  • Dominio (opzionale): ~€10/anno se volete un hostname per il VPS

Totale: circa €11 al mese per un IP fisso, un tunnel VPN cifrato, e pieno controllo sulla vostra infrastruttura. Per confronto, un IP statico dal vostro ISP italiano costa 5-10€/mese e non include nessuna delle funzionalità aggiuntive di un VPS completo che potete usare anche per altri servizi.

Alternative considerate

Prima di scegliere WireGuard + Hetzner, ho valutato alcune alternative:

  • Tailscale: basato su WireGuard, semplicissimo da configurare (praticamente zero config), gratuito per uso personale. Lo sconsiglio per questo caso d’uso perché non offre un IP pubblico fisso in uscita nel piano gratuito — il traffico esce comunque dal tuo ISP
  • ZeroTier: simile a Tailscale, crea una rete mesh tra i tuoi dispositivi. Stessi limiti per il routing in uscita
  • OpenVPN su VPS: funziona ma è più lento, più complesso da configurare, e consuma più risorse. Nel 2026 non c’è motivo di preferirlo a WireGuard
  • Cloudflare Tunnel: ottimo per esporre servizi web, ma non è una VPN vera e propria — non instrada tutto il traffico

WireGuard self-hosted resta la soluzione migliore se vuoi pieno controllo, performance massime, e un IP fisso in uscita a costo minimo.

Conclusioni

Con meno di 12€ al mese e un pomeriggio di configurazione, ora hai un tunnel VPN cifrato tra il tuo Raspberry Pi e un VPS con IP pubblico fisso. Tutto il traffico in uscita del Pi passa attraverso il VPS, dandoti un indirizzo stabile e prevedibile per qualsiasi servizio tu voglia esporre o collegare.

Il bello di questo setup è che è completamente sotto il tuo controllo: nessun servizio terzo, nessun abbonamento ricorrente, nessun limite di banda. E WireGuard è talmente leggero che il Raspberry Pi non se ne accorge nemmeno.

Se hai domande o hai trovato errori in questa guida, lascia un commento qui sotto — rispondo a tutti. E se vuoi rimanere aggiornato sui prossimi articoli su cloud, self-hosting e DevOps, iscriviti alla newsletter.

Buon tunneling!

Lascia un commento

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

Torna in alto