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 — және соған сәйкестендір. Сонда ереже қайта жүктеулер мен пакет жаңартуларынан кейін де сақталады. Ол сондай-ақ әріптесіңнің сенің сессия тарихынсыз түсінетін нәрсесіне айналады.
Қай механизмді қолданып жатқаныңды да нақты біл. cgroup v1-дің net_cls классификациясы мен cgroup v2-нің сокет сәйкестендіруі — әртүрлі нәрсе, ал құжаттамадағы ұқсас атаулы өріс оларды өзара алмастырылатын етпейді.
Екінші іздеуді route-тізбегі тудырады
Жергілікті жасалған трафик үшін тізбек түрі белгі қойылғаннан кейін бірдеңе бола ма, соны шешеді. filter түріндегі output-тізбегі пакетті белгілей алады, ал ядро өзі таңдаған маршрутты пайдалана береді. 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 ережесі симптомды түзетеді және қай трафик қай жолмен кеткенін ажырату қабілетіңді жояды. Белгіге, нақты шығыс интерфейсіне және мүмкін болса, қолданбаның өз мекенжайына сәйкестендір. Кең ережелерді жазу оңай, ал кейін тексеру мүмкін емес дерлік.
Ерекшеліктен әлі де не шығып кетеді
Атау шешімі басқа cgroup-тағы бөлек resolver процесінен келуі мүмкін, сондықтан браузер сокетін классификациялау оның іздеулерін классификацияламайды. Егер resolver сұраныстары туннельде қалып, қосылым оның сыртынан шықса, split-horizon жауаптары жолға сәйкес келмеуі мүмкін. Бұл сәйкессіздік DNS қатесіне ұқсайтын, бірақ ол емес ақаулар тудырады.
Көп конфигурацияда еншілес процестер cgroup-ты мұра етеді, бірақ өзін жеке scope-қа көшіретін көмекші мұра етпейді. Болжаудың орнына тексер, әсіресе өзін қайта іске қосатын нәрселер үшін.
Соңында, туннель өшкенде не болуы керектігін шеш. Үнсіз толық айналып өтуге айналатын ерекшелік — жабылу арқылы құлайтын ерекшеліктен басқа қауіпсіздік позициясы, және олардың тек біреуі ғана сенің ойлағаның.