Нэг cgroup-ийн урсгалыг тэмдэглэх нь хялбар хэсэг. Нэг аппликейшн физик интерфейсээр гарч, бусад бүх зүйл туннельд үлдэхийн тулд гурван тусдаа шийдвэр нийцэх ёстой: аль socket нь үл хамаарах зүйлд хамаарах, тэмдэг ямар маршрутын хайлт үүсгэх, пакет гарахдаа ямар эх хаяг зөөх. Амжилтгүй оролдлогын ихэнх нь эхнийхийг зөв хийдэг, хоёр дахьыг хагас, гурав дахь руу огт хардаггүй.

Гурван шийдвэр, нэг биш

Ангилал нь хэнийг чөлөөлсөн гэдэгт хариулна. Маршрутлал нь тэмдэглэсэн пакет оронд нь хаашаа явахыг хариулна. Эх сурвалжийн сонголт нь холын тал юу харах, хариу хаашаа буцахыг хариулна.

Эдгээр нь бие даан бүтэлгүйтдэг. Пакетыг ангилж, физик интерфейс рүү дахин чиглүүлсэн ч дээд маршрутизатор буцааж чадахгүй хувийн хаяг зөөсөн хэвээр байж болох бөгөөд энэ нь галт ханын блоктой яг адил харагдах таймаут үүсгэдэг. Ангиллын алхамд энэ тухай юу ч анхааруулдаггүй. Маршрутын алхамд ч мөн адил.

Дараалал ч чухал. Ангилал пакет үүсэх үед, маршрутлал түүний дараа, хөрвүүлэлт гарах цэг дээр болно.

Гурван шатны аль нь эвдэрснийг нэрлэж чадахгүй бол та дебаг хийж байгаа юм биш, дүрмүүдийг дахин цэгцэлж, найдаж байгаа хэрэг.

Маргааш ч байх cgroup-той тааруул

nftables нь socket-ийн 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-ийн socket тааруулга нь өөр зүйл бөгөөд баримт бичиг дэх ижил нэрт талбар тэдгээрийг сольж болох болгодоггүй.

Хоёр дахь хайлтыг 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-ыг ашигладаг бөгөөд санамсаргүйгээр ижил тоонд хүрэх нь туннелийн өөрийн маршрутын үл хамаарах зүйлд оношлоход хэцүү байдлаар саад болж болно.

Эх сурвалжийн хаяг маршрутыг дагадаггүй

Туннелийн замд эх хаягаа аль хэдийн сонгосон socket нь дахин чиглүүлсний дараа ч тэр хаягаа хадгална. Маршрутын өөрчлөлтөд түүнийг дахин бичдэг юу ч байхгүй, тиймээс пакет дээд сүлжээ буцааж чадахгүй хувийн эхтэйгээр физик интерфейсээр гарна.

Харагдах шинж тэмдэг нь өгөгдөл илгээж байгаа мэт боловч хэзээ ч хариу авдаггүй аппликейшн, пакет буцаж ирээгүй тул юу ч харуулдаггүй галт ханын лог юм.

Нарийн засвар нь тэр аппликейшний тэмдэг болон түүний бодит гаралтын интерфейст хязгаарлагдсан, аль хэдийн байгаа NAT-тай нэгтгэсэн, түүнийг орлуулахгүй эх сурвалжийн хөрвүүлэлтийн дүрэм юм:

table inet bypass {
  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept;
    meta mark 0x1 oifname "wlan0" masquerade
  }
}

Зөвхөн үл хамаарах зүйлийг хөрвүүл, өөр юуг ч биш. Ерөнхий masquerade дүрэм шинж тэмдгийг засдаг ч аль урсгал аль замаар явсныг ялгах чадварыг чинь устгадаг. Тэмдэг, бодит гаралтын интерфейс, боломжтой бол аппликейшний өөрийн хаягтай тааруул. Өргөн дүрмийг бичихэд хялбар, дараа нь аудит хийхэд бараг боломжгүй.

Үл хамаарах зүйлээс юу ч орхигдсоор байна

Нэрийн шийдэл өөр cgroup дахь тусдаа resolver процессоос ирж болох тул хөтчийн socket-ийг ангилсан нь түүний хайлтыг ангилдаггүй. Resolver-ийн асуулга туннельд үлдэж, холболт түүнээс гадагш гарвал split-horizon хариунууд замтай нийцэхгүй байж болно. Тэр зөрүү нь DNS алдаа мэт харагдах боловч тийм биш доголдол үүсгэдэг.

Ихэнх тохиргоонд хүү процессууд cgroup-ийг өвлөдөг, гэхдээ өөрийгөө өөрийн scope руу зөөдөг туслах өвлөдөггүй. Таамаглахын оронд шалга, ялангуяа өөрийгөө дахин ажиллуулдаг бүх зүйлд.

Эцэст нь туннель унасан үед юу болох ёстойг шийд. Чимээгүйгээр бүрэн тойрч гарах болсон үл хамаарах зүйл нь хаагдаж унадаг үл хамаарах зүйлээс өөр аюулгүй байдлын байрлал бөгөөд зөвхөн нэг нь л таны хүссэн зүйл.

Холбоотой нийтлэлүүд