Systemd kontra NetworkManager: kto uruchamia VPN przy starcie?
Trzy mechanizmy mogą podnieść ten sam profil Ubuntu, każdy z innym wyzwalaczem. Porównaj je, zostaw jednego właściciela i wycofaj duplikat.
Dwie maszyny Ubuntu z tego samego obrazu, jeden profil VPN, przeciwne wyniki przy logowaniu: na jednej tunel jest podniesiony, zanim pojawi się pulpit, na drugiej nigdy nie wstaje. Profil nie jest tu zmienną. Różnica polega na tym, któremu z trzech składników kazano go uruchomić, a te trzy nie dzielą jednego przełącznika.
Porównanie ich obok siebie jest szybsze niż zgadywanie. Każdy z nich zawodzi w rozpoznawalny sposób i właśnie dlatego porównanie ma sens.
Trzy mechanizmy startowe z trzema różnymi wyzwalaczami
Spakowana usługa openvpn to najstarsza droga. Jej skrypt init czyta listę autostartu z /etc/default/openvpn. Jeśli ta lista jest zakomentowana lub pusta, skrypt uruchamia każdą konfigurację znalezioną w tym katalogu, a nie tę jedyną, którą dodano. Jeden plik dodany dla jednego tunelu może po cichu podnieść kilka.
| 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 |
Drugi wiersz to ten, który ludzie konfigurują źle. NetworkManager trzyma zaimportowany profil i uruchomi go, ale tylko jako dodatkowy element innego połączenia, co oznacza, że wyzwalacz należy do łącza sieciowego, a nie do VPN-u.
Porównaj koszt konfiguracji i zakres
Droga przez skrypt init kosztuje jedną linię i obejmuje każdą konfigurację na maszynie. To dobre dla routera, a złe dla laptopa, który łączy się z różnymi sieciami. Droga przez NetworkManager kosztuje wyszukanie UUID i wiąże tunel z jednym połączeniem bazowym. Wstaje w sieci biurowej, a w sieci hotelowej pozostaje wyłączony.
Ręcznie napisany unit kosztuje najwięcej i daje najwięcej kontroli, łącznie z kolejnością względem innych usług. Decydującym czynnikiem jest zakres. Jeśli maszyna ma jedną sieć i jeden tunel, spakowana usługa jest uczciwa i przewidywalna. Jeśli tunel ma podążać za konkretną siecią Wi-Fi, element dodatkowy jest jedynym z trzech, który wyraża ten warunek bez dodatkowego skryptowania.
Wybierz jednego właściciela i usuń pozostałych
Profil uruchamiany przez dwóch właścicieli daje taktowanie, które zmienia się między startami, a to gorsze niż każdy z mechanizmów osobno. Wybierz właściciela, a następnie celowo, a nie przypadkiem, wyłącz konkurencyjną drogę.
# 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"
Jeśli wycofywana jest droga spakowana, zrób to we właściwej kolejności: ustaw AUTOSTART na none, uruchom systemctl daemon-reload, aby wygenerowane unity przejęły nową listę, a następnie wyłącz instancję szablonu, której już nie chcesz. Pominięcie przeładowania zostawia stare unity aktywne, co wygląda tak, jakby zmiana nie miała żadnego efektu.
Zawieszające się zatrzymanie to osobny problem z ograniczoną odpowiedzią. TimeoutStopSec ogranicza, jak długo systemd czeka przed wysłaniem SIGKILL. Plik drop-in to właściwe miejsce, by to ustawić, ponieważ edycja spakowanego unitu traci zmianę przy następnej aktualizacji.
Sprawdź, co faktycznie się uruchomiło
Zrestartuj maszynę i czytaj dowody, zamiast ufać plikowi konfiguracji. Unit będący właścicielem tunelu pokaże stan aktywny i znacznik czasu startu zgodny z rozruchem, a interfejs VPN będzie istniał, zanim się zalogujesz.
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
Jeszcze jedno sprawdzenie ma tu swoje miejsce: upewnij się, że ExecStart unitu wskazuje na plik binarny, o którym myślisz. Klient skompilowany lokalnie lub pakiet snap często wymaga jawnej ścieżki albo otoczki snap run, ponieważ systemd nie dziedziczy kolejności wyszukiwania z twojej powłoki. Porównanie command -v openvpn z plikiem unitu rozstrzyga to w kilka sekund.
Zapisz wybranego właściciela w notatkach maszyny, obok nazwy profilu. Następna osoba, która będzie naprawiać brakujący tunel, zacznie od tej linii, a nie od powtarzania porównania.