nftables cgroup chetlab o'tish uchun manba manzilini tuzatish ham kerak
Bitta cgroup'ni belgilash uni boshqa jadvalga yuboradi, soket esa allaqachon ega bo'lgan manzilni saqlab qoladi. Tasniflash, marshrutlash va tarjima — uchta alohida qadam.
Bitta cgroup'dan kelgan trafikni belgilash — oson qismi. Bitta ilova jismoniy interfeysdan chiqib, qolgan hammasi tunnelda qolishi uchun uchta alohida qaror mos kelishi kerak: qaysi soket istisnoga tegishli, belgi qaysi marshrut qidiruvini ishga tushiradi va paket chiqayotganda qaysi manba manzilini olib yuradi. Muvaffaqiyatsiz urinishlarning ko'pchiligi birinchisini to'g'ri qiladi, ikkinchisini yarim, uchinchisiga esa umuman qaramaydi.
Uchta qaror, bitta emas
Tasniflash kim ozod qilinganiga javob beradi. Marshrutlash belgilangan paket o'rniga qayerga ketishiga javob beradi. Manba tanlovi uzoq tomon nima ko'rishiga va javob qayerga qaytishiga javob beradi.
Bular bir-biridan mustaqil ravishda ishlamay qoladi. Paket tasniflanishi, jismoniy interfeysga qayta yo'naltirilishi va baribir yuqori marshrutizator qaytara olmaydigan xususiy manzilni olib yurishi mumkin, bu esa xuddi tarmoq devori blokiga o'xshab ko'rinadigan vaqt tugashini keltirib chiqaradi. Tasniflash qadamida bu haqda hech narsa ogohlantirmaydi. Marshrutlash qadamida ham hech narsa yo'q.
Tartib ham muhim. Tasniflash paket yaratilganda sodir bo'ladi, marshrutlash undan keyin, tarjima esa chiqish nuqtasida.
Agar uchta bosqichdan qaysi biri buzilganini ayta olmasangiz, siz disk raskadrovka qilmayapsiz, qoidalarni qayta tartiblab, umid qilyapsiz.
Ertaga ham mavjud bo'ladigan cgroup'ni moslang
nftables soketning cgroup v2 a'zoligini tekshira oladi, bu haqiqatan foydali, chunki u manzilga emas, jarayonga ergashadi. Tuzoq — identifikator. Menyudan ishga tushirilgan ish stoli ilovasi ko'pincha keyingi ishga tushirishda nomi o'zgaradigan vaqtinchalik scope'da yashaydi.
nft list ruleset
systemctl status session.slice 2>/dev/null
cat /proc/self/cgroupScope nomini bitta sessiyadan ko'chirib, qat'iy yozib qo'yish bugun ishlaydigan va ertaga jimgina mos kelmay qoladigan qoida yaratadi. Buning o'rniga ilovani o'zingiz boshqaradigan alohida scope yoki unit kabi qasddan, barqaror bajarilish muhitiga joylashtiring va shunga moslang. Shunda qoida qayta yuklash va paket yangilanishlaridan omon qoladi. U hamkasbingiz sizning sessiya tarixingizsiz o'ylab ko'rishi mumkin bo'lgan narsaga ham aylanadi.
Qaysi mexanizmdan foydalanayotganingizda ham aniq bo'ling. cgroup v1'dagi net_cls tasnifi va cgroup v2'dagi soket mosligi boshqa narsalar, hujjatlardagi bir xil nomli maydon ularni almashtirib bo'ladigan qilmaydi.
Ikkinchi qidiruvni route zanjiri ishga tushiradi
Mahalliy yaratilgan trafik uchun zanjir turi belgi qo'yilgandan keyin biror narsa bo'ladimi-yo'qmi, shuni hal qiladi. filter turidagi output zanjiri paketni belgilay oladi va yadro allaqachon tanlagan marshrutni ishlatishda davom etadi. route turidagi zanjir yangi qidiruvni talab qiladigan mexanizmdir.
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 200Keyin belgiga uni jadvalga yuboradigan siyosat qoidasi kerak, va bu jadval to'liq bo'lishi kerak: standart marshrut, ilovaga hali kerak bo'lgan mahalliy manzillar va haqiqatan javob beradigan yuqori shlyuz.
Belgi qiymatini qasddan tanlang. WireGuard tashqi transport trafigi uchun o'z fwmark'idan foydalanadi va tasodifan bir xil raqamga tushish tunnelning o'z marshrut istisnosiga tashxis qilish qiyin bo'lgan tarzda xalaqit berishi mumkin.
Manba manzili marshrutga ergashmaydi
Tunnel yo'li uchun allaqachon manba manzilini tanlagan soket qayta yo'naltirilgandan keyin ham o'sha manzilni saqlaydi. Marshrut o'zgarishida uni qayta yozadigan hech narsa yo'q, shuning uchun paket yuqori tarmoq qaytara olmaydigan xususiy manba bilan jismoniy interfeysdan chiqadi.
Ko'rinadigan alomat — ma'lumot yuborayotgandek ko'rinadigan, lekin hech qachon javob olmaydigan ilova va paket hech qachon qaytmaganligi uchun hech narsa ko'rsatmaydigan tarmoq devori jurnali.
Tor tuzatish — o'sha ilovaning belgisi va uning haqiqiy chiqish interfeysi bilan cheklangan, allaqachon mavjud NAT bilan birlashtirilgan, uni almashtirmaydigan manba tarjimasi qoidasi:
table inet bypass {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
meta mark 0x1 oifname "wlan0" masquerade
}
}Faqat istisnoni tarjima qiling, boshqa hech narsani emas. Umumiy masquerade qoidasi alomatni tuzatadi va qaysi trafik qaysi yo'ldan ketganini aytish qobiliyatingizni yo'q qiladi. Belgi, haqiqiy chiqish interfeysi va iloji bo'lsa, ilovaning o'z manziliga moslang. Keng qoidalarni yozish oson, keyin audit qilish deyarli imkonsiz.
Istisnodan hali ham nima qochib ketadi
Nom echimi boshqa cgroup'dagi alohida resolver jarayonidan kelishi mumkin, shuning uchun brauzer soketini tasniflash uning qidiruvlarini tasniflamaydi. Resolver so'rovlari tunnelda qolib, ulanish uning tashqarisiga chiqsa, split-horizon javoblari yo'lga mos kelmasligi mumkin. Bu nomuvofiqlik DNS xatolariga o'xshab ko'rinadigan, lekin bo'lmagan nosozliklarni keltirib chiqaradi.
Ko'p sozlamalarda bola jarayonlar cgroup'ni meros oladi, lekin o'zini o'z scope'iga ko'chiradigan yordamchi olmaydi. Taxmin qilish o'rniga tekshiring, ayniqsa o'zini qayta ishga tushiradigan har bir narsa uchun.
Nihoyat, tunnel o'chirilganda nima bo'lishi kerakligini hal qiling. Jimgina to'liq chetlab o'tishga aylanadigan istisno, muvaffaqiyatsizlikda yopiladigan istisnodan boshqa xavfsizlik pozitsiyasi, va ulardan faqat bittasi siz nazarda tutgan narsa.