Systemd ar NetworkManager: kas paleidžia VPN įjungiant?
Trys mechanizmai gali pakelti tą patį Ubuntu profilį, kiekvienas su skirtingu trigeriu. Palyginkite juos, palikite vieną savininką ir pašalinkite dublikatą.
Du Ubuntu kompiuteriai iš to paties atvaizdo, vienas VPN profilis, priešingi rezultatai prisijungus: viename tunelis pakeltas dar prieš pasirodant darbalaukiui, kitame jis niekada nepakyla. Profilis čia nėra kintamasis. Skirtumas tas, kuriam iš trijų komponentų buvo liepta jį paleisti, ir šie trys nesidalija vienu jungikliu.
Palyginti juos vieną šalia kito greičiau nei spėlioti. Kiekvienas iš jų sugenda atpažįstamu būdu, ir būtent todėl palyginimas vertas pastangų.
Trys paleidikliai su trimis skirtingais trigeriais
Supakuota openvpn paslauga yra seniausias kelias. Jos init scenarijus skaito automatinio paleidimo sąrašą iš /etc/default/openvpn. Jei tas sąrašas užkomentuotas arba paliktas tuščias, scenarijus paleidžia kiekvieną tame kataloge rastą konfigūraciją, o ne tą vienintelę, kurią pridėjote. Vienas failas, pridėtas vienam tuneliui, gali tyliai pakelti kelis.
| Starter | What triggers it | Typical failure |
|---|---|---|
| Init script and templated units | Boot, plus anything in the autostart list | Starts every config, not the one you meant |
| NetworkManager secondary | Activation of the base Wi-Fi or Ethernet profile | Nothing happens until that base link comes up |
| Hand-written unit or wrapper | Whatever its WantedBy and ExecStart say | Runs a different binary or environment than your shell |
Antroji eilutė yra ta, kurią žmonės sukonfigūruoja neteisingai. NetworkManager laiko importuotą profilį ir jį paleis, bet tik kaip kitos jungties antrinį, o tai reiškia, kad trigeris priklauso tinklo grandžiai, o ne VPN.
Palyginkite nustatymo kainą ir apimtį
Init scenarijaus kelias kainuoja vieną eilutę ir apima kiekvieną kompiuterio konfigūraciją. Tai tinka maršrutizatoriui ir netinka nešiojamajam kompiuteriui, kuris jungiasi prie skirtingų tinklų. NetworkManager kelias kainuoja UUID paiešką ir pririša tunelį prie vienos bazinės jungties. Jis pakyla darbo SSID tinkle ir lieka nuleistas viešbučio tinkle.
Rankomis parašytas unit kainuoja daugiausia ir duoda daugiausia kontrolės, įskaitant eiliškumą kitų paslaugų atžvilgiu. Apimtis yra lemiamas veiksnys. Jei kompiuteryje vienas tinklas ir vienas tunelis, supakuota paslauga yra sąžininga ir nuspėjama. Jei tunelis turi sekti konkretų Wi-Fi tinklą, antrinis yra vienintelis iš trijų, kuris tą sąlygą išreiškia be papildomo scenarijų rašymo.
Pasirinkite vieną savininką ir pašalinkite kitus
Profilis, kurį paleidžia du savininkai, duoda laiką, kuris keičiasi tarp įjungimų, ir tai blogiau nei bet kuris mechanizmas atskirai. Pasirinkite savininką, tada sąmoningai, o ne atsitiktinai, išjunkite konkuruojantį kelią.
# who is configured to start something?
grep -v '^#' /etc/default/openvpn
systemctl list-units 'openvpn*'
nmcli -g connection.secondaries connection show 'Work Wi-Fi'
# NetworkManager: attach the tunnel to the base link by UUID
TUNNEL=$(nmcli -g UUID connection show 'Corp Tunnel')
nmcli connection modify 'Work Wi-Fi' +connection.secondaries "$TUNNEL"
Jei atsisakoma supakuoto kelio, darykite tai teisinga tvarka: nustatykite AUTOSTART į none, paleiskite systemctl daemon-reload, kad sugeneruoti unitai perimtų naują sąrašą, tada išjunkite šablono egzempliorių, kurio nebereikia. Praleidus perkrovimą, seni unitai lieka aktyvūs, ir atrodo, kad pakeitimas neturėjo jokio poveikio.
Užstrigęs sustabdymas yra atskira problema su ribotu atsakymu. TimeoutStopSec riboja, kiek systemd laukia prieš siųsdamas SIGKILL. Drop-in yra tinkama vieta tai nustatyti, nes supakuoto unito redagavimas praranda pakeitimą per kitą atnaujinimą.
Patikrinkite, kas iš tikrųjų paleista
Paleiskite iš naujo ir skaitykite įrodymus, o ne pasitikėkite konfigūracijos failu. Tunelį turintis unit parodys aktyvią būseną ir įjungimą atitinkantį paleidimo laiko žymą, o VPN sąsaja egzistuos prieš jums prisijungiant.
systemctl is-enabled openvpn-client@office
systemctl status openvpn-client@office --no-pager
nmcli -f GENERAL.STATE,connection.secondaries connection show 'Work Wi-Fi'
ip -brief link show tun0
Čia priklauso dar vienas patikrinimas: įsitikinkite, kad unito ExecStart rodo į tą dvejetainį failą, kurį manote. Vietoje sukompiliuotas klientas arba snap paketas dažnai reikalauja aiškaus kelio arba snap run apvalkalo, nes systemd nepaveldi jūsų apvalkalo paieškos tvarkos. command -v openvpn palyginimas su unito failu tai išsprendžia per kelias sekundes.
Įrašykite pasirinktą savininką į kompiuterio pastabas, šalia profilio pavadinimo. Kitas žmogus, kuris taisys dingusį tunelį, pradės nuo tos eilutės, o ne kartos palyginimą.