Pokrenite zadatke nakon VPN-a iz dispečera, a ne iz if-up
Stari hook interfejsa neće vidjeti VPN vezu. Uparite vpn-up s UUID-om profila, zadatak učinite ponovljivim i planirajte prekid koji se nikad ne desi.
Skripta koja se mora pokrenuti nakon podizanja VPN-a treba događaj od komponente koja posjeduje vezu. Datoteka stavljena u stari direktorij mrežnog hooka nije povratni poziv za svaki VPN koji NetworkManager, pppd ili samostalni proces OpenVPN mogu stvoriti. Svaki od tih vlasnika prijavljuje drugi događaj s drugim okruženjem, pa se vlasnik mora identificirati prije nego što se hook odabere. Inače je skripta ispravna i jednostavno se nikad ne pokreće.
Za VPN kojim upravlja NetworkManager, dispečer je pravo mjesto, a vpn-up je prava radnja.
Koristite vpn-up, a ne događaj interfejsa
Dispečer razlikuje up od vpn-up. Prvi prijavljuje aktiviran interfejs; drugi prijavljuje aktiviranu VPN vezu. Podizanje Wi-Fi mreže znači samo da osnovni link postoji; tunel možda još pregovara ili se možda nikad ne autentificira.
Skripta prima interfejs i radnju, dok detalji veze dolaze kroz okruženje, uključujući UUID profila i VPN IP interfejs. Čitajte te varijable umjesto da identitet zaključujete iz naziva uređaja.
Ograničite podudaranje na jednu vezu
Uparite po UUID-u veze ili drugom identitetu koji dispečer daje, a ne po prefiksu tun ili ppp0. Nazivi interfejsa nisu stabilni, istovremeno može postojati više od jednog tunela, a dva profila mogu nositi isti prikazani naziv. Podudaranje po prefiksu tun znači da će se skripta na kraju pokrenuti za vezu koju niko nije namjeravao dirati. Može se pokrenuti i dvaput za jedan profil kada ponovno povezivanje ponovo izgradi uređaj.
Učinite zadatak idempotentnim. Povratni poziv koji pri svakom pozivu dodaje rutu na kraju napuni tabelu duplikatima, a druga kopija je ona koja kvari rutiranje.
Znajte šta aktivacija ne dokazuje
vpn-pre-up se izvršava prije nego NetworkManager prijavi da je VPN potpuno aktiviran, a menadžer čeka te skripte. Koristite blokirajuću fazu samo kada zadatak zaista pripada tamo, jer spora provjera odgađa aktivaciju koju svaka druga komponenta čeka da vidi.
Prisustvo ruta ne dokazuje da aplikacija sluša, da se privatno ime razrješava ili da korisnička sesija postoji. Provjerite to odvojeno s ograničenim vremenskim rokom i prijavite koji sloj je zakazao umjesto da ponavljate cijeli lanac.
Poštujte kontekst u kojem se skripta izvršava
Skripte dispečera rade kao root, izvan svake korisničke sesije. Ne pretpostavljajte da su okruženje prijavljenog korisnika, grafička sesija ili otključani privjesak s ključevima dostupni. Niko ne bi trebao na nedostatak desktop konteksta odgovoriti time da svaki akreditiv učini čitljivim za svaki proces. Držite rad korisničke sesije u korisničkoj usluzi ili pomoćniku sesije kojem povratni poziv može signalizirati bez izdavanja za korisnika.
Vlasništvo i dozvole na skriptu su također važni. Datoteka koju izvršava root i koju bilo koji korisnik može zamijeniti jest put za eskalaciju privilegija i nalaz neovisan od toga je li VPN logika ispravna.
Planirajte prekid koji se nikad ne desi
NetworkManager dokumentuje da se vpn-pre-down ne emituje za prinudne prekide kao što su neočekivani prekid rada ili gubitak veze. Zato je čišćenje izgrađeno samo oko mirnog pre-down-a po konstrukciji nepotpuno. Svako dijeljeno stanje koje skripta mijenja treba drugog vlasnika koji ga može obnoviti nakon pada, a taj put oporavka mora se testirati, a ne pretpostaviti.
Testirajte hook normalnim povezivanjem, ponovnim povezivanjem, namjernim prekidom i izvučenim kablom. Zabilježite UUID, radnju i interfejs koji se pokrenuo, bez bilježenja tajni. Taj zapis je jedini pouzdan dokaz da je hook radio za vezu koju ste namjeravali i on čini sljedeću promjenu sigurnom.