nftables cgroup обилажење такође захтева исправку адресе извора
Означавање једне cgroup шаље је у другу табелу, а сокет задржава адресу коју је већ имао. Класификација, рутирање и превођење као три одвојена корака.
Означавање саобраћаја из једне cgroup је лакши део. Три одвојене одлуке морају да се поклопе пре него што једна апликација изађе кроз физички интерфејс, а све остало остане у тунелу: који сокет припада изузетку, које претраживање руте ознака покреће и коју адресу извора пакет носи када излази. Већина неуспелих покушаја први уради тачно, други напола, а трећи никада не погледа.
Три одлуке, не једна
Класификација одговара ко је изузет. Рутирање одговара где означени пакет уместо тога иде. Избор извора одговара шта ће удаљена страна видети и где одговор треба да се врати.
Ове ствари не успевају независно. Пакет може бити класификован, преусмерен на физички интерфејс и ипак носити приватну адресу коју ниједан надређени рутер не може да врати, што производи истек времена који изгледа тачно као блокада заштитног зида. Ништа у кораку класификације те не упозорава на то. Ништа ни у кораку рутирања.
Редослед је такође важан. Класификација се дешава када се пакет генерише, рутирање после тога, а превођење у тачки излаза.
Ако не можеш да наведеш која је од три фазе покварена, не дебагујеш, већ преуређујеш правила и надаш се.
Упореди cgroup која ће постојати и сутра
nftables може да провери cgroup v2 припадност сокета, што је заиста корисно јер прати процес, а не одредиште. Замка је идентификатор. Десктоп апликација покренута из менија често живи у пролазном scope-у чије се име мења при следећем покретању.
nft list ruleset
systemctl status session.slice 2>/dev/null
cat /proc/self/cgroupКопирање имена scope-а из једне сесије и тврдо кодирање даје правило које ради данас и тихо престаје да се поклапа сутра. Уместо тога стави апликацију у намерни, стабилни контекст извршавања, као што је посебан scope или unit који контролишеш, и упореди са њим. Правило тада преживљава рестарте и ажурирања пакета. Постаје и нешто о чему колега може да размишља без твоје историје сесија.
Буди прецизан и око тога који механизам користиш. net_cls класификација у cgroup v1 и упаривање сокета у cgroup v2 су различите ствари, а слично именовано поље у документацији не чини их заменљивим.
Друго претраживање покреће route ланац
За локално генерисан саобраћај, тип ланца одлучује да ли се нешто дешава након што се ознака постави. output ланац типа filter може да означи пакет и кернел ће наставити да користи руту коју је већ изабрао. Ланац типа route је механизам који тражи ново претраживање.
table inet bypass {
chain mark {
type route hook output priority mangle; policy accept;
socket cgroupv2 level 2 "app.slice" meta mark set 0x1 comment "app bypass"
}
}
ip rule add fwmark 0x1 lookup 200
ip route add default via 203.0.113.1 dev wlan0 table 200Ознаци затим треба правило политике које је шаље у табелу, а та табела мора бити потпуна: подразумевана рута, локална одредишта која су апликацији још потребна и надређени гејтвеј који заиста одговара.
Изабери вредност ознаке намерно. WireGuard користи сопствени fwmark за спољни транспортни саобраћај, а случајно слетање на исти број може да омете сопствени рутни изузетак тунела на начине које је болно дијагностиковати.
Адреса извора не прати руту
Сокет који је већ изабрао адресу извора за путању тунела задржава ту адресу и после преусмеравања. Ништа у промени руте је не преписује, зато пакет излази кроз физички интерфејс са приватним извором који надређена мрежа не може да врати.
Видљиви симптом је апликација која као да шаље податке и никада не добија одговор, и дневник заштитног зида који ништа не показује јер се пакет никада није вратио.
Уска исправка је правило превођења извора ограничено на ознаку те апликације и њен стварни излазни интерфејс, интегрисано са NAT-ом који већ постоји уместо да га замени:
table inet bypass {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
meta mark 0x1 oifname "wlan0" masquerade
}
}Преведи изузетак и ништа више. Опште masquerade правило исправља симптом и уништава способност да се каже који је саобраћај којим путем отишао. Упореди ознаку, стварни излазни интерфејс и, ако можеш, адресу саме апликације. Широка правила је лако написати и скоро немогуће касније ревидирати.
Шта још измиче изузетку
Разрешавање имена може да дође из одвојеног resolver процеса у другој cgroup, па класификација сокета прегледача не класификује његове претраге. Ако упити resolver-а остану у тунелу док веза излази изван њега, split-horizon одговори могу да се не поклопе са путањом. То неслагање производи кварове који изгледају као DNS грешке и нису.
Процеси деца наслеђују cgroup у већини поставки, али помоћник који се премешта у сопствени scope не наслеђује. Провери уместо да претпостављаш, посебно за све што се поново извршава.
На крају, одлучи шта треба да се деси када је тунел доле. Изузетак који тихо постаје потпуни обилазак је друга безбедносна позиција од оног који се затвара, и само један од њих је оно што си мислио.