Una VPN multi-hop instrada il tuo traffico attraverso due server in due paesi diversi, cosi nessuna macchina sa mai allo stesso tempo chi sei e cosa fai. Le VPN commerciali lo offrono come "Double VPN" o "Secure Core", ma la versione piu privata e quella che costruisci tu stesso con due server che solo tu controlli. Questa guida concatena due server WireGuard - un server di ingresso a cui ti colleghi e un server di uscita da cui esce il tuo traffico - cosi il tuo IP reale e nascosto dietro due salti che nessun altro puo registrare.
Come funziona la catena
Il tuo dispositivo si collega solo al server di ingresso. Il server di ingresso non manda il tuo traffico direttamente su internet - lo inoltra invece tutto attraverso un secondo tunnel WireGuard al server di uscita, che poi raggiunge internet. Quindi il percorso e: tu → ingresso → uscita → internet. Il server di ingresso vede il tuo IP reale ma mai la tua destinazione; quello di uscita vede la tua destinazione ma vede sempre solo il server di ingresso. I siti vedono l'IP del server di uscita. Daremo al server di uscita l'intervallo 10.8.0.0/24 e a quello di ingresso 10.7.0.0/24 per i tuoi dispositivi.
Passo 1: Configurare il server di uscita
Il server di uscita e semplicemente un normale server WireGuard. Sul VPS di uscita, installa WireGuard e genera le sue chiavi:
apt update && apt install -y wireguard
wg genkey | tee /etc/wireguard/exit.key | wg pubkey > /etc/wireguard/exit.pub
cat /etc/wireguard/exit.key # this is EXIT_PRIVATE_KEY
cat /etc/wireguard/exit.pub # this is EXIT_PUBLIC_KEY
Trova la tua interfaccia di rete pubblica (di solito eth0) con ip route show default. Poi crea /etc/wireguard/wg0.conf sul server di uscita:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = EXIT_PRIVATE_KEY
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
[Peer]
# The entry server (we add its key in Step 4)
PublicKey = ENTRY_LINK_PUBLIC_KEY
AllowedIPs = 10.8.0.2/32
Sostituisci eth0 se la tua interfaccia e diversa. Lascia ENTRY_LINK_PUBLIC_KEY come segnaposto per ora - lo generiamo al Passo 4.
Passo 2: Abilitare il forwarding e avviare l'uscita
Abilita l'IP forwarding in modo permanente, poi avvia WireGuard sul server di uscita:
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-wg.conf
sysctl -p /etc/sysctl.d/99-wg.conf
ufw allow 51820/udp
systemctl enable --now wg-quick@wg0
Annota l'IP pubblico del server di uscita - lo chiameremo EXIT_IP.
Passo 3: Configurare il server di ingresso (il tuo lato)
Sul VPS di ingresso, installa WireGuard e genera due coppie di chiavi - una per il tunnel rivolto ai tuoi dispositivi (wg0) e una per il collegamento all'uscita (wg1):
apt update && apt install -y wireguard
wg genkey | tee /etc/wireguard/entry0.key | wg pubkey > /etc/wireguard/entry0.pub # faces your devices
wg genkey | tee /etc/wireguard/entry1.key | wg pubkey > /etc/wireguard/entry1.pub # link to exit
La chiave pubblica in entry1.pub e il ENTRY_LINK_PUBLIC_KEY che hai lasciato come segnaposto sul server di uscita al Passo 1. Torna indietro e incollalo ora nel wg0.conf dell'uscita, poi esegui systemctl restart wg-quick@wg0 sul server di uscita.
Passo 4: Creare il collegamento ingresso-uscita (wg1)
Sul server di ingresso, crea /etc/wireguard/wg1.conf. Questo rende il server di ingresso un client del server di uscita:
[Interface]
Address = 10.8.0.2/24
PrivateKey = ENTRY_LINK_PRIVATE_KEY
# Do NOT route the whole server through the exit - that would cut your own SSH.
# Send only your client subnet (10.7.0.0/24) through the exit, via a separate table.
Table = off
PostUp = ip rule add from 10.7.0.0/24 table 120; ip route add default dev wg1 table 120
PostDown = ip rule del from 10.7.0.0/24 table 120; ip route del default dev wg1 table 120
[Peer]
# The exit server
PublicKey = EXIT_PUBLIC_KEY
Endpoint = EXIT_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
ENTRY_LINK_PRIVATE_KEY e il contenuto di entry1.key. Questo e il passo piu importante da fare bene. Un semplice AllowedIPs = 0.0.0.0/0 farebbe instradare a WireGuard il traffico proprio del server di ingresso - inclusa la tua sessione SSH - attraverso l'uscita, interrompendo il tuo accesso al server. Table = off lo impedisce, e le regole di policy routing inviano solo la tua sottorete client attraverso l'uscita, lasciando il server stesso raggiungibile come sempre.
Passo 5: Creare il tunnel di ingresso per i tuoi dispositivi (wg0)
Sempre sul server di ingresso, crea /etc/wireguard/wg0.conf. Questo e il tunnel a cui si collega il tuo telefono o portatile, e le regole di routing spingono quel traffico dentro wg1:
[Interface]
Address = 10.7.0.1/24
ListenPort = 51820
PrivateKey = ENTRY_DEVICE_PRIVATE_KEY
PostUp = iptables -A FORWARD -i wg0 -o wg1 -j ACCEPT; iptables -A FORWARD -i wg1 -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o wg1 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -o wg1 -j ACCEPT; iptables -D FORWARD -i wg1 -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o wg1 -j MASQUERADE
[Peer]
# Your device (we add its key in Step 6)
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.7.0.2/32
ENTRY_DEVICE_PRIVATE_KEY e il contenuto di entry0.key. Il masquerading su wg1 nasconde il tuo dispositivo dietro il server di ingresso, cosi l'uscita vede sempre solo l'ingresso.
Passo 6: Creare la config del dispositivo e connettersi
Genera una coppia di chiavi per il tuo dispositivo (sul tuo computer o sul server di ingresso), poi costruisci la config del client. Metti la chiave pubblica del dispositivo nel wg0.conf dell'ingresso dove c'e CLIENT_PUBLIC_KEY. La config del tuo dispositivo e cosi:
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.7.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = ENTRY_DEVICE_PUBLIC_KEY
Endpoint = ENTRY_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Qui ENTRY_DEVICE_PUBLIC_KEY viene da entry0.pub, e ENTRY_IP e l'IP pubblico del server di ingresso - l'unico server con cui il tuo dispositivo parla mai.
Passo 7: Avviare l'ingresso e verificare la catena
Sul server di ingresso, abilita il forwarding e avvia entrambi i tunnel in ordine (prima il collegamento, poi il tunnel del dispositivo):
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-wg.conf
sysctl -p /etc/sysctl.d/99-wg.conf
ufw allow 51820/udp
systemctl enable --now wg-quick@wg1
systemctl enable --now wg-quick@wg0
Ora importa la config del client nell'app WireGuard sul tuo dispositivo e connettiti. Per confermare che la catena funziona, controlla il tuo IP - deve mostrare il paese del server di uscita, non di ingresso:
curl https://api.ipify.org
Se restituisce l'IP del server di uscita, il tuo traffico salta attraverso entrambi i server. Esegui un test di leak sulla nostra pagina di strumenti di rete per assicurarti che non ci siano leak DNS o WebRTC.
sysctl net.ipv4.ip_forward deve restituire 1) su entrambi i server, che il server di uscita abbia la tua chiave di ingresso nel blocco [Peer], e che entrambi i firewall consentano UDP 51820. Se l'IP mostra il paese di ingresso invece che di uscita, la regola MASQUERADE -o wg1 sull'ingresso non si e caricata - riavvia wg0 sul server di ingresso.Ne vale la pena?
Un multi-hop auto-ospitato e la configurazione piu privata che ci sia: due server tuoi, in due paesi, senza provider nel mezzo che tiene log. I compromessi sono la velocita (due salti aggiungono latenza) e il costo (due VPS invece di uno). Per la navigazione quotidiana un solo server basta; costruisci la catena quando il tuo modello di minaccia lo richiede davvero. E ricorda: un multi-hop protegge la tua privacy, non cambia la legge del luogo in cui vivi.