Спыніце доступ кліентаў VPN адзін да аднаго ў тунелі
Дасягнуць сэрвісу — гэта маршрут, дасягнуць іншага кліента — гэта палітыка. Знайдзіце кропку перасылкі, якая вырашае трафік паміж кліентамі, затым дакажыце забарону з кліента.
Два кліенты могуць абодва адкрываць прамежкавы хост і ўсё ж не мець падстаў адкрываць адзін аднаго. Дасягненне сэрвісу — гэта рашэнне аб перасылцы, а дасягненне іншага кліента — рашэнне палітыкі, і большасць стэкаў VPN трымае іх у асобных аб'ектах. Нішто з настроенага для першага не выконвае другое. Таму задача не ў тым, каб дадаць правіла, а ў тым, каб знайсці аб'ект, які вырашае трафік паміж кліентамі на гэтым серверы, запісаць забарону там і даказаць яе з кліента.
Маршрут да агульнага сэрвісу не з'яўляецца дазволам паміж кліентамі
Анонс падсеткі кліентаў паведамляе іншаму кліенту, як змясціць пакет у сетку ў бок адраса іншага кліента. Ці будзе гэты пакет дастаўлены, вырашаецца пасля, тым, што яго перасылае. На шлюзе Linux гэта ланцуг FORWARD; унутры дэмана ў прасторы карыстальніка — уласная табліца сеансаў тунеля. Маршрут адказвае на пытанне дасяжнасці і пакідае дазвол некранутым.
Таму праверка ізаляцыі, якая чытае толькі маршруты, нічога не даказвае. /24 можна прасунуць кожнаму кліенту, а кожны пакет паміж кліентамі будзе адкінуты на хоку перасылкі. Небяспечны выпадак — адваротны: няма яўнага правіла, дазвольнае значэнне па змаўчанні, і ізаляцыя існуе толькі таму, што ніхто яе не правяраў.
Запішыце патрабаванне адным радком, перш чым адкрыць тэрмінал. Дасягайце блока сэрвісаў і прамежкавага хоста, не дасягайце нічога іншага ўнутры блока кліентаў.
Вызначце, хто насамрэч перасылае пакет паміж кліентамі
Дзве паводзіны сервера выглядаюць аднолькава з боку кліента і патрабуюць розных правілаў. Або ядро зноў перасылае пакет з інтэрфейса тунеля, або дэман капіруе яго паміж сеансамі, і ядро яго ніколі не бачыць.
WireGuard належыць да першай групы: у ім няма перамыкача паміж кліентамі, таму пакет ад 10.8.0.4 да 10.8.0.5 прыходзіць на wg0, трапляе на хок перасылкі і зноў накіроўваецца з wg0, калі AllowedIPs пакрывае абодва адрасы. OpenVPN — другая група, калі ў канфігурацыі сервера зададзены client-to-client, бо гэтая дырэктыва перадае пакет паміж сеансамі ў прасторы карыстальніка. Праверце загружаную канфігурацыю на наяўнасць гэтай дырэктывы, перш чым нешта пісаць. Правіла ядра, якое ніколі не бачыць трафіку, не адрозніць ад правіла, якое працуе, і менавіта так разгортванне застаецца зусім без ізаляцыі.
Чытайце эфектыўную канфігурацыю, а не файл, які вы мяркуеце загружаным, бо дыстрыбутыўныя пакеты прыносяць уласныя ўключэнні. Калі перасылае дэман, забарона месціцца ў яго ўласных сродках кантролю для кожнага кліента, а хост-фаервол фільтруе толькі трафік, адрасаваны хосту. Калі перасылае ядро, хок перасылкі — адзінае месца, якое мае значэнне.
Маршрутызаваныя і трансляцыйныя разгортванні патрабуюць яшчэ адной праверкі: крыніца, якую бачыць далёкі кліент, можа не быць той, якую вы чакаеце. Тады правіла, якое адпавядае падсетцы кліентаў, не адпавядае нічому. Запішыце адрас, які застаецца пасля трансляцыі, перад напісаннем умовы, і аддавайце перавагу супадзенню пары інтэрфейсаў, а не здагадкам пра адрасы NAT.
Дайце кожнаму адрасу асобную ідэнтычнасць, якую можна адклікаць
Ізаляцыя рушыцца, як толькі дзве прылады дзеляць адзін дакумент. Правіла, прывязанае да гэтай ідэнтычнасці, не можа іх раздзяліць, а адкліканне страчанага ноўтбука адклікае ўсю групу. Сертыфікаты на кожную прыладу або ключы на кожнага кліента захоўваюць адкліканне лакальным, а палітыку чытэльнай, бо кожны адрас адпавядае роўна аднаму чалавеку або машыне. Калі праект гэтага не дазваляе, скажыце пра гэта ў інструкцыі, а не называйце правіла дробназярністым.
Размеркаванне адрасоў павінна ўзгадняцца з палітыкай. Зарэзервуйце блок для сэрвісаў, блок для кліентаў і выдавайце адрасы кліентаў з пула, які вы кантралюеце, а не з дыяпазону «хто першы». Калі сервер транслюе або мастуе, трымайце табліцу адпаведнасці побач з канфігурацыяй, бо менавіта яна патрэбна наступнаму чытачу, каб вывесці правіла нанова.
Пастаўце забарону там, дзе пакет перасякае тунель
На шлюзе, які перасылае трафік WireGuard, выпадак пакрываюць два правілы: дазволіць блок сэрвісаў, потым адкінуць рэшту блока кліентаў. Пара інтэрфейсаў важная гэтак жа, як і адрасы, бо супадзенне толькі па прызначэнні зловіць і трафік з LAN. Загружайце іх у гэтым парадку, каб дазвол разглядаўся першым.
З nftables пара трапляе ў існуючую табліцу inet filter, спачатку дазвол, потым адхіленне. Абодва супадзенні фіксуюць пару інтэрфейсаў разам з адрасамі.
nft add rule inet filter forward iifname "wg0" oifname "wg0" ip saddr 10.8.0.0/24 ip daddr 10.8.2.0/24 accept
nft add rule inet filter forward iifname "wg0" oifname "wg0" ip saddr 10.8.0.0/24 ip daddr 10.8.0.0/24 drop
Пасля загрузкі прачытайце ланцуг назад, замест таго каб давяраць коду выхаду, і пераканайцеся, што абодва правілы стаяць у патрэбным парадку. Дадайце адпаведныя правілы ip6 для пула IPv6, інакш пара v4 на двухстэкавым тунелі — проста дэкор. Калі ў сервера ўжо ёсць дазвольная палітыка перасылкі, дадайце адхіленне, а не замяняйце ланцуг цалкам.
Калі на OpenVPN уключаны client-to-client, гэтыя правілы перасылкі ніколі не супадаюць з трафікам паміж кліентамі, і забарона павінна жыць ва ўласных сродках кантролю дэмана. Пакіньце правілы ядра для трафіку, адрасаванага хосту, але не лічыце іх сродкам ізаляцыі.
Дакажыце забарону з кліента, а не з сервера
Тэставанне са шлюза нічога не даказвае, бо лакальна створаны трафік ідзе шляхам вываду і ніколі не перасякае хок перасылкі. Выкарыстайце двух сапраўдных кліентаў: адзін павінен дасягнуць сэрвісу, другі павінен быць адхілены. Спачатку запусціце выпадак дазволу, каб зламаны тунель не прынялі за працоўную палітыку.
З дазволенага кліента пераканайцеся, што сэрвіс адказвае на сваім порце. З таго ж кліента паспрабуйце адрас іншага кліента і чакайце ціхага адкідання, а не адмовы:
ping -c 3 -W 2 10.8.0.5
nc -z -w 2 10.8.0.5 22
nft list chain inet filter forward
iptables -vnL FORWARD
ping -6 -c 3 -W 2 fd00:8::5
Адкінуты пакет і кліент не ў сетцы выглядаюць аднолькава — як тайм-аўт, таму праверце лічыльнікі, перш чым рабіць высновы. Пераканайцеся, што лічыльнік правіла адхілення расце, пакуль кліент дакладна ў сетцы. Паўтарыце праз IPv6, дзе адсутнае правіла ip6 пакідае забарону v4 эфектнай. Запішыце прынятыя і адхіленыя вынікі ў інструкцыю з датай, бо наступная міграцыя выведзе правіла нанова.