Cosa sopravvivono davvero persist-tun e persist-key in OpenVPN
Entrambe le opzioni coprono un riavvio morbido all’interno di un processo vivo. Non conservano l’interfaccia dopo un arresto e non sono una politica di blocco del traffico.
Arrestare il servizio rimuove l’interfaccia anche con persist-tun impostato. È l’opzione che funziona come documentato, non un guasto. L’opzione descrive un percorso di riavvio all’interno di un processo in esecuzione, e systemctl stop non è quel percorso.
Leggi i due nomi insieme e il progetto diventa chiaro. Uno conserva un descrittore, l’altro conserva materiale di chiave, ed entrambi esistono per ciò che accade dopo il rilascio dei privilegi.
Le due risorse e il riavvio a cui appartengono
OpenVPN segnala il proprio riavvio in due situazioni ordinarie. Un SIGUSR1 esplicito lo fa, e un ping-restart innescato da un peer morto fa lo stesso. Entrambi lasciano vivo il processo e rieseguono la configurazione della connessione, ed è lì che le opzioni guadagnano il loro posto.
| Event | TUN/TAP device | Key and auth files | Addresses and routes | up/down hooks |
|---|---|---|---|---|
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itself | survives only with persist-tun | survive only with persist-key | survive with the device, otherwise rebuilt | run again only when restart hooks are enabled |
Configuration reload, SIGHUP | recreated | re-read from disk | rebuilt once the device returns | run again |
| Service stop | lost | re-read at the next start | removed | run at the next start |
Solo la riga del riavvio morbido è ciò che queste due opzioni cambiano, e il lavoro che saltano è la parte costosa su un collegamento occupato. Riaprire un dispositivo abbatte gli indirizzi e le rotte ad esso collegate, e ricostruirli può far cadere pacchetti che erano in volo quando è iniziato il riavvio. Un arresto distrugge gli stessi oggetti senza alcuna opzione per conservarli.
Perché le opzioni esistono affatto
Un server OpenVPN irrobustito di solito parte come root, apre le sue chiavi e il suo dispositivo, poi passa a un utente senza privilegi. Dopo quel passaggio alcune operazioni semplicemente spariscono. Leggere un file di chiave in modalità 0600, creare un’interfaccia di rete o cambiare le rotte possono essere tutti rifiutati.
Senza le opzioni persist, un peer che tace abbastanza a lungo da attivare ping-restart forzerebbe esattamente quelle operazioni. La riconnessione fallirebbe anche se nulla nella configurazione fosse cambiato. Il processo sembrerebbe morire senza motivo, e il registro mostrerebbe un errore di permessi invece di un errore di rete.
Con esse, il riavvio morbido riutilizza ciò che la fase privilegiata ha già ottenuto. Non c’è magia e il processo non sopravvive a nulla. L’acquisizione delle risorse viene semplicemente rinviata.
Leggi il primo errore, non l’ultimo
Quando un riavvio fallisce, leggi il primo errore invece dell’ultimo. Una chiave protetta, un file auth, un ioctl di interfaccia e un hook esterno sono quattro risorse diverse. Conservarne una non dice nulla sull’accesso alle altre. Un hook che chiama uno strumento firewall ha ancora bisogno dei privilegi che quello strumento richiede.
Gli hook hanno il proprio interruttore. Il manuale di OpenVPN abbina le opzioni persist a up-restart, che decide se gli script up e down vengono rieseguiti dopo un riavvio. Un’interfaccia rimasta attiva quindi non ti dice nulla sul fatto che la tua integrazione del resolver si sia aggiornata.
# which restart path just happened?
journalctl -u openvpn-client@office --since '10 min ago' | grep -E 'SIGUSR1|ping-restart|Restart pause|NOTE:'
# did the interface survive, and do its routes still exist?
ip -brief link show tun0
ip route show dev tun0
Quella coppia di comandi separa le due modalità di guasto in pochi secondi. Un’interfaccia presente con rotte mancanti è un problema di hook o di rotta. Un’interfaccia svanita significa che il processo è davvero terminato.
Un’interfaccia conservata non è un kill switch
Se il requisito è che il traffico non esca mai fuori dal tunnel, un dispositivo conservato non lo fornisce. Le rotte per l’altra famiglia di indirizzi, una seconda rotta predefinita e il caso in cui il processo esce del tutto restano tutti fuori dalla portata dell’opzione.
Tratta i due requisiti separatamente. Conservare l’oggetto tunnel tra le riconnessioni è una comodità per il demone. Bloccare l’uscita quando il tunnel è giù è una politica firewall con le proprie regole e il proprio test. Confonderle produce una configurazione che sembra difensiva e si comporta come una riconnessione al meglio.
Nomina l’evento prima di diagnosticarlo. Un riavvio morbido, un tentativo di connessione fallito e un arresto del servizio sono tre eventi con tre comportamenti, e solo il primo è ciò che queste opzioni descrivono.