Скрыпт спынення ці правіла фаеруола: што спыняе ўцечку?
Апусканне інтэрфейсаў пры адключэнні — грубы сродак, і часта ён выконваецца без правоў. Параўнайце яго з правілам фаеруола, якое перажывае абрыў і закрывае прамежак.
Дзве канструкцыі абяцаюць адно і тое ж: калі тунель падае, нічога не выходзіць вонкі ў адкрытым выглядзе. Адна запускае скрыпт пры спыненні і рэжа інтэрфейсы. Другая пакідае правіла фаеруола ў сіле і нічога не патрабуе ад кліента VPN. Яны розняцца ў тым, у каго ёсць права дзейнічаць, што адбываецца ў прамежку і як машына потым вяртаецца ў сетку. Параўноўваць іх па гэтых трох пунктах карысней, чым спрачацца, якое строгае.
Адна і тая ж праца праз два механізмы
Кліент можа запускаць хук пры ўздыме тунеля і пры яго спыненні, калі профіль дазваляе выкананне скрыптоў. Гэты хук працуе ўнутры жыццёвага цыклу кліента, у момант закрыцця злучэння. Правіла фаеруола, наадварот, належыць сістэме і не цікавіцца, ці кліент працуе, ці ўпаў, ці быў забіты.
| Property | Teardown script | Firewall unit |
|---|---|---|
| Runs when the client is killed | No | Yes |
| Needs privilege at teardown time | Usually yes | Configured once, at boot |
| Acts on the whole machine | Often, including recovery paths | Only on the flows it matches |
Гэтая табліца — увесь аргумент. Скрыпт, які працуе толькі пры акуратным завяршэнні, пакрывае выпадак, які вас турбаваў найменш; важны выпадак — гэта збой ці знікненне сеткі, і ні адзін з іх не дае чыстага спынення.
Што хук спынення можа і чаго не можа
Задакументаваны шаблон перабірае сеткавыя інтэрфейсы і апускае ўсё, акрамя loopback. Калі фізічны прыбор апушчаны, нішто не можа выйсці за межы тунеля, і гэта менавіта тое, што патрэбна.
#!/bin/sh
for dev in /sys/class/net/*; do
name=$(basename "$dev")
[ "$name" = lo ] || ip link set dev "$name" down
done
Ён таксама апускае лакальную сетку, любую службу, якую трымае машына, і шлях, якім вы б выправілі праблему. На ноўтбуку бесправадному прыбору часам патрэбна ручная перакідка пасля, таму кароткі перапынак ператвараецца ў сеанс рамонту. Горш за тое, хуку могуць не дазволіць рабіць усё гэта: калі кліент скідвае правы, скрыпт спынення працуе ад непрывілеяванага ўліковага запісу, і кожнае змяненне інтэрфейса падае з памылкай правоў, запісанай у той момант, калі ніхто не чытае журнал.
Праверце, як запускаецца кліент, перш чым давяраць хуку. Скрыпт, які працуе пры ручным запуску ад root, нічога не даказвае пра службу, што стартуе пры загрузцы.
Што правіла фаеруола робіць інакш
Правіла, якое дазваляе толькі трафік тунеля, працягвае працаваць, калі працэс кліента знік, бо ядро не залежыць ад гэтага працэсу. Правіла таксама вузейшае: яно блакуе менавіта тыя патокі, якім адпавядае, і пакідае loopback, лакальную падсетку і шлях аднаўлення ў спакоі, таму яно не пакідае машыну без выйсця.
Коштам з’яўляецца тое, што правіла павінен напісаць і захаваць той, хто валодае фаеруолам хоста, і яно павінна назваць прыладу тунеля, якую кліент сапраўды стварае. Гэта значыць, што правіла і профіль трэба падтрымліваць разам; перайменаваны інтэрфейс пакідае фаеруол, які блакуе ўсё і нічога не тлумачыць.
Ніводны механізм не робіць другі лішнім. Правіла фаеруола, якое ніколі не перачытваецца пасля праўкі, такое ж выдуманае, як скрыпт, які ніколі не запускаецца.
persist-tun вырашае, ці ёсць прамежак
Калі прылада тунеля перажывае адключэнне, маршруты, што вядуць у яе, таксама перажываюць. Тады трафік адкідаецца, а не перанакіроўваецца, таму маршрут па змаўчанні не вяртаецца на фізічны шлюз. Менавіта гэтыя паводзіны робяць уцечку малаімавернай яшчэ да ўдзелу любога правіла фаеруола.
Без гэтай налады прылада выдаляецца разам з маршрутамі, і маршрут па змаўчанні можа зноў паказваць на фізічны шлюз. Ці зробіць ён гэта — залежыць ад платформы і кліента, і менавіта таму стан трэба назіраць, а не меркаваць. Разглядайце наладу як частку kill switch, а не як опцыю прадукцыйнасці.
Трымайце шлях перападлучэння жывым, потым праверце чатыры станы
Строгі блок можа таксама перашкодзіць кліенту перападключыцца, бо кліенту ўсё яшчэ патрэбен маршрут да сервера праз фізічны шлюз, пакуль усё астатняе забаронена. Усталюйце маршрут хоста для гэтага адрасу яшчэ да ўздыму тунеля і спачатку развязайце імя, бо DNS можа быць заблакаваны да таго часу, як ён спатрэбіцца.
ip route add 198.51.100.20/32 via 192.168.0.1 dev wlan0
Потым правярайце станы, а не этыкетку. Прайдзіце чатыры моманты наўмысна: халодны старт без тунеля, здаровая сесія, абрыў, якога ніхто не прасіў, і сесія пасля аднаўлення. У кожны момант прачытайце маршрут па змаўчанні і зрабіце адзін запыт, чый адрас выхаду бачны. Праграма, якая здаецца, пакуль тунель апушчаны, нічога не кажа пра паштовы кліент ці абнаўляльнік, таму паўтарыце апошнюю праверку з адной фонавай праграмай. Запішыце правіла, назвы інтэрфейсаў і крокі аднаўлення, бо kill switch, які ніхто не можа праверыць, — гэта чутка.