Zašto VPN hook vatrozida dodaje isto pravilo dvaput
Ponovno povezivanje može ponovno pokrenuti vaš hook, zato projektirajte za željeno stanje: vlastiti lanci, test prije umetanja, jedna serijalizirana promjena i usko uklanjanje.
Hook radi prvi put, a nakon tri ponovna povezivanja lanac drži tri preslike istog pravila. Ništa nije glasno palo; skripta je jednostavno radila ono što joj je rečeno svaki put kad se pokrenula. VPN hook je konfiguracijska radnja koja može raditi više puta, zato joj treba vlasnik, željeno stanje i serijalizirana promjena. Idite tim redom i duplikati prestaju.
Dajte pravilima vlasnika prije nego što ijedno napišete
Odlučite koji lanac ili tablica pripada ovoj integraciji prije nego što napišete ijedno pravilo. Namjenski lanac koji hook stvara i prazni najjasniji je oblik vlasništva, jer čišćenje tada može ukloniti taj lanac bez diranja tuđe politike. Ako pravila morate dodavati u zajednički lanac, označite ih komentarom da kasnija pretraga pronađe upravo vaša. Vlasništvo čini uklanjanje sigurnim, a uklanjanje je dio koji tiho pada.
iptables -N VPN_HOOK 2>/dev/null || true
iptables -C INPUT -j VPN_HOOK 2>/dev/null || iptables -I INPUT -j VPN_HOOK
iptables -S VPN_HOOK
Komentar ovdje nije ukras. On je razlika između uklanjanja vašeg pravila i uklanjanja pravila koje slučajno izgleda slično, i preživljava u spremljenom skupu pravila. Napišite komentar jednom u varijablu i upotrijebite isti niz u svakoj naredbi koja dodaje, testira ili briše.
Testirajte željeno stanje umjesto ponovnog dodavanja
Zapišite što treba postojati dok je tunel podignut: koja sučelja, koji izvor i odredište, koji protokol i koji port. Zatim izrazite svako pravilo kao test nakon kojeg slijedi umetanje, da drugo pokretanje pronađe pravilo i ne učini ništa. Naredba za provjeru izlazi s nulom kad pravilo postoji, i to je upravo signal koji skripti treba. Referenca za iptables dokumentira ovdje korištene oblike provjere, dodavanja i umetanja.
iptables -C VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT ||
iptables -A VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
Budite pažljivi s položajem. Provjera pravila i umetanje na čelo može pomaknuti dopuštenje ispred namjernog odbijanja koje je prije dolazilo prvo, pa drugo pokretanje mijenja ponašanje iako ništa ne dodaje. Dodajte na kraj unutar vlastitog lanca i kontrolirajte redoslijed mjestom skoka u taj lanac. Ako je redoslijed unutar lanca važan, obnovite lanac iz poznatog popisa umjesto da ga krpate pravilo po pravilo.
Zaustavite se ako pravilo koje vam treba ne može biti izraženo kao stabilan test. To obično znači da je željeno stanje još nejasno.
Serijalizirajte promjenu umjesto nade da će se održati
Dva poziva hooka mogu se preklopiti i oba mogu vidjeti odsutno pravilo prije nego što ga ijedan doda. Opcija čekanja u xtablesu čini da naredba čeka bravu, ali ne čini slijed provjeri-pa-dodaj atomskim preko dvije naredbe. Serijalizirajte cijelu radnju vlastitom bravom ili rabite upravitelja koji primjenjuje deklarirani paket kao jednu transakciju. nftables može ovo drugo, što je jedan razlog da ga preferirate na hostovima gdje je dostupan.
flock /run/vpn-hook.lock /usr/local/sbin/vpn-firewall-apply
nft -f /etc/nftables/vpn-hook.nft
Koji god mehanizam odabrali, držite kritični odjeljak kratkim i učinite ga ponovno ulaznim: hook koji padne na pola puta treba biti siguran za ponovno pokretanje. Zabilježite ishod da ponovljeno pokretanje bude vidljivo u journalu umjesto da se izvodi iz broja pravila. Ako dva različita nadzornika mogu pozvati hook, prvo to popravite; nijedna brava ne popravlja dva vlasnika.
Uklonite samo ono što posjedujete
Uklanjanje mora razlikovati zamjensku vezu od one koju je umirovilo i mora preživjeti događaj koji nikad ne dobije uredno čišćenje. Brišite po istim identifikatorima koje ste rabili za dodavanje i nikad ne praznite zajednički lanac da biste pojednostavili čišćenje. Nakon tvrdog zaustavljanja pokrenite prolaz usklađivanja pri sljedećem startu umjesto da pretpostavljate da je down hook radio.
iptables -D VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
iptables -F VPN_HOOK
ip -brief link show type tun
Životni vijek sučelja također pripada dizajnu. Ponovno povezivanje može stvoriti uređaj s drugim imenom, pa pravilo koje tvrdo kodira ime drugog tunela zastarijeva dok još izgleda valjano. Preferirajte identitet koji sama veza otkriva i ponovno ga čitajte pri svakom pokretanju. Testirajte tri događaja odvojeno: ponovljeno povezivanje, zamjensko povezivanje i isključivanje. Dopušteni promet treba preživjeti sva tri bez duplikata, a nepovezane usluge trebaju ostati netaknute.
Šetnja završava kad hook ima vlasnika, test za svako pravilo koje dodaje, jednu serijaliziranu stazu i uklanjanje koje uklanja samo vlastito stanje. Hook koji je siguran za dva pokretanja vrijedi više od hooka koji je jednom pametan.