Hooken fungerer første gong, og etter tre gjentilkoplingar held kjeda tre kopiar av same regel. Ingenting feila høgt; skriptet gjorde ganske enkelt det det vart bede om kvar gong det køyrde. Ein VPN-hook er ein konfigurasjonsoperasjon som kan køyre meir enn éin gong, så han treng ein eigar, ein ønskt tilstand og éi serialisert endring. Gå fram i den rekkjefølgja, og duplikata stoppar.

Gi reglane ein eigar før du skriv nokon

Avgjer kva kjede eller tabell denne integrasjonen eig før du skriv ein einaste regel. Ei dedikert kjede som hooken opprettar og tømmer, er den tydelegaste forma for eigarskap, fordi opprydding då kan fjerne den kjeda utan å røre nokon annan sin policy. Viss du må leggje reglar til ei delt kjede, merk dei med ein kommentar slik at eit seinare søk finn nøyaktig dine. Eigarskap er det som gjer nedrivinga trygg, og nedrivinga er den delen som feilar stille.

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

Ein kommentar er ikkje pynt her. Han er skilnaden mellom å fjerne regelen din og å fjerne ein regel som tilfeldigvis ser lik ut, og han overlever i det lagra regelsettet. Skriv kommentaren éin gong i ein variabel og bruk den same strengen i kvar kommando som legg til, testar eller slettar.

Test for ønskt tilstand i staden for å leggje til igjen

Skriv ned kva som skal finnast medan tunnelen er oppe: kva grensesnitt, kva kjelde og destinasjon, kva protokoll og kva port. Uttrykk deretter kvar regel som ein test etterfølgd av ei innsetting, slik at ein andre køyring finn regelen og ikkje gjer noko. Kontrollkommandoen avsluttar med null når regelen finst, og det er nøyaktig signalet skriptet treng. iptables-referansen dokumenterer formene for kontroll, tilføying og innsetting som vert brukte her.

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

Ver varsam med plasseringa. Å kontrollere ein regel og setje han inn øvst kan flytte ei tillating framfor ei medvite avvising som tidlegare kom først, så den andre køyringa endrar åtferd sjølv om ho ikkje legg til noko. Legg til på slutten inne i di eiga kjede, og styr rekkjefølgja etter kvar hoppet til den kjeda ligg. Viss rekkjefølgja inne i kjeda er viktig, bygg kjeda på nytt frå ei kjend liste i staden for å lappe henne regel for regel.

Stopp viss regelen du treng ikkje kan uttrykkjast som ein stabil test. Det tyder vanlegvis at den ønskte tilstanden framleis er uklar.

Serialiser endringa i staden for å håpe at ho held

To hook-kall kan overlappe, og begge kan sjå ein manglande regel før ein av dei legg han til. Ventevalet i xtables får ein kommando til å vente på låsen, men det gjer ikkje ein kontroller-så-legg-til-sekvens atomisk over to kommandoar. Serialiser heile operasjonen med din eigen lås, eller bruk ein behandlar som brukar ein erklært batch som éin transaksjon. nftables kan gjere det siste, som er ein grunn til å føretrekkje det på vertar der det er tilgjengeleg.

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

Uansett kva mekanisme du vel, hald den kritiske seksjonen kort og gjer han gjeninnenterbar: ein hook som feilar halvvegs, bør vere trygg å køyre igjen. Logg resultatet slik at ei gjenteken køyring er synleg i journalen i staden for å verte utleidd frå eit regeltal. Viss to ulike vegleiarar kan kalle hooken, fiks det først; ingen lås reparerer to eigarar.

Riv berre ned det du eig

Nedriving må skilje ei erstattande tilkopling frå den ho pensjonerte, og ho må tole ei hending som aldri får ei ryddig opprydding. Slett etter dei same identifikatorane du brukte til å leggje til, og tøm aldri ei delt kjede for å gjere oppryddinga enkel. Etter ein hard stopp, køyr ei avstemming ved neste start i staden for å anta at ned-hooken køyrde.

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

Levetida til grensesnittet høyrer også med i designet. Ei gjentilkopling kan opprette eining med eit anna namn, så ein regel som hardkodar namnet til den andre tunnelen, vert utdatert medan han framleis ser gyldig ut. Føretrekk identiteten som tilkoplinga sjølv avdekkjer, og les han på nytt ved kvar køyring. Test dei tre hendingane kvar for seg: ei gjenteken tilkopling, ei erstattande tilkopling og ei nedstenging. Den tillatne trafikken skal overleve alle tre utan duplikat, og urelaterte tenester skal vere urørte.

Gjennomgangen sluttar når hooken har ein eigar, ein test for kvar regel han legg til, éin serialisert veg og ei nedriving som berre fjernar hans eigen tilstand. Ein hook som er trygg å køyre to gonger, er meir verdt enn ein hook som er smart éin gong.

Relaterte artiklar