Hook radi prvi put, a nakon tri ponovna povezivanja lanac drži tri kopije istog pravila. Ništa nije glasno propalo; skripta je jednostavno radila ono što joj je rečeno svaki put kada se pokrenula. VPN hook je konfiguracijska operacija 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 tabelu posjeduje ova integracija prije nego što napišete ijedno pravilo. Namjenski lanac koji hook kreira 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 tačno 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 sačuvanom skupu pravila. Napišite komentar jednom u varijablu i koristite isti niz u svakoj komandi koja dodaje, testira ili briše.

Testirajte željeno stanje umjesto ponovnog dodavanja

Zapišite šta treba postojati dok je tunel podignut: koji interfejsi, koji izvor i odredište, koji protokol i koji port. Zatim izrazite svako pravilo kao test praćen umetanjem, da drugo pokretanje pronađe pravilo i ne učini ništa. Komanda za provjeru izlazi s nulom kada pravilo postoji, i to je upravo signal koji skripti treba. Referenca za iptables dokumentuje 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 pozicijom. Provjera pravila i umetanje na čelo može pomjeriti dopuštenje ispred namjernog odbijanja koje je ranije dolazilo prvo, pa drugo pokretanje mijenja ponašanje iako ništa ne dodaje. Dodajte na kraj unutar vlastitog lanca i kontrolišite redoslijed mjestom skoka u taj lanac. Ako je redoslijed unutar lanca važan, obnovite lanac iz poznatog spiska umjesto da ga krpite 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 xtables-u čini da komanda čeka na bravu, ali ne čini slijed provjeri-pa-dodaj atomskim preko dvije komande. Serijalizirajte cijelu operaciju vlastitom bravom ili koristite upravitelja koji primjenjuje deklarisani 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čnu sekciju kratkom i učinite je ponovno ulaznom: hook koji padne na pola puta treba biti siguran za ponovno pokretanje. Zabilježite ishod da ponovljeni pokret bude vidljiv u journalu umjesto da se izvodi iz broja pravila. Ako dva različita supervizora 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 nikada ne dobije uredno čišćenje. Brišite po istim identifikatorima koje ste koristili za dodavanje i nikada 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 interfejsa takođe 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 ponovo ga čitajte pri svakom pokretu. Testirajte tri događaja odvojeno: ponovljeno povezivanje, zamjensko povezivanje i isključivanje. Dopušteni saobraćaj treba preživjeti sva tri bez duplikata, a nepovezane usluge treba ostati netaknute.

Šetnja se završava kada hook ima vlasnika, test za svako pravilo koje dodaje, jednu serijaliziranu putanju i uklanjanje koje uklanja samo vlastito stanje. Hook koji je siguran za dva pokretanja vrijedi više od hooka koji je jednom pametan.

Povezani članci