Заблакаваць адзін дыяпазон прызначэння для кожнага пула кліентаў VPN
Адно правіла nftables можа адхіліць прэфікс прызначэння для дапушчанага пула VPN, не закранаючы ўласны трафік шлюза. Улічыце крук і пазіцыю.
Адно правіла можа ўтрымаць дапушчаны пул VPN далей ад дыяпазону прызначэння, не перашкаджаючы нічому іншаму, што робіць шлюз. Само правіла кароткае; тое, што вырашае, ці будзе яно працаваць, — гэта крук, у якім яно жыве, і яго пазіцыя ў ланцугу. Калі памыліцца ў гэтых двух, атрымаецца файрвол, які выглядае правільным і трымаецца няўстойліва. Пачніце з таго, што робіць пакет, калі правіла яго бачыць.
Што правіла фактычна супастаўляе
Правіла супастаўляе тры рэчы адначасова: уваходны інтэрфейс, прэфікс крыніцы і прэфікс прызначэння. Усе тры павінны быць праўдзівымі, перш чым спрацуе адхіленне, і менавіта гэта робіць яго вузкім. Чытаць яго як адзін выраз прасцей, чым як тры асобныя палітыкі.
Супастаўленне інтэрфейса адрознівае перанакіраваны кліенцкі трафік ад уласных злучэнняў шлюза. Без яго правіла, якое называе толькі пул крыніцы, закранула б таксама пакеты, якія шлюз сам стварае з гэтага адраса, калі гэта калі-небудзь адбываецца. Прэфікс крыніцы абмяжоўвае палітыку дапушчанымі кліентамі, а прэфікс прызначэння — адным дыяпазонам. Чытайце правіла як перасячэнне, а не як спіс.
Запішыце тры значэнні, перш чым нешта змяняць: імя тунельнага інтэрфейса, пул, які выдае сервер, і прэфікс, які вы збіраецеся адхіліць. Друкарская памылка ў любым з іх дасць правіла, якое чыста разбираецца і нічога не абараняе. Трымайце гэтыя тры значэнні ў запісе пра змену побач з правілам.
Крук вырашае, на каго дзейнічае правіла
Ланцуг netfilter прымацоўваецца да крука, і менавіта крук вызначае, якія пакеты ланцуг увогуле бачыць. Крук forward бачыць трафік, які маршрутызуецца праз шлюз, а гэта і ёсць трафік ад кліента да прызначэння. Усё астатняе ў ланцугу накіравана на іншую аўдыторыю.
Крук input бачыць трафік, адрасаваны самому шлюзу, таму правіла, размешчанае там, кіруе доступам да яго ўласных службаў, а не транзітам. Крук output бачыць трафік, які шлюз стварае сам, а гэта процілегласць таму, што патрэбна палітыцы пула кліентаў. Назвы ланцугоў — адвольныя этыкеткі, выбраныя тым, хто пісаў набор правілаў, таму не выводзіце крук з назвы. Праверце, куды прымацаваны ланцуг, перш чым меркаваць, што ён можа супаставіць.
| Hook | Traffic it sees | Right for this policy |
|---|---|---|
| input | Addressed to the gateway | No, that is the host's own services |
| forward | Routed through the gateway | Yes, for client-to-destination traffic |
| output | Generated by the gateway | No, that is the opposite direction |
Чытанне мацавання — гэта праверка ў адзін радок, якая не дае правілу трапіць у ланцуг, які ніколі не бачыць пакет.
Размясціце правіла перад шырокім accept
Правілы ацэньваюцца па парадку, і першы вердыкт перамагае. Шырокі accept раней у ланцугу спыняе ацэнку для пакетаў, якія ён супастаўляе, таму адхіленне, дададзенае пасля, для іх ніколі не выконваецца. Гэтае правіла парадку — уся прычына таго, што правільна выглядаючае правіла можа не мець эфекту.
Устаўце правіла перад accept, а не дадавайце яго ў канец. Калі ланцуг ужо змяшчае агульны accept для тунельнага інтэрфейса, новае правіла павінна ісці перад ім, інакш яно дэкаратыўнае. Праверце выніковы парадак, а не файл, які вы правілі, бо набор правілаў, сабраны з некалькіх файлаў, можа не супадаць ні з адным з іх. Затым пацвердзіце тэставым пакетам з пула.
sudo nft list chain inet filter forward
sudo nft insert rule inet filter forward iifname "tun0" ip saddr 10.90.0.0/24 ip daddr 198.51.100.0/24 drop
sudo nft -c -f /etc/nftables.conf
Трэцяя каманда разбирае файл, не прымяняючы яго, што ловіць сінтаксічныя памылкі, пакуль яны не сталі збоем. Прымяняйце з планам адкату, бо памылковае правіла ў ланцугу forward можа перарэзаць тунель, праз які вы працуеце.
Існуючыя патокі не зважаюць на ваша новае правіла
Запіс conntrack, створаны да таго, як правіла з'явілася, працягвае супадаць з ранейшым accept. Таму новае адхіленне часам выглядае працоўным для свежых злучэнняў і нічога не робіць для таго, якое тэстуецца.
Прачытайце супастаўленне стану ўверсе ланцуга. Калі яно прымае established і related трафік перад вашым правілам, кожны паток, які ўжо ідзе, працягвае ісці, пакуль не закрыецца. Звычайна гэта менавіта тое паводзіны, якое вы хочаце для аварыйнага правіла, і гэта блытае, калі вы чакаеце імгненнага перапынку. Вырашыце, які эфект вам патрэбны, перад разгортваннем. Тэст, які паўторна выкарыстоўвае адкрытае злучэнне, раскажа вам няправільную гісторыю.
sudo conntrack -L -s 10.90.0.14 -d 198.51.100.20
sudo nft list ruleset | grep -n -A3 'ct state'
Першая каманда паказвае, ці існуе паток, а другая — ці працягвае ранняе правіла стану яго прымаць. Абедзве толькі чытаюць і бяспечныя падчас інцыдэнту.
Чым гэта правіла не з'яўляецца
Правіла не з'яўляецца чорным спісам даменаў, палітыкай IPv6 ці абмежаваннем для асобнага акаўнта праграмы.
Кожнаму з гэтага патрэбны свой механізм. Блакаванне дамена павінна разбіраць імёны, чаго фільтр пакетаў не робіць. Трафік IPv6 патрабуе ўласнага супастаўлення, бо выраз ip нічога не кажа пра пакеты ip6. Абмежаванне на ўзроўні праграмы належыць службе або аўтэнтыфікаванаму проксі, а не супастаўленню прэфікса. Менавіта раздзяленне гэтых патрабаванняў не дае ўскласці чатыры задачы на адно вузкае правіла.
Кантракт, які дае гэта правіла, дакладны: трафік з дапушчанага пула да аднаго прэфікса прызначэння адхіляецца, а несур'ёзны трафік шлюза захоўвае сваю бягучую палітыку. Запішыце гэты сказ побач з правілам, і наступны чалавек будзе ведаць, для чаго яно было.