Уявіце правіла брандмаўэра, якое ўключае ICMP echo для публічнага адраса сервера кожны раз, калі падключаны названы прафіль VPN. Гэта чытаецца як «ping толькі праз тунель», і такое прачытанне памылковае ў важным сэнсе. Правіла не абмяжоўвае, хто можа дасягнуць хоста; яно змяняе тое, на што адказвае публічны інтэрфейс, пакуль нейкае іншае злучэнне выпадкова ўзнята. Гэта дзве розныя палітыкі, і адна з іх ціха пашырае ўздзеянне.

Правіла, якое вы нібыта напісалі

Меркаванае патрабаванне звычайна вузкае: сістэма маніторынгу або адзіны адміністратар у VPN павінны мець магчымасць пацвердзіць, што сервер жывы. Запісанае сказам, яно гучыць як кантроль доступу да тунеля. Запісанае як аб'ект брандмаўэра, яно ператвараецца ў умову на публічным прафілі, бо менавіта туды прыходзіць запыт echo.

Як толькі ўмовай становіцца стан злучэння, а не адрас крыніцы, набор дазволеных адпраўнікоў ужо не набор вузлоў VPN. Любы, хто можа дасягнуць публічнага адраса, можа адправіць запыт echo, пакуль брама адкрыта. Тунель не стаў шляхам; тунель стаў выключальнікам.

Тыя, хто прасоўвае гэтую ідэю, звычайна не ілгуць пра жаданы эфект. Ім патрэбна была праверка, якая адказвае толькі калі канал здаровы, а здароўе канала было найпрасцей назіраць праз VPN. Памылка ў тым, каб лічыць сігнал даступнасці рашэннем аб доступе і потым аўтаматызаваць яго.

Што брама насамрэч кантралюе

Гэты дызайн злівае дзве незалежныя рэчы, і іх раздзяленне — большая частка выпраўлення. Першае — ахоп: які лакальны адрас, якія аддаленыя адрасы, які пратакол і які тып ICMP. Другое — умова: ці ўключаны аб'ект правіла ў гэты момант. Ахоп — гэта тое, што брандмаўэр ацэньвае для кожнага пакета; умова — гэта тое, што скрыпт запісвае ў сховішча палітыкі, і яны ўзгадняюцца па цалкам розных гадзінніках.

Калі патрабаванне сапраўды толькі вузлы VPN, ахоп адказвае на яго без любой логікі стану злучэння: прывяжыце правіла да інтэрфейса тунеля або да дыяпазону адрасоў тунеля, абмяжуйце аддаленыя адрасы пулам кліентаў і ўкажыце тып echo замест «ICMP». Такое правіла застаецца правільным, калі ніводзін VPN не ўзняты, і яго нельга адкрыць староннім прафілем.

Калі патрабаванне сапраўды публічная брама, скажыце пра гэта ў тэксце палітыкі, бо крытэрыі прыёмкі змяняюцца. Публічная брама павінна назваць дакладны прафіль, вызначыць, што значыць «падключаны», і заявіць, што публічныя адпраўнікі ўваходзяць у ахоп па задуме. Большасць блытаніны знікае ў момант, калі кагосьці прымушаюць запісаць гэты сказ.

Пабудуйце аб'ект адзін раз, потым перамыкайце яго

Заздагадзь стварыце адно правіла за стабільным ідэнтыфікатарам, выключанае, і дазвольце кантролеру змяняць толькі яго стан уключэння. Стварэнне правілаў па адлюстраваным імені пры кожным запуску — гэта шлях да таго, што ў сховішчы палітыкі застанецца пяць амаль аднолькавых аб'ектаў і не будзе надзейнага спосабу іх выдаліць.

New-NetFirewallRule -Name "VpnGateEchoV4" -DisplayName "Public echo gated on VPN state" -Direction Inbound -Action Allow -Protocol ICMPv4 -IcmpType 8 -LocalAddress 203.0.113.10 -RemoteAddress Any -Enabled False
Set-NetFirewallRule -Name "VpnGateEchoV4" -Enabled True

Імя — гэта трывалы ідэнтыфікатар; адлюстраванае імя — дакументацыя, якую чалавек можа рэдагаваць. Узгадняйце па -Name, і скрыпт перастане ствараць дублі. Тая ж форма каманды пакрывае выпадак IPv6 з -Protocol ICMPv6 -IcmpType 128, але гэта асобнае правіла, бо нумары тыпу echo розныя ў двух сямействах.

Трымайце сямейства адрасоў і тып ICMP відавочнымі ящь і па другой прычыне: -Protocol ICMPv4 без тыпу дазваляе любое паведамленне ICMPv4, якое дапускае прафіль, уключаючы тыя, якія вы ніколі не збіраліся прымаць. Названне тыпу 8 звужае правіла да запыту echo, а гэта адзінае, што адпраўляе праверка дасяжнасці.

Дзе аўтаматызацыя супярэчыць намеру

Апытанне кліенцкага прафілю кожныя некалькі хвілін не можа даць імгненную мяжу. Паміж падзеннем злучэння і наступным апытаннем правіла ўсё ящчэ адказвае на публічным адрасе; паміж узняццем злучэння і наступным апытаннем — не адказвае. Прызнаць гэтую затрымку сумленна, а сцвярджаць, што дызайн забяспечвае строгі інварыянт, — не.

У самой праверцы стану ёсць пастка ахопу. Get-VpnConnection паказвае кліенцкія прафілі, наладжаныя на машыне, па змаўчанні для бягучага карыстальніка і для ўсіх карыстальнікаў з -AllUserConnection. Ён не паказвае аддаленых карыстальнікаў, якія зараз падключаныя да сервера RRAS; гэта іншае назіранне з іншай камандай. Брама, пабудаваная на няправільным, не звязана ні з чым.

Затым пакрыйце станы, якія ніхто не праграмуе: запуск з ужо ўключаным правілам ад папярэдняга запуску, падзенне кантролера пры адкрытай браме і выдаленне прафілю, пакуль яго правіла застаецца актыўным. Кожнаму патрэбна вызначанае значэнне па змаўчанні, і бяспечным значэннем па змаўчанні для публічнага дазволу з'яўляецца выключэнне. Калі патрабаванне сапраўды не церпіць акно апытання, правіла, прывязанае да стану, — няправільны інструмент, і прымус належыць тунелю, а не публічнаму інтэрфейсу.

Нарэшце, праверце публічны запыт два разы: адзін раз з узнятым выбраным злучэннем і адзін раз з апушчаным, з хоста, які не ў VPN. Паспяховы ping знутры тунеля нічога не даказвае пра гэтую палітыку, і менавіта гэтае вымярэнне большасць разгортванняў прапускае.

Падобныя артыкулы