Skrypty uruchamiają klientów VPN na tej warstwie, którą wybrał autor, a ta warstwa rzadko jest tą, której potrzebowało zadanie. Wiersz poleceń dostawcy, dialer systemu operacyjnego i intencja aplikacji mobilnej wracają w różnych momentach życia połączenia. Obsługują też sekret inaczej, a ta różnica decyduje, czy hasło jest widoczne dla każdego użytkownika maszyny. Wybierz warstwę, zanim napiszesz pierwszą linię skryptu.

Warstwa 1: wiersz poleceń dostawcy

Większość klientów stacjonarnych dostarcza wiersz poleceń przyjmujący nazwę profilu i, zbyt często, hasło. Stary klient Cisco akceptował czasownik connect z argumentami użytkownika i hasła; macOS udostępnia wbudowaną usługę przez networksetup; NetworkManager odpowiada na nmcli. Te wywołania wracają, gdy polecenie się kończy, co nie jest tym samym momentem, w którym tunel staje się użyteczny. Przeczytaj dokumentację dostawcy dla wdrażanej wersji, bo te interfejsy się zmieniają, a niektóre są całkowicie usuwane.

nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"

Zaletą jest to, że dostawca zna własny magazyn profili, więc wywołanie używa tej samej konfiguracji co GUI. Wadą jest to, że każdy dostawca wymyśla własne czasowniki, a skrypt napisany dla jednego klienta nie przenosi się na inny. Traktuj tę warstwę jako najkrótszą drogę, gdy klient jest ustalony, a wersja przypięta.

Warstwa 2: własna usługa systemu operacyjnego

W Windows dialer jest częścią systemu operacyjnego i działa na wpisie książki telefonicznej, a nie na magazynie profili dostawcy. To czyni go przenośniejszym między klientami i łatwiejszym do skryptowania z konta usługi. Oznacza to także, że połączenie może istnieć w jednym miejscu, a nie w drugim, co myli osoby patrzące na niewłaściwą listę.

rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus

Użyj powierzchni PowerShell, gdy musisz utworzyć lub usunąć wpis, a nie go wybrać. Warstwy WMI i cmdlet udostępniają te same obiekty pod różnymi nazwami, a usuwanie jest osobną operacją od rozłączania. Skrypt, który tylko wybiera, pozostawi nieaktualne wpisy po migracji. Sprawdź, do jakiego magazynu zapisuje twoja automatyzacja, zanim obiecasz, że sprzątanie nastąpi.

Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection

W macOS odpowiednikiem jest lista usług sieciowych, gdzie istniejąca usługa jest łączona po nazwie, a nie tworzona na bieżąco.

Poświadczenia wyciekają na każdej warstwie, więc wybierz kanał

Wszystko, co przekażesz w wierszu poleceń, pojawia się w tabeli procesów dla każdego lokalnego użytkownika i zwykle przetrwa także w historii powłoki. Obsługiwaną alternatywą OpenVPN jest odczytanie sekretu z pliku za pomocą --askpass, a sam plik potrzebuje uprawnień odpowiadających zaufaniu, jakie w nim pokładasz. Nazwany potok pozwala uniknąć zapisu sekretu na dysk, ale pozwala każdemu procesowi, który może go otworzyć, pisać tam. W Windows zapisz sekret w menedżerze poświadczeń albo w pliku, który może czytać tylko konto usługi, i nigdy jako literał w pliku wsadowym.

openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret

Ta sama zasada dotyczy tokenów i kodów jednorazowych: jeśli automatyzacja ich potrzebuje, potrzebuje kanału, który nie jest argumentem wiersza poleceń. Obróć sekret, gdy zmieniasz mechanizm, bo stara wartość leżała gdzieś w logu. Skrypt, który działa i wycieka, nie jest działającym skryptem.

Poczekaj na stan, a potem nadzoruj jednego właściciela

Każde z tych wywołań wraca, zanim tunel będzie gotowy, więc odpytuj stan udostępniany przez klienta albo sprawdź cel w jego wnętrzu z limitem czasu. Kopiowanie plików lub otwieranie połączenia z bazą danych zaraz po wywołaniu połączenia to wyścig, i zawodzi okresowo w sposób wyglądający jak awaria sieci.

ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null

Rozłączanie ma ten sam problem w drugą stronę: proces może zakończyć się, zanim trasy znikną. Używaj hooków klienta tam, gdzie istnieją, takich jak skrypty up i down OpenVPN lub ExecStartPost jednostki systemd, ponieważ działają w punkcie, na którym naprawdę ci zależy. Hooki działają z uprawnieniami tego, co je wywołało, więc hook, który restartuje sieć, potrzebuje wyraźnej reguły zamiast założenia. Utrzymuj dokładnie jednego właściciela przez cały czas życia połączenia.

Gdy dwóch nadzorców uruchamia i zatrzymuje ten sam profil, wynikiem jest pętla ponownego łączenia, która czyta się jak awaria dostawcy. Runbook kończy się, gdy warstwa jest udokumentowana, sekret ma kanał, który nie jest argv, warunkiem oczekiwania jest sprawdzenie stanu z limitem czasu, a cykl życia należy do jednego procesu.

Powiązane artykuły