Бир 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'ко көчүргөн жардамчы мурастабайт. Болжолдоонун ордуна текшер, айрыкча өзүн кайра иштеткен нерселер үчүн.

Аягында, туннел өчүп калганда эмне болушу керектигин чеч. Унчукпай толук айланып өтүүгө айланган өзгөчөлүк — жабылуу менен кулаган өзгөчөлүктөн башка коопсуздук позициясы, жана алардын бирөө гана сенин ойлогонуң.

Тектеш макалалар