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.

StarterWhat triggers itTypical failure
Init script and templated unitsBoot, plus anything in the autostart listStarts every config, not the one you meant
NetworkManager secondaryActivation of the base Wi-Fi or Ethernet profileNothing happens until that base link comes up
Hand-written unit or wrapperWhatever its WantedBy and ExecStart sayRuns 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.

Powiązane artykuły