Āķis strādā pirmajā reizē, un pēc trim atkārtotām savienošanām ķēdē paliek trīs viena un tā paša noteikuma kopijas. Nekas skaļi neizgāzās; skripts vienkārši katrā palaišanas reizē darīja to, kas tam tika teikts. VPN āķis ir konfigurācijas darbība, kas var darboties vairāk nekā vienu reizi, tāpēc tam vajadzīgs īpašnieks, vēlamais stāvoklis un serializētas izmaiņas. Ejiet šajā secībā, un dublikāti apstāsies.

Pirms rakstāt kādu noteikumu, piešķiriet noteikumiem īpašnieku

Pirms rakstāt pat vienu noteikumu, izlemiet, kura ķēde vai tabula pieder šai integrācijai. Īpaša ķēde, ko āķis izveido un iztukšo, ir skaidrākā īpašumtiesību forma, jo tīrīšana pēc tam var noņemt šo ķēdi, neaizskarot kāda cita politiku. Ja noteikumi tomēr jāpievieno koplietotai ķēdei, atzīmējiet tos ar komentāru, lai vēlāka meklēšana atrastu tieši jūsējos. Īpašumtiesības padara demontāžu drošu, un demontāža ir tā daļa, kas klusi neizdodas.

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

Komentārs šeit nav rotājums. Tā ir atšķirība starp jūsu noteikuma noņemšanu un tāda noteikuma noņemšanu, kas nejauši izskatās līdzīgs, un tas saglabājas saglabātajā noteikumu kopā. Ierakstiet komentāru vienreiz mainīgajā un izmantojiet to pašu virkni katrā komandā, kas pievieno, pārbauda vai dzēš.

Pārbaudiet vēlamo stāvokli, nevis pievienojiet vēlreiz

Pierakstiet, kam jābūt, kamēr tunelis ir augšā: kuras saskarnes, kurš avots un galamērķis, kurš protokols un kurš ports. Pēc tam izsakiet katru noteikumu kā testu, kam seko ievietošana, lai otrā palaišana atrastu noteikumu un neko nedarītu. Pārbaudes komanda beidzas ar nulli, kad noteikums pastāv, un tieši tas ir signāls, kas skriptam vajadzīgs. iptables uzziņa dokumentē šeit izmantotās pārbaudes, pievienošanas un ievietošanas formas.

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

Esiet uzmanīgi ar pozīciju. Noteikuma pārbaude un ievietošana sākumā var pārvietot atļauju pirms tīšas atteikuma, kas iepriekš nāca pirmais, tāpēc otrā palaišana maina uzvedību, lai gan neko nepievieno. Pievienojiet beigās savas ķēdes ietvaros un kontrolējiet secību ar to, kur atrodas lēciens uz šo ķēdi. Ja secība ķēdes iekšienē ir svarīga, pārbūvējiet ķēdi no zināma saraksta, nevis lāpiet to noteikumu pēc noteikuma.

Apstājieties, ja vajadzīgo noteikumu nevar izteikt kā stabilu testu. Tas parasti nozīmē, ka vēlamais stāvoklis joprojām ir neskaidrs.

Serializējiet izmaiņas, nevis ceriet, ka tās noturēsies

Divi āķa izsaukumi var pārklāties, un abi var redzēt trūkstošu noteikumu, pirms kāds to pievieno. xtables gaidīšanas opcija liek komandai gaidīt slēdzeni, taču tā nepadara pārbaudi-un-pievieno secību atomisku divu komandu ietvaros. Serializējiet visu darbību ar savu slēdzeni vai izmantojiet pārvaldnieku, kas deklarēto paketi piemēro kā vienu transakciju. nftables var pēdējo, un tas ir viens iemesls dot tam priekšroku resursdatoros, kur tas ir pieejams.

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

Lai kādu mehānismu izvēlētos, turiet kritisko sadaļu īsu un padariet to atkārtoti ieejamu: āķim, kas cieš neveiksmi pusceļā, jābūt droši atkārtoti palaižamam. Reģistrējiet iznākumu, lai atkārtota palaišana būtu redzama žurnālā, nevis secināta no noteikumu skaita. Ja divi dažādi uzraugi var izsaukt āķi, vispirms to izlabojiet; neviena slēdzene nesalabo divus īpašniekus.

Demontējiet tikai to, kas pieder jums

Demontāžai jāatšķir aizstājējsavienojums no tā, ko tā nosūtīja pensijā, un tai jāiztur notikums, kas nekad nesaņem kārtīgu tīrīšanu. Dzēsiet ar tiem pašiem identifikatoriem, ko izmantojāt pievienošanai, un nekad neiztukšojiet koplietotu ķēdi, lai vienkāršotu tīrīšanu. Pēc cietas apturēšanas nākamajā startā palaidiet saskaņošanas gājienu, nevis pieņemiet, ka lejupējais āķis ir darbojies.

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

Saskarnes dzīves ilgums arī ietilpst dizainā. Atkārtota savienošana var izveidot ierīci ar citu nosaukumu, tāpēc noteikums, kas stingri iekodē otrā tuneļa nosaukumu, noveco, kamēr vēl izskatās derīgs. Dodiet priekšroku identitātei, ko atklāj pats savienojums, un katrā palaišanā to nolasiet no jauna. Pārbaudiet trīs notikumus atsevišķi: atkārtotu savienojumu, aizstājējsavienojumu un izslēgšanu. Atļautajai plūsmai jāiztur visi trīs bez dublikātiem, un nesaistītiem pakalpojumiem jāpaliek neskartiem.

Gājiens beidzas, kad āķim ir īpašnieks, tests katram pievienotajam noteikumam, viens serializēts ceļš un demontāža, kas noņem tikai savu stāvokli. Āķis, ko droši palaist divreiz, ir vērtīgāks par āķi, kas vienreiz ir gudrs.

Saistītie raksti