Il Pi come client VPN: un gestore o uno script fatto in casa?
Confrontate un profilo NetworkManager con uno script client scritto a mano su un Raspberry Pi, inclusi tunnel completo, DNS, IPv6 e il comportamento quando il tunnel cade.
Un Raspberry Pi che deve proteggere solo il proprio traffico in uscita ha due progetti realistici: lasciare che il gestore di rete possieda il tunnel, oppure tenere uno script che lo possiede. Entrambi possono trasportare traffico. Falliscono in punti diversi, e il guasto che potete diagnosticare da remoto alle due del mattino è quello che vale la pena scegliere. Confrontateli per proprietà, per che cosa significa tunnel completo quando entrano in gioco IPv6 e DNS, e per che cosa succede nel momento in cui il tunnel cade.
Due proprietari per un tunnel
Il progetto A è un profilo dentro il gestore di rete del sistema: un profilo OpenVPN importato o una connessione WireGuard nativa, attivata all’avvio dallo stesso servizio che alza Ethernet e Wi-Fi. Il progetto B è un’unità vostra che esegue il client direttamente, modifica la configurazione del resolver e installa le proprie rotte e regole del firewall. Entrambi sono progetti legittimi; differiscono in chi ha il permesso di cambiare la tabella di routing.
I guasti differiscono perché i proprietari differiscono. Con A, un profilo che non si attiva lascia l’interfaccia su e il tunnel giù, e i log del gestore dicono perché. Con B, uno script che riesce a metà lascia rotte che sopravvivono al processo che le ha create. Eseguirli entrambi è il risultato peggiore: due processi scrivono la rotta predefinita, due modifiche al resolver gareggiano all’avvio e due insiemi di segreti da ruotare.
Scegliete un proprietario per tunnel e disattivate l’altro prima di testare qualsiasi cosa. Due proprietari significano anche due posti in cui guardare quando il tunnel è su e niente si risolve. Quella singola regola evita la maggior parte degli stati confusi descritti nei thread su Pi VPN.
Che cosa crea un’importazione e che cosa no
Su Raspberry Pi OS Bookworm e successivi lo strumento predefinito di configurazione di rete è NetworkManager, quindi un profilo è la casa naturale per un tunnel client. L’importazione richiede il plugin corrispondente installato; senza di esso fallisce con un messaggio su un tipo di connessione non supportato, che è il segnale onesto per fermarsi e installare il plugin.
nmcli connection import type openvpn file ./provider.ovpn
nmcli connection show
nmcli --ask connection up id provider-name
L’importazione salva un profilo. Non dimostra che l’altro lato sia raggiungibile e non garantisce che ogni direttiva del file sia sopravvissuta alla conversione. Rileggete la connessione risultante e controllate le parti che portano identità e fiducia: il certificato, l’host remoto e la porta, e se una password venga chiesta o memorizzata.
L’attivazione con --ask tiene una passphrase fuori dalla cronologia della shell su una macchina condivisa. Per un Pi senza sorveglianza alla fine vorrete che il profilo si alzi all’avvio, che è una decisione separata dal farlo salire una volta a mano.
Tunnel completo, confrontato sui due progetti
Un tunnel completo è un’affermazione sulle rotte, non sulle intenzioni, e i due progetti la esprimono in modo diverso. L’approccio con profilo chiede al gestore di installare una rotta predefinita e le sue impostazioni di resolver; l’approccio con script fa ciò che dice lo script, incluso niente. Nessuno dei due copre IPv6 se non gli viene detto, e una rotta predefinita IPv6 intatta porterà allegramente traffico fuori dal tunnel mentre IPv4 sembra perfetto.
ip -4 route get 198.51.100.23
ip -6 route show default
resolvectl query example.org
Usate un indirizzo di documentazione per l’interrogazione della rotta e sostituitelo con un host che vi è consentito sondare. Il primo comando mostra quale interfaccia userebbe il Pi per una destinazione ordinaria; il secondo mostra se esiste ancora una rotta predefinita IPv6; il terzo dimostra quale resolver ha risposto. Leggete tutti e tre prima di credere a qualsiasi affermazione su un tunnel completo.
Se le istruzioni del fornitore promettono un tunnel completo ma la rotta predefinita IPv6 sopravvive, il Pi perde. Disattivate IPv6 sul collegamento in salita o chiedete al profilo di rivendicarla, e decidete deliberatamente invece di scoprirlo più tardi.
Guasto aperto contro guasto chiuso
Quando il tunnel cade, una tabella di routing che perde la rotta predefinita ricade semplicemente sul collegamento fisico, e il traffico continua in chiaro. È il guasto aperto, ed è il comportamento predefinito di entrambi i progetti a meno che qualcosa lo impedisca. La maggior parte delle persone lo scopre settimane dopo leggendo un log del firewall.
Il guasto chiuso vi costa l’accesso remoto quando il tunnel è giù, quindi richiede un’eccezione deliberata per il percorso di gestione. Un modo è una regola che consente solo l’indirizzo del peer VPN fuori dal tunnel:
sudo nft add table inet vpnkill
sudo nft 'add chain inet vpnkill out { type filter hook output priority 0; policy accept; }'
sudo nft add rule inet vpnkill out oifname != "tun0" ip daddr != 203.0.113.24 reject
Confrontate il costo operativo con onestà. Un profilo di solito non può esprimere questa regola, quindi il guasto chiuso vi spinge verso il progetto con script o verso una piccola unità che installa la regola indipendentemente dal tunnel. In ogni caso, registrate i rifiuti per una settimana: un rifiuto silenzioso sembra identico a un servizio rotto, e vorrete il contatore quando un utente segnalerà che un sito ha smesso di caricarsi.
Scegliere per un Pi senza schermo
Se l’immagine esegue già NetworkManager, il tunnel non richiede nulla di esotico e volete che segua automaticamente il collegamento in salita, prendete il profilo. Se vi serve routing per politiche, più tunnel scelti per destinazione, o una regola di guasto chiuso che deve esistere prima che il tunnel salga, prendete lo script e possedete ogni sua parte, inclusi l’ordine di avvio e la pulizia. Mescolare i due progetti costa più di ciascuno da solo.
Migrare tra i due è soprattutto una questione di ordine: disattivate il vecchio proprietario, confermate che non sopravviva alcuna rotta o voce di resolver obsoleta, poi attivate il nuovo e riavviate due volte. Un solo riavvio può nascondere una corsa che un secondo rivela. Finite testando il Pi invece del tunnel: risolvete un nome, scaricate qualcosa via IPv4, scaricate via IPv6 se l’avete tenuto, poi abbattete il tunnel e confermate che il comportamento scelto avvenga davvero. Un’interfaccia in ip link è l’inizio del test, non la fine.