Grepi funksionon herën e parë, dhe pas tre rilidhjeve zinxhiri mban tre kopje të të njëjtit rregull. Asgjë nuk dështoi me zë; skripti thjesht bëri atë që iu tha sa herë që ekzekutohej. Një grep VPN është një operacion konfigurimi që mund të ekzekutohet më shumë se një herë, prandaj ka nevojë për një pronar, një gjendje të dëshiruar dhe një ndryshim të serializuar. Ndjek atë rend dhe dublimet ndalen.

Jepu rregullave një pronar para se të shkruash ndonjë

Vendos cili zinxhir ose tabelë zotërohet nga ky integrim para se të shkruash një rregull të vetëm. Një zinxhir i dedikuar që grepi krijon dhe zbraz është forma më e qartë e pronësisë, sepse pastrimi mund ta heqë atë zinxhir pa prekur politikën e askujt tjetër. Nëse duhet të shtosh rregulla në një zinxhir të përbashkët, shënoji me një koment që një kërkim i mëvonshëm të gjejë saktësisht të tuajat. Pronësia e bën çmontimin të sigurt, dhe çmontimi është pjesa që dështon në heshtje.

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

Një koment këtu nuk është zbukurim. Është dallimi midis heqjes së rregullit tënd dhe heqjes së një rregulli që rastësisht duket i ngjashëm, dhe mbijeton në grupin e rregullave të ruajtur. Shkruaje komentin një herë në një variabël dhe përdor të njëjtin varg në çdo komandë që shton, teston ose fshin.

Testo gjendjen e dëshiruar në vend që të shtosh përsëri

Shkruaj çfarë duhet të ekzistojë ndërsa tuneli është lart: cilat ndërfaqe, cili burim dhe destinacion, cili protokoll dhe cili portë. Pastaj shpreh çdo rregull si një test të ndjekur nga një futje, që ekzekutimi i dytë ta gjejë rregullin dhe të mos bëjë asgjë. Komanda e kontrollit del me zero kur rregulli ekziston, dhe pikërisht ky është sinjali që skripti ka nevojë. Referenca e iptables dokumenton format e kontrollit, shtimit dhe futjes të përdorura këtu.

iptables -C VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT ||
  iptables -A VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT

Kujdes me pozicionin. Kontrolli i një rregulli dhe futja e tij në krye mund ta zhvendosë një leje përpara një refuzimi të qëllimshëm që më parë vinte i pari, kështu që ekzekutimi i dytë ndryshon sjelljen edhe pse nuk shton asgjë. Shto në fund brenda zinxhirit tënd dhe kontrollo rendin nga vendi ku ndodhet kërcimi në atë zinxhir. Nëse rendi brenda zinxhirit ka rëndësi, rindërto zinxhirin nga një listë e njohur në vend që ta arnosh rregull pas rregulli.

Ndal nëse rregulli që të duhet nuk mund të shprehet si një test i qëndrueshëm. Kjo zakonisht do të thotë se gjendja e dëshiruar është ende e paqartë.

Serializo ndryshimin në vend që të shpresosh se do të mbajë

Dy thirrje të grepit mund të mbivendosen, dhe të dyja mund të shohin një rregull që mungon para se njëra ta shtojë. Opsioni i pritjes i xtables bën që një komandë të presë bllokimin, por nuk e bën sekuencën kontrollo-pastaj-shto atomike përgjatë dy komandave. Serializo të gjithë operacionin me bllokimin tënd, ose përdor një menaxher që aplikon një grup të deklaruar si një transaksion të vetëm. nftables mund të bëjë këtë të fundit, që është një arsye për ta preferuar në hostet ku është i disponueshëm.

flock /run/vpn-hook.lock /usr/local/sbin/vpn-firewall-apply
nft -f /etc/nftables/vpn-hook.nft

Cilindo mekanizëm të zgjedhësh, mbaj seksionin kritik të shkurtër dhe bëje atë të rihyrshëm: një grep që dështon në gjysmë të rrugës duhet të jetë i sigurt për t’u ekzekutuar përsëri. Regjistro rezultatin që një ekzekutim i përsëritur të jetë i dukshëm në journal në vend që të nxirret nga numri i rregullave. Nëse dy mbikëqyrës të ndryshëm mund ta thërrasin grepin, rregulloje atë së pari; asnjë bllokim nuk rregullon dy pronarë.

Çmonto vetëm atë që zotëron

Çmontimi duhet të dallojë një lidhje zëvendësuese nga ajo që ka dalë në pension, dhe duhet t’i mbijetojë një ngjarjeje që nuk merr kurrë pastrim të rregullt. Fshi me të njëjtët identifikues që përdore për të shtuar, dhe mos e zbraz kurrë një zinxhir të përbashkët për të thjeshtuar pastrimin. Pas një ndalimi të fortë, ekzekuto një kalim rakordimi në nisjen tjetër në vend që të supozosh se grepi i zbritjes ka punuar.

iptables -D VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
iptables -F VPN_HOOK
ip -brief link show type tun

Jetëgjatësia e ndërfaqes është gjithashtu pjesë e projektimit. Një rilidhje mund të krijojë një pajisje me emër tjetër, kështu që një rregull që kodifikon fort emrin e tunelit të dytë vjetërohet ndërsa vazhdon të duket i vlefshëm. Prefero identitetin që zbulon vetë lidhja, dhe rilexoje atë në çdo ekzekutim. Testo tri ngjarjet veçmas: një lidhje e përsëritur, një lidhje zëvendësuese dhe një mbyllje. Trafiku i lejuar duhet t’i mbijetojë të trejave pa dublime, dhe shërbimet e palidhura duhet të mbeten të paprekura.

Ecja përfundon kur grepi ka një pronar, një test për çdo rregull që shton, një rrugë të serializuar dhe një çmontim që heq vetëm gjendjen e vet. Një grep që është i sigurt për t’u ekzekutuar dy herë vlen më shumë se një grep që është i zgjuar një herë.

Artikuj të ngjashëm