Блокирајте један опсег одредишта за сваки VPN клијентски базен
Једно nftables правило може да одбије префикс одредишта за дозвољени VPN базен, а да не дирне сопствени саобраћај пролаза. Ускладите hook и позицију.
Једно правило може да држи дозвољени VPN базен далеко од опсега одредишта, а да не поремети ништа друго што пролаз ради. Само правило је кратко; делови који одлучују да ли ради јесу hook у коме живи и његова позиција у ланцу. Ако погрешите у та два, добијате заштитни зид који изгледа исправно и понаша се недоследно. Почните од онога што пакет ради када га правило види.
Шта правило заправо упоређује
Правило упоређује три ствари истовремено: улазни интерфејс, префикс извора и префикс одредишта. Сва три морају бити тачна пре него што се примени drop, и то га држи уским. Читати га као један израз лакше је него као три одвојене политике.
Упоређивање интерфејса разликује прослеђени клијентски саобраћај од сопствених веза пролаза. Без тога би правило које наводи само базен извора утицало и на пакете које сам пролаз ствара са те адресе, ако се то икада догоди. Префикс извора ограничава политику на дозвољене клијенте, а префикс одредишта на један опсег. Читајте правило као пресек, а не као списак.
Запишите три вредности пре него што било шта промените: назив тунелског интерфејса, базен који сервер дели и префикс који намеравате да одбијете. Грешка у куцању у било којој од њих даје правило које се чисто парсира и ништа не штити. Држите те три вредности у запису о промени поред правила.
Hook одлучује на кога се правило примењује
netfilter ланац је прикачен на hook, и hook одлучује које пакете ланац уопште види. Hook forward види саобраћај који се рутира кроз пролаз, а то је саобраћај од клијента ка одредишту. Све остало у ланцу је усмерено ка другој публици.
Hook input види саобраћај адресиран на сам пролаз, па правило постављено тамо управља приступом његовим сопственим сервисима, а не транзитом. Hook output види саобраћај који пролаз сам ствара, што је супротно од онога што је потребно политици клијентског базена. Називи ланаца су произвољне ознаке које је изабрао онај ко је написао скуп правила, зато не закључујте hook из назива. Проверите где је ланац прикачен пре него што претпоставите шта може да упореди.
| 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 раније у ланцу завршава оцену за пакете које упоређује, па се drop додат касније никада не извршава за њих. То правило реда је читав разлог зашто исправно правило може да нема ефекта.
Уметните правило пре 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-у. Зато нови drop понекад изгледа да ради за свеже везе, а не ради ништа за ону која се тестира.
Прочитајте упоређивање стања на врху ланца. Ако прихвата 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 пакетима. Ограничење на нивоу апликације припада сервису или аутентификованом проксију, а не упоређивању префикса. Управо раздвајање тих захтева спречава да се од једног уског правила траже четири посла.
Уговор који ово правило испоручује је прецизан: саобраћај из дозвољеног базена ка једном префиксу одредишта се одбија, док неповезани саобраћај пролаза задржава своју постојећу политику. Напишите ту реченицу поред правила и следећи човек ће знати чему је служило.