Uno script che deve essere eseguito dopo la salita della VPN ha bisogno di un evento dal componente che possiede la connessione. Un file inserito in una vecchia directory di hook di rete non è una callback per ogni VPN che NetworkManager, pppd o un processo OpenVPN autonomo possono creare. Ognuno di questi proprietari segnala un evento diverso con un ambiente diverso, quindi il proprietario va identificato prima di scegliere l’hook. Altrimenti lo script è corretto e semplicemente non viene mai eseguito.

Per una VPN gestita da NetworkManager, il dispatcher è il posto giusto, e vpn-up è l’azione giusta.

Usa vpn-up, non l’evento dell’interfaccia

Il dispatcher distingue up da vpn-up. Il primo segnala un’interfaccia attivata; il secondo segnala una connessione VPN attivata. Che il Wi-Fi salga significa solo che il collegamento sottostante esiste; il tunnel può ancora negoziare, o non autenticarsi mai.

Lo script riceve l’interfaccia e l’azione, mentre i dettagli della connessione arrivano tramite l’ambiente, inclusi l’UUID del profilo e l’interfaccia IP della VPN. Leggi quelle variabili invece di dedurre l’identità dai nomi dei dispositivi.

Limita la corrispondenza a una connessione

Fai corrispondere l’UUID della connessione, o un’altra identità fornita dal dispatcher, invece di un prefisso tun o ppp0. I nomi delle interfacce non sono stabili, più tunnel possono esistere contemporaneamente, e due profili possono portare lo stesso nome visualizzato. Far corrispondere un prefisso tun significa che lo script prima o poi si attiverà per una connessione che nessuno voleva toccare. Può anche attivarsi due volte per un profilo quando una riconnessione ricostruisce il dispositivo.

Rendi l’attività idempotente. Una callback che aggiunge una rotta a ogni invocazione finisce per riempire la tabella di duplicati, ed è la seconda copia che rompe l’instradamento.

Sapere cosa non dimostra l’attivazione

vpn-pre-up viene eseguito prima che NetworkManager segnali la VPN come completamente attivata, e il gestore attende quegli script. Usa una fase bloccante solo quando l’attività vi appartiene davvero, perché un controllo lento ritarda l’attivazione che tutti gli altri componenti aspettano di vedere.

La presenza di rotte non dimostra che un’applicazione sia in ascolto, che un nome privato si risolva o che esista una sessione utente. Verificalo separatamente con un timeout limitato, e segnala quale livello ha fallito invece di ripetere l’intera catena.

Rispetta il contesto in cui viene eseguito lo script

Gli script del dispatcher vengono eseguiti come root, fuori da qualsiasi sessione utente. Non dare per scontato che siano disponibili l’ambiente dell’utente connesso, la sua sessione grafica o un portachiavi sbloccato. Nessuno dovrebbe rispondere a un contesto desktop mancante rendendo ogni credenziale leggibile da ogni processo. Mantieni il lavoro della sessione utente in un servizio utente o in un helper di sessione a cui la callback può segnalare senza impersonare l’utente.

Anche la proprietà e i permessi sullo script contano. Un file eseguito come root che qualsiasi utente può sostituire è una via di escalation dei privilegi, ed è un rilievo indipendente dalla correttezza della logica VPN.

Pianifica la disconnessione che non si attiva mai

NetworkManager documenta che vpn-pre-down non viene emesso per disconnessioni forzate come una terminazione imprevista o una perdita di connettività. Perciò una pulizia costruita solo attorno a un pre-down regolare è incompleta per costruzione. Ogni stato condiviso che lo script modifica ha bisogno di un altro proprietario in grado di ripristinarlo dopo un crash, e quel percorso di recupero va testato invece che presunto.

Metti alla prova l’hook con una connessione normale, una riconnessione, una disconnessione intenzionale e un cavo estratto. Registra l’UUID, l’azione e l’interfaccia che si è attivata, senza registrare segreti. Quel registro è l’unica prova affidabile che l’hook è stato eseguito per la connessione che intendevi, ed è ciò che rende sicura la modifica successiva.

Articoli correlati