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.

EventTUN/TAP deviceKey and auth filesAddresses and routesup/down hooks
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itselfsurvives only with persist-tunsurvive only with persist-keysurvive with the device, otherwise rebuiltrun again only when restart hooks are enabled
Configuration reload, SIGHUPrecreatedre-read from diskrebuilt once the device returnsrun again
Service stoplostre-read at the next startremovedrun 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.

Articoli correlati