nftables cgroup yan keçidi də mənbə ünvanı düzəlişi tələb edir
Bir cgroup-un işarələnməsi onu başqa cədvələ göndərir və socket artıq malik olduğu ünvanı saxlayır. Təsnifat, marşrutlaşdırma və tərcümə üç ayrı addımdır.
Bir cgroup-dan gələn trafiki işarələmək asan hissədir. Bir tətbiqin fiziki interfeysdən çıxması, qalan hər şeyin isə tuneldə qalması üçün üç ayrı qərarın uyğunlaşması lazımdır: hansı socket istisnaya aiddir, işarə hansı marşrut axtarışını tetikləyir və paket çıxarkən hansı mənbə ünvanını daşıyır. Uğursuz cəhdlərin çoxu birincini düzgün edir, ikincisini yarımçıq edir və üçüncüyə heç baxmır.
Üç qərar, bir deyil
Təsnifat kimin azad olduğunu cavablandırır. Marşrutlaşdırma işarələnmiş paketin əvəzində hara getdiyini cavablandırır. Mənbə seçimi uzaq tərəfin nə görəcəyini və cavabın hara qayıtmalı olduğunu cavablandırır.
Bunlar bir-birindən asılı olmayaraq uğursuz olur. Paket təsnif edilə, fiziki interfeysə yenidən yönləndirilə və yenə də yuxarı marşrutlaşdırıcının qaytara bilmədiyi şəxsi ünvan daşıya bilər; bu da firewall blokuna tam bənzəyən bir timeout yaradır. Təsnifat addımında heç nə sizi bu barədə xəbərdar etmir. Marşrutlaşdırma addımında da heç nə.
Sıra da vacibdir. Təsnifat paket yaradılanda baş verir, marşrutlaşdırma ondan sonra baş verir, tərcümə isə çıxış nöqtəsində baş verir.
Üç mərhələdən hansının pozulduğunu deyə bilmirsinizsə, siz sazlama etmirsiniz, qaydaları yenidən düzür və ümid edirsiniz.
Sabah da mövcud olacaq cgroup ilə uyğunlaşdırın
nftables socket-in cgroup v2 üzvlüyünü yoxlaya bilər və bu, həqiqətən faydalıdır, çünki təyinatı deyil, prosesi izləyir. İncə məqam identifikatordur. Menyudan başladılan masaüstü tətbiqi çox vaxt adı növbəti işə salmada dəyişən keçici bir scope-da yaşayır.
nft list ruleset
systemctl status session.slice 2>/dev/null
cat /proc/self/cgroupBir sessiyadan scope adını kopyalayıb kodda bərkitmək bu gün işləyən və sabah səssizcə uyğunlaşmağı dayandıran qayda yaradır. Əvəzində tətbiqi qəsdən seçilmiş, sabit icra kontekstinə, məsələn nəzarət etdiyiniz xüsusi bir scope və ya unit-ə qoyun və onunla uyğunlaşdırın. Onda qayda yenidən başlatmalardan və paket yeniləmələrindən sonra da qalır. Həm də həmkarınızın sizin sessiya tarixçəniz olmadan üzərində düşünə biləcəyi bir şey olur.
Hansı mexanizmi istifadə etdiyiniz barədə də dəqiq olun. Cgroup v1 net_cls təsnifatı və cgroup v2 socket uyğunlaşdırması fərqli şeylərdir və sənədləşdirmədə oxşar adlı sahənin olması onları bir-birini əvəz edən etmir.
İkinci axtarışı tetikləyən şey route tipli zəncirdir
Yerli olaraq yaradılan trafik üçün zəncirin tipi işarə qoyulandan sonra nəyinsə baş verib-vermədiyini müəyyən edir. filter tipli output zənciri paketi işarələyə bilər və kernel artıq seçdiyi marşrutu istifadə etməyə davam edəcək. route tipli zəncir isə yeni axtarış tələb edən 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 200Sonra işarəyə onu cədvələ göndərən siyasət qaydası lazımdır və həmin cədvəl tam olmalıdır: defolt marşrut, tətbiqin hələ ehtiyac duyduğu istənilən yerli təyinatlar və həqiqətən cavab verən yuxarı şlüz.
İşarə dəyərini qəsdən seçin. WireGuard xarici nəqliyyat trafiki üçün öz fwmark-ını istifadə edir və təsadüfən eyni rəqəmə düşmək tunelin öz marşrut istisnasına diaqnozu ağrılı olan şəkildə müdaxilə edə bilər.
Mənbə ünvanı marşrutu izləmir
Tunel yolu üçün artıq mənbə ünvanı seçmiş socket yenidən yönləndirmədən sonra həmin ünvanı saxlayır. Marşrut dəyişikliyində heç nə onu yenidən yazmır və buna görə paket fiziki interfeysdən yuxarı şəbəkənin qaytara bilmədiyi şəxsi mənbə ilə çıxır.
Görünən simptom məlumat göndərdiyi halda heç vaxt cavab almayan tətbiq və paket heç geri qayıtmadığı üçün heç nə göstərməyən firewall jurnalıdır.
Dar düzəliş həmin tətbiqin işarəsi və real çıxış interfeysi ilə məhdudlaşan, mövcud NAT ilə onu əvəz etmək əvəzinə birləşən mənbə tərcüməsi qaydasıdır:
table inet bypass {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
meta mark 0x1 oifname "wlan0" masquerade
}
}Yalnız istisnanı tərcümə edin, başqa heç nəyi. Ümumi masquerade qaydası simptomu düzəldir və hansı trafikin hansı yolla getdiyini bilmək qabiliyyətinizi məhv edir. İşarəyə, real çıxış interfeysinə və mümkünsə tətbiqin öz ünvanına uyğunlaşdırın. Geniş qaydaları yazmaq asandır, sonradan audit etmək isə demək olar ki, mümkünsüzdür.
İstisnadan hələ də nə qaçır
Ad həlli başqa cgroup-dakı ayrı resolver prosesindən gələ bilər, yəni brauzerin socket-ini təsnif etmək onun sorğularını təsnif etmir. Resolverin sorğuları tuneldə qalarkən bağlantı ondan kənara çıxırsa, split-horizon cavabları yolla uyğunlaşmaya bilər. Bu uyğunsuzluq DNS xətalarına bənzəyən, amma onlar olmayan nasazlıqlar yaradır.
Alt proseslər əksər quruluşlarda cgroup-u miras alır, lakin özünü öz scope-una köçürən köməkçi bunu etmir. Fərziyyə etmək əvəzinə yoxlayın, xüsusən özünü yenidən icra edən hər şey üçün.
Nəhayət, tunel söndükdə nə baş verməli olduğunu qərar verin. Səssizcə tam yan keçidə çevrilən istisna bağlanmış vəziyyətdə uğursuz olan istisnadan fərqli təhlükəsizlik mövqeyidir və yalnız biri nəzərdə tutduğunuzdur.