Miks VPN-i tulemüüri konks lisab sama reegli kaks korda
Taasühendus võib sinu konksu uuesti käivitada, seega projekteeri soovitud oleku järgi: enda ahelad, test enne sisestamist, üks serialiseeritud muudatus ja kitsas lammutamine.
Konks töötab esimesel korral ja pärast kolme taasühendust hoiab ahel sama reegli kolme koopiat. Miski ei ebaõnnestunud valjult; skript lihtsalt tegi iga kord, kui see käivitus, seda, mida talle öeldi. VPN-i konks on konfiguratsioonitoiming, mis võib käivituda rohkem kui üks kord, seega vajab see omanikku, soovitud olekut ja serialiseeritud muudatust. Mine selles järjekorras ja duplikaadid lakkavad.
Anna reeglitele omanik enne, kui ühtegi kirjutad
Otsusta, millist ahelat või tabelit see integratsioon omab, enne kui kirjutad ühegi reegli. Spetsiaalne ahel, mille konks loob ja tühjendab, on kõige selgem omandivorm, sest koristus saab siis selle ahela eemaldada, puutumata kellegi teise poliitikat. Kui pead reegleid jagatud ahelasse lisama, märgista need kommentaariga, et hilisem otsing leiaks täpselt sinu omad. Omand teeb lammutamise turvaliseks ja lammutamine on see osa, mis vaikselt ebaõnnestub.
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
Kommentaar ei ole siin kaunistus. See on vahe sinu reegli eemaldamise ja juhuslikult sarnase reegli eemaldamise vahel ning see jääb salvestatud reeglistikku. Kirjuta kommentaar üks kord muutujasse ja kasuta sama stringi igas käsus, mis lisab, testib või kustutab.
Testi soovitud olekut, mitte ära lisa uuesti
Kirjuta üles, mis peaks tunnelit püsti hoides olemas olema: millised liidesed, milline allikas ja sihtkoht, milline protokoll ja milline port. Seejärel väljenda iga reeglit testina, millele järgneb sisestamine, et teine käivitus leiaks reegli ega teeks midagi. Kontrollkäsk väljub nulliga, kui reegel on olemas, ja see on täpselt signaal, mida skript vajab. iptablesi viide dokumenteerib siin kasutatavad kontrolli-, lisamis- ja sisestamisvormid.
iptables -C VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT ||
iptables -A VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
Ole positsiooniga ettevaatlik. Reegli kontrollimine ja algusesse sisestamine võib nihutada luba ettepoole tahtlikust keeldumisest, mis varem tuli esimesena, nii et teine käivitus muudab käitumist, kuigi ei lisa midagi. Lisa oma ahela sees lõppu ja juhi järjekorda selle järgi, kus asub hüpe sellesse ahelasse. Kui järjekord ahela sees on oluline, ehita ahel teadaolevast loendist uuesti üles, mitte ära lappa seda reegel reegli haaval.
Peatu, kui vajalikku reeglit ei saa väljendada stabiilse testina. See tavaliselt tähendab, et soovitud olek on veel ebamäärane.
Serialiseeri muudatus, mitte ära looda, et see püsib
Kaks konksu kutset võivad kattuda ja mõlemad võivad näha puuduvat reeglit enne, kui kumbki selle lisab. xtablesi ootevalik paneb käsu lukku ootama, kuid ei tee kontrolli-ja-lisa jada kahe käsu vahel aatomiliseks. Serialiseeri kogu toiming oma lukuga või kasuta haldurit, mis rakendab deklareeritud partii ühe tehinguna. nftables suudab viimast, mis on üks põhjus eelistada seda hostidel, kus see on saadaval.
flock /run/vpn-hook.lock /usr/local/sbin/vpn-firewall-apply
nft -f /etc/nftables/vpn-hook.nft
Ükskõik millise mehhanismi valid, hoia kriitiline lõik lühike ja tee see korratavalt siseneatavaks: poolel teel ebaõnnestuv konks peaks olema ohutu uuesti käivitada. Logi tulemus, et korduv käivitus oleks journalis nähtav, mitte tuletatud reeglite arvust. Kui kaks erinevat supervisorit saavad konksu kutsuda, paranda see esmalt; ükski lukk ei paranda kahte omanikku.
Lammuta ainult seda, mis on sinu oma
Lammutamine peab eristama asendusühendust sellest, mille see pensionile saatis, ja see peab üle elama sündmuse, mis ei saa kunagi korralikku koristust. Kustuta samade identifikaatorite järgi, mida kasutasid lisamiseks, ja ära tühjenda kunagi jagatud ahelat, et koristust lihtsustada. Pärast kõva seiskamist käivita järgmisel startil lepitamise läbimine, mitte ära eelda, et allakeeramise konks töötas.
iptables -D VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
iptables -F VPN_HOOK
ip -brief link show type tun
Liidese eluiga kuulub samuti projekti. Taasühendus võib luua erineva nimega seadme, nii et teise tunneli nime kõvasti kodeeriv reegel vananeb, samal ajal kui näeb endiselt kehtiv välja. Eelista identiteeti, mille ühendus ise paljastab, ja loe see igal käivitusel uuesti. Testi kolme sündmust eraldi: korduv ühendus, asendusühendus ja väljalülitamine. Lubatud liiklus peaks kõik kolm üle elama ilma duplikaatideta ja seotud teenused peaksid jääma puutumata.
Ringkäik lõpeb, kui konksul on omanik, test iga lisatava reegli jaoks, üks serialiseeritud tee ja lammutamine, mis eemaldab ainult oma oleku. Konks, mida on ohutu kaks korda käivitada, on väärt rohkem kui konks, mis on korra nutikas.