Зошто куката на VPN огнениот ѕид го додава истото правило двапати
Повторното поврзување може повторно да ја изврши вашата кука, затоа проектирајте за саканата состојба: сопствени синџири, тест пред вметнување, една сериска промена и тесно демонтирање.
Куката работи првпат, а по три повторни поврзувања синџирот држи три копии од истото правило. Ништо не пропадна гласно; скриптата едноставно го правеше тоа што ѝ беше кажано при секое извршување. VPN куката е конфигурациска операција што може да работи повеќе од еднаш, затоа ѝ треба сопственик, сакана состојба и сериска промена. Одете по тој редослед и дупликатите престануваат.
Дајте им сопственик на правилата пред да напишете било кое
Одлучете кој синџир или табела ја поседува оваа интеграција пред да напишете едно правило. Посветен синџир што куката го создава и го празни е најјасната форма на сопственост, бидејќи чистењето потоа може да го отстрани тој синџир без да допре туѓа политика. Ако мора да додавате правила во заеднички синџир, означете ги со коментар за подоцнежното пребарување да ги најде точно вашите. Сопственоста го прави демонтирањето безбедно, а демонтирањето е делот што тивко пропаѓа.
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
Коментарот овде не е украс. Тој е разликата помеѓу отстранување на вашето правило и отстранување на правило што случајно изгледа слично, и опстојува во зачуваното множество правила. Напишете го коментарот еднаш во променлива и користете го истиот текст во секоја команда што додава, тестира или брише.
Тестирајте ја саканата состојба наместо повторно да додавате
Запишете што треба да постои додека тунелот е подигнат: кои интерфејси, кој извор и одредиште, кој протокол и кој порт. Потоа изразете го секое правило како тест по кој следи вметнување, за второто извршување да го најде правилото и да не направи ништо. Командата за проверка излегува со нула кога правилото постои, и тоа е точно сигналот што ѝ треба на скриптата. Референцата за iptables ги документира формите за проверка, додавање и вметнување што се користат овде.
iptables -C VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT ||
iptables -A VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
Бидете внимателни со позицијата. Проверка на правило и вметнување на чело може да премести дозвола пред намерно одбивање што претходно доаѓаше прво, па второто извршување го менува однесувањето иако не додава ништо. Додавајте на крајот во вашиот сопствен синџир и контролирајте го редоследот преку местото на скокот во тој синџир. Ако редоследот внатре во синџирот е важен, изградете го синџирот одново од познат список наместо да го крпите правило по правило.
Запрете ако потребното правило не може да се изрази како стабилен тест. Тоа обично значи дека саканата состојба е сѐ уште нејасна.
Серијализирајте ја промената наместо да се надевате дека ќе издржи
Два повикувања на куката може да се преклопат и двете може да видат отсутно правило пред едно од нив да го додаде. Опцијата за чекање на xtables ја тера командата да чека на бравата, но не ја прави низата провери-па-додај атомска низ две команди. Серијализирајте ја целата операција со сопствена брава или користете управувач што декларираната серија ја применува како една трансакција. nftables може второто, и тоа е една причина да го претпочитате на домаќини каде е достапно.
flock /run/vpn-hook.lock /usr/local/sbin/vpn-firewall-apply
nft -f /etc/nftables/vpn-hook.nft
Кој и механизам да изберете, држете го критичниот дел краток и направете го повторно влезен: кука што пропаѓа на половина пат треба да биде безбедна за повторно извршување. Запишете го исходот за повтореното извршување да биде видливо во дневникот наместо да се изведува од бројот на правила. Ако два различни надзорници можат да ја повикаат куката, прво тоа поправете го; ниедна брава не поправа два сопственици.
Демонтирајте само тоа што е ваше
Демонтирањето мора да разликува замена-врска од онаа што ја испрати во пензија, и мора да издржи настан што никогаш не добива уредно чистење. Бришете по истите идентификатори што ги користевте за додавање и никогаш не празнете заеднички синџир за да го поедноставите чистењето. По тврдо запирање, при следното стартување извршете проод за усогласување наместо да претпоставувате дека долната кука работела.
iptables -D VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
iptables -F VPN_HOOK
ip -brief link show type tun
Животниот век на интерфејсот исто така припаѓа на дизајнот. Повторното поврзување може да создаде уред со друго име, па правилото што тврдо го кодира името на вториот тунел застарува додека сѐ уште изгледа валидно. Претпочитајте го идентитетот што самата врска го открива и прочитајте го повторно при секое извршување. Тестирајте ги трите настани одделно: повторено поврзување, заменско поврзување и исклучување. Дозволениот сообраќај треба да ги преживее сите три без дупликати, а неповрзаните услуги треба да останат недопрени.
Прошетката завршува кога куката има сопственик, тест за секое правило што го додава, една серијализирана патека и демонтирање што отстранува само сопствена состојба. Кука што е безбедна за две извршувања вреди повеќе од кука што е еднаш умна.