Tunel je pao, ali mašina se i dalje ponaša kao da je gore: upit visi dok ne istekne, a ruta pokazuje na interfejs koji više ne postoji. To je potpis openconnect procesa koji je umro bez pokretanja svog pomoćnika za prekid veze. Mrežno stanje koje je stvorio još je instalirano, a ništa drugo u sistemu ne zna kako da ga ukloni.

Prođite kroz mašinu redom kojim je stanje stvarano: proces, link, ruta, resolver. Svaki korak vam kaže je li klijent zaista otišao ili se samo odvojio od vašeg terminala, a ta razlika odlučuje hoćete li uopće nešto popravljati.

Počnite s procesom, a ne s konfiguracijom

Otvorite terminal i pitajte šta još radi prije nego što dirate rutu. pgrep -a openconnect izlistava svaku instancu s njenim argumentima, što pokazuje pid datoteku i skriptu koja joj je data. Proces koji niste očekivali objašnjava fantomski tunel brže od bilo kojeg loga.

Ako ništa ne radi, pogledajte link. ip link show tun0 vam kaže je li interfejs preživio, i ip route show dev tun0 izlistava rute koje su još vezane za njega. Zatim provjerite resolver s resolvectl status. Zapišite sva tri izlaza prije nego što ih promijenite, jer taj zapis je način da kasnije razlikujete zastario unos od novog.

Interfejs koji nestane obično ponese svoje rute sa sobom. Rute koje nadžive link obično znače da je proces još živ ili da drugi klijent posjeduje uređaj.

Pomoćna skripta je ono što poništava promjene

openconnect sam ne uklanja interfejs, rute ni unose u resolveru. Poziva vanjskog pomoćnika, /etc/vpnc/vpnc-script u upstream buildu i /usr/share/vpnc-scripts/vpnc-script u Debian i Ubuntu paketima, biran s -s. Ista skripta koja podiže tunel je i ona koja ga razgrađuje.

Ako proces izađe bez pozivanja tog pomoćnika, stanje ostaje. OpenConnect priručnik izričito navodi da usmjeravanje i servis imena neće raditi ispravno bez skripte, i opisuje pomoćnika kao komponentu koja razgrađuje stanje interfejsa pri izlasku. Zato je putanja važna kada klijent pokrećete s -s.

Koji signal stiže na tu putanju promijenilo se između verzija. Priručnik za 7.06 tretira SIGTERM kao trenutni izlaz koji preskače skriptu. Aktuelni buildovi dokumentuju INT i TERM kao čisto zaustavljanje, gdje se sesija odjavljuje i pomoćnik se izvršava. Čitajte odjeljak SIGNALS binarnog fajla koji stvarno imate umjesto da pretpostavljate bilo koje od dva ponašanja.

man openconnect | sed -n '/^SIGNALS/,/^LIMITATIONS/p'

Pošaljite signal koji vaš build dokumentuje

Kada znate signal, zaustavite proces po pid-u, a ne po obrascu.

pgrep -a openconnect
sudo kill -INT "$(cat /var/run/openconnect.pid)"

Zatim ponovite tri provjere iz prvog odjeljka umjesto da vjerujete izlaznom statusu. ip link show tun0 bi trebao pasti, ip route show dev tun0 ne bi trebao ništa ispisati, i resolvectl status više ne bi trebao izlistavati VPN link.

SIGHUP nije dugme za zaustavljanje: prekida vezu, izvršava skriptu i ostavlja sesiju obnovljivom s --cookie. SIGUSR2 prisiljava trenutno ponovno povezivanje. SIGKILL u potpunosti preskače čišćenje, a to je upravo stanje o kojem je ovaj članak.

Popravite resolver bez zamjene resolv.conf

Na većini Ubuntu sistema /etc/resolv.conf je simbolička veza na systemd-resolved, a ne datoteka koju biste trebali uređivati. Njena zamjena kvari razrješavanje imena za svaku mrežu, ne samo VPN. Umjesto toga uklonite registraciju tunela:

resolvectl revert tun0
resolvectl query example.com

Ako sistem koristi resolvconf umjesto systemd-resolved, zapis po interfejsu ostaje dok mu se ne kaže da ispusti link, i resolvconf -d tun0 je ekvivalentna radnja. Provjerite koji se resolver koristi prije nego što odaberete komandu.

Upit koji još cilja server iza mrtvog linka visi dok ne istekne, a to kašnjenje izgleda kao pokvaren DNS server, a ne kao zaostala ruta.

Učinite sljedeći prekid dosadnim

Držite putanju pid datoteke istom pri pokretanju i gašenju tako što ćete prosljeđivati --pid-file svaki put, ili pokrenite openconnect pod unitom čiji KillSignal odgovara signalu koji vaša verzija dokumentuje. Testiranje prvo u prvom planu pokazuje vam poruke gašenja koje pomoćnik ispisuje.

Povežite se, prekinite i pokrenite tri provjere jednom. Čist izlaz ne ostavlja ni VPN link, ni VPN rutu, ni unos VPN resolvera. Ako jedan od tri preživi, sada znate koja komponenta nije počistila. Sljedeća istraga tada počinje od tog odgovora, a ne od visećeg upita.

Povezani članci