Miksi VPN-palomuurin koukku lisää saman säännön kahdesti
Uudelleenyhteys voi ajaa koukkusi uudelleen, joten suunnittele haluttua tilaa varten: omat ketjut, testi ennen lisäystä, yksi sarjoitettu muutos ja kapea purku.
Koukku toimii ensimmäisellä kerralla, ja kolmen uudelleenyhteyden jälkeen ketju sisältää kolme kopiota samasta säännöstä. Mikään ei epäonnistunut äänekkäästi; skripti yksinkertaisesti teki joka kerta sen, mitä sille sanottiin. VPN-koukku on konfigurointitoimenpide, joka voi suorittua useammin kuin kerran, joten se tarvitsee omistajan, halutun tilan ja sarjoitetun muutoksen. Etene siinä järjestyksessä, niin kopiot loppuvat.
Anna säännöille omistaja ennen kuin kirjoitat yhtäkään
Päätä, minkä ketjun tai taulun tämä integraatio omistaa, ennen kuin kirjoitat ainuttakaan sääntöä. Oma ketju, jonka koukku luo ja tyhjentää, on selkein omistajuuden muoto, koska siivous voi silloin poistaa sen ketjun koskematta kenenkään muun käytäntöön. Jos sinun on pakko lisätä sääntöjä jaettuun ketjuun, merkitse ne kommentilla, jotta myöhempi haku löytää täsmälleen omasi. Omistajuus tekee purusta turvallista, ja purku on se osa, joka epäonnistuu hiljaa.
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
Kommentti ei ole tässä koriste. Se on ero sääntösi poistamisen ja sattumalta samannäköisen säännön poistamisen välillä, ja se säilyy tallennetussa sääntökokonaisuudessa. Kirjoita kommentti kerran muuttujaan ja käytä samaa merkkijonoa jokaisessa komennossa, joka lisää, testaa tai poistaa.
Testaa haluttua tilaa sen sijaan, että lisäät uudelleen
Kirjoita ylös, mitä pitäisi olla olemassa, kun tunneli on ylhäällä: mitkä rajapinnat, mikä lähde ja kohde, mikä protokolla ja mikä portti. Ilmaise sitten jokainen sääntö testinä, jota seuraa lisäys, jotta toinen ajo löytää säännön eikä tee mitään. Tarkistuskomento päättyy nollaan, kun sääntö on olemassa, ja juuri se on signaali, jonka skripti tarvitsee. iptables-viite dokumentoi tässä käytetyt tarkistus-, liitäntä- ja lisäysmuodot.
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 varovainen sijainnin kanssa. Säännön tarkistaminen ja lisääminen alkuun voi siirtää sallinnan ennen tahallista hylkäystä, joka tuli aiemmin ensin, joten toinen ajo muuttaa käyttäytymistä, vaikka ei lisää mitään. Lisää oman ketjusi sisällä loppuun ja hallitse järjestystä sillä, missä hyppy ketjuun sijaitsee. Jos järjestys ketjun sisällä on tärkeä, rakenna ketju uudelleen tunnetusta luettelosta sen sijaan, että paikkaat sitä sääntö kerrallaan.
Pysähdy, jos tarvitsemaasi sääntöä ei voi ilmaista vakaana testinä. Se tarkoittaa yleensä, että haluttu tila on vielä epämääräinen.
Sarjoita muutos sen sijaan, että toivot sen pysyvän
Kaksi koukun kutsua voivat mennä päällekkäin, ja molemmat voivat nähdä puuttuvan säännön ennen kuin kumpikaan lisää sen. xtablesin odotusvaihtoehto saa komennon odottamaan lukkoa, mutta se ei tee tarkista-ja-lisää-jaksoa atomiseksi kahden komennon yli. Sarjoita koko toimenpide omalla lukollasi tai käytä hallintatyökalua, joka soveltaa ilmoitetun erän yhtenä transaktiona. nftables pystyy jälkimmäiseen, mikä on yksi syy suosia sitä isännillä, joilla se on saatavilla.
flock /run/vpn-hook.lock /usr/local/sbin/vpn-firewall-apply
nft -f /etc/nftables/vpn-hook.nft
Valitsitpa minkä mekanismin tahansa, pidä kriittinen osio lyhyenä ja tee siitä uudelleen ajettava: koukun, joka epäonnistuu puolivälissä, pitäisi olla turvallista ajaa uudelleen. Kirjaa tulos, jotta toistuva ajo näkyy journalissa sen sijaan, että se pääteltäisiin sääntöjen määrästä. Jos kaksi eri valvojaa voi kutsua koukkua, korjaa se ensin; mikään lukko ei korjaa kahta omistajaa.
Pura vain se, minkä omistat
Purun on erotettava korvaava yhteys siitä, jonka se eläköi, ja sen on kestettävä tapahtuma, joka ei koskaan saa siistiä siivousta. Poista samoilla tunnisteilla, joita käytit lisäämiseen, äläkä koskaan tyhjennä jaettua ketjua siivouksen helpottamiseksi. Kovapysäytyksen jälkeen aja täsmäytyskierros seuraavassa käynnistyksessä sen sijaan, että olettaisit alas-koukun ajaneen.
iptables -D VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
iptables -F VPN_HOOK
ip -brief link show type tun
Rajapinnan elinikä kuuluu myös suunnitteluun. Uudelleenyhteys voi luoda erinimisen laitteen, joten sääntö, joka kovakoodaa toisen tunnelin nimen, vanhenee samalla kun se näyttää yhä kelvolliselta. Suosi identiteettiä, jonka yhteys itse paljastaa, ja lue se uudelleen joka ajolla. Testaa kolme tapahtumaa erikseen: toistuva yhteys, korvaava yhteys ja sammutus. Sallitun liikenteen pitäisi kestää kaikki kolme ilman kopioita, ja asiaankuulumattomien palveluiden pitäisi pysyä koskemattomina.
Läpikäynti päättyy, kun koukulla on omistaja, testi jokaiselle lisättävälle säännölle, yksi sarjoitettu polku ja purku, joka poistaa vain sen oman tilan. Koukku, joka on turvallista ajaa kahdesti, on arvokkaampi kuin koukku, joka on älykäs kerran.