Tre cose devono coincidere prima che un tunnel Kerio trasporti traffico: l’indirizzo sull’interfaccia kvnet, il valore registrato dal client e ciò che la policy del server o il DHCP si aspetta. Quando non coincidono, il tunnel si autentica comunque e sale comunque, ed è proprio questo che rende l’errore confuso. L’interfaccia viene creata per ogni connessione, quindi un indirizzo impostato a mano appartiene a quella sessione e a nient’altro. È questa la forma del problema, e la soluzione è un hook anziché un file di configurazione. Il resto è dove leggere il valore e dove applicarlo.

Perché l’indirizzo continua a tornare

kvnet è un adattatore virtuale che il client crea all’avvio di una connessione e rimuove alla fine. Un ip link set manuale sopravvive quindi esattamente quanto la sessione a cui è stato applicato, e la connessione successiva parte da ciò che il client assegna. Su una macchina in cui il client non riesce ad applicare l’indirizzo atteso, ogni riconnessione reintroduce la stessa discrepanza, e la regola di lease o di accesso rifiuta di nuovo il dispositivo.

Quello schema è diagnostico di per sé. Un tunnel che funziona per una sessione e fallisce alla successiva non è un problema di credenziali, perché le credenziali non cambiano tra una connessione e l’altra.

Leggi il valore dal client, non dall’interfaccia

Il client Linux scrive i dettagli della negoziazione nel suo registro di debug, e l’indirizzo che intende usare compare lì come l’ultimo token a forma di indirizzo della sequenza di connessione. Confrontalo con ciò che il kernel detiene davvero, che è a un readlink di distanza: cat /sys/class/net/kvnet/address.

Se i due differiscono, il client conosceva il valore giusto e non è riuscito ad applicarlo, e un hook che lo applica dopo che l’interfaccia esiste chiude quel divario. Se il registro non contiene alcun indirizzo, il problema è precedente e riguarda la versione del client o il profilo del server, non uno script.

Applicalo dopo che l’interfaccia esiste

Gli utenti di NetworkManager possono collocare uno script nella sua directory dispatcher e agire solo quando l’interfaccia VPN sale. Un client gestito da systemd richiede più attenzione: un drop-in eseguito all’avvio del servizio si attiva di solito prima che l’adattatore esista, quindi l’hook deve attendere l’interfaccia invece di darla per scontata. Imposta allora l’indirizzo, e se il kernel lo rifiuta mentre il collegamento è attivo, abbassalo, imposta l’indirizzo e rialzalo. Rileggi il token estratto tramite un pattern MAC prima di passarlo a ip link, così una riga di registro inattesa non possa diventare un argomento.

Qualunque cosa giri come root dal registro di un client merita una proprietà ristretta: un file di proprietà di root, non scrivibile da altri, e nessuna interpolazione di shell oltre l’indirizzo validato. Tieni il controllo del pattern dentro lo script. Non lasciare che il contenuto del registro decida quale comando viene eseguito.

Verifica il lease invece del collegamento

ip -4 -o addr show dev kvnet dovrebbe mostrare un indirizzo nell’intervallo atteso, ip neigh show dev kvnet dovrebbe mostrare il gateway, e un servizio dietro la VPN dovrebbe rispondere. Poi disconnetti e riconnetti una volta; se l’indirizzo torna, l’hook scatta sull’evento sbagliato o non scatta affatto.

Un’interfaccia che compare con l’indirizzo giusto e non ottiene mai un lease indica il lato server. È un altro controllo e di solito un altro team. Conferma che l’account sia consentito e che il pool abbia ancora un indirizzo prima di modificare di nuovo l’hook.

Rivedi la soluzione provvisoria dopo un aggiornamento

Una build del client che imposta correttamente l’indirizzo lascia il tuo hook ad applicare un valore obsoleto, che è un nuovo guasto introdotto da una correzione. Non copiare mai una MAC da un’altra macchina o da un post di un forum; usa il valore che questo client registra per questo account, e annota la data in cui l’hai verificato.

Tieni lo script abbastanza corto da leggerlo in una sola seduta. Le soluzioni provvisorie che analizzano i registri sono temporanee per natura. Sopravvivono quelle che un lettore futuro capisce senza il thread originale.

Articoli correlati