Kabliukas veikia pirmą kartą, o po trijų pakartotinių prisijungimų grandinėje lieka trys tos pačios taisyklės kopijos. Niekas garsiai nesugedo; scenarijus kiekvieną kartą tiesiog darė tai, kas jam buvo pasakyta. VPN kabliukas yra konfigūravimo operacija, kuri gali veikti daugiau nei kartą, todėl jam reikia savininko, norimos būsenos ir serializuoto pakeitimo. Eikite šia tvarka, ir dublikatai sustos.

Duokite taisyklėms savininką, prieš rašydami bent vieną

Nuspręskite, kuri grandinė ar lentelė priklauso šiai integracijai, prieš rašydami vieną taisyklę. Atskira grandinė, kurią kabliukas sukuria ir išvalo, yra aiškiausia nuosavybės forma, nes valymas tada gali pašalinti tą grandinę neliesdamas niekieno kito politikos. Jei turite pridėti taisyklių į bendrą grandinę, pažymėkite jas komentaru, kad vėlesnė paieška rastų būtent jūsiškes. Nuosavybė daro išmontavimą saugų, o išmontavimas yra ta dalis, kuri tyliai sugenda.

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

Komentaras čia nėra puošmena. Tai skirtumas tarp jūsų taisyklės pašalinimo ir taisyklės, kuri atsitiktinai atrodo panašiai, pašalinimo, ir jis išlieka išsaugotame taisyklių rinkinyje. Parašykite komentarą vieną kartą kintamajame ir naudokite tą pačią eilutę kiekvienoje komandoje, kuri prideda, tikrina ar ištrina.

Tikrinkite norimą būseną, o ne pridėkite dar kartą

Užsirašykite, kas turi egzistuoti, kol tunelis pakeltas: kurie sąsajos, koks šaltinis ir paskirties vieta, kuris protokolas ir kuris prievadas. Tada išreikškite kiekvieną taisyklę kaip testą, po kurio eina įterpimas, kad antras paleidimas rastų taisyklę ir nieko nedarytų. Patikrinimo komanda baigiasi nuliu, kai taisyklė egzistuoja, ir būtent to signalo reikia scenarijui. iptables nuoroda dokumentuoja čia naudojamas patikrinimo, pridėjimo ir įterpimo 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

Būkite atsargūs su padėtimi. Taisyklės patikrinimas ir įterpimas į priekį gali pastumti leidimą prieš tyčinį atmetimą, kuris anksčiau ėjo pirmas, todėl antras paleidimas keičia elgseną, nors nieko neprideda. Pridėkite gale savo grandinės viduje ir valdykite tvarką pagal tai, kur yra šuolis į tą grandinę. Jei tvarka grandinės viduje svarbi, perstatykite grandinę iš žinomo sąrašo, o ne lopkite taisyklę po taisyklės.

Sustokite, jei reikiamos taisyklės negalima išreikšti kaip stabilaus testo. Tai paprastai reiškia, kad norima būsena dar neaiški.

Serializuokite pakeitimą, o ne tikėkitės, kad jis išsilaikys

Du kabliuko iškvietimai gali persidengti, ir abu gali matyti trūkstamą taisyklę, prieš tai vienam ją pridedant. xtables laukimo parinktis priverčia komandą laukti užrakto, bet nepadaro patikrinti-ir-pridėti sekos atomine per dvi komandas. Serializuokite visą operaciją savo užraktu arba naudokite tvarkyklę, kuri deklaruotą paketą taiko kaip vieną transakciją. nftables gali pastarąjį, ir tai viena priežasčių teikti jam pirmenybę hostuose, kur jis prieinamas.

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

Kad ir kokį mechanizmą pasirinktumėte, laikykite kritinę sekciją trumpą ir padarykite ją pakartotinai įeinamą: kabliukas, kuris sugenda pusiaukelėje, turi būti saugus paleisti dar kartą. Registruokite rezultatą, kad pakartotinis paleidimas būtų matomas žurnale, o ne spėjamas iš taisyklių skaičiaus. Jei du skirtingi prižiūrėtojai gali iškviesti kabliuką, pirmiausia tai sutvarkykite; joks užraktas nesutvarko dviejų savininkų.

Išmontuokite tik tai, kas jums priklauso

Išmontavimas turi atskirti pakaitinį ryšį nuo to, kurį jis išleido į pensiją, ir turi atlaikyti įvykį, kuris niekada nesulaukia tvarkingo valymo. Trinkite tais pačiais identifikatoriais, kuriuos naudojote pridėdami, ir niekada neišvalykite bendros grandinės, kad supaprastintumėte valymą. Po kieto sustabdymo kitą kartą paleisdami atlikite derinimo eigą, o ne manykite, kad išjungimo kabliukas suveikė.

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

Sąsajos gyvavimo trukmė taip pat priklauso projektui. Pakartotinis prisijungimas gali sukurti įrenginį kitu pavadinimu, todėl taisyklė, kuri kietai įkoduoja antro tunelio pavadinimą, pasensta, nors dar atrodo galiojanti. Pirmenybę teikite tapatybei, kurią atskleidžia pats ryšys, ir kiekvieną kartą ją perskaitykite iš naujo. Išbandykite tris įvykius atskirai: pakartotinį prisijungimą, pakaitinį prisijungimą ir išjungimą. Leidžiamas srautas turi atlaikyti visus tris be dublikatų, o nesusijusios paslaugos turi likti nepaliestos.

Ėjimas baigiasi, kai kabliukas turi savininką, testą kiekvienai pridedamai taisyklei, vieną serializuotą kelią ir išmontavimą, kuris pašalina tik savo būseną. Kabliukas, kurį saugu paleisti du kartus, vertas daugiau nei kabliukas, kuris vieną kartą gudrus.

Susiję straipsniai