Menanda trafik daripada satu cgroup ialah bahagian yang mudah. Tiga keputusan berasingan mesti selaras sebelum satu aplikasi keluar melalui antara muka fizikal sementara semua yang lain kekal dalam terowong: soket mana tergolong dalam pengecualian, carian penghalaan mana yang dicetuskan oleh tanda itu, dan alamat sumber mana yang dibawa oleh paket apabila ia keluar. Kebanyakan percubaan yang gagal betul pada yang pertama, separuh betul pada yang kedua, dan tidak pernah melihat yang ketiga.

Tiga keputusan, bukan satu

Klasifikasi menjawab siapa yang dikecualikan. Penghalaan menjawab ke mana paket bertanda pergi sebaliknya. Pemilihan sumber menjawab apa yang hujung jauh akan lihat dan ke mana balasan harus kembali.

Perkara ini gagal secara berasingan. Paket boleh diklasifikasikan, dihalakan semula ke antara muka fizikal, dan masih membawa alamat peribadi yang tiada penghala huluan boleh kembalikan, yang menghasilkan tamat masa yang kelihatan tepat seperti sekatan firewall. Tiada apa dalam langkah klasifikasi memberi amaran tentang itu. Tiada apa dalam langkah penghalaan juga.

Urutan juga penting. Klasifikasi berlaku apabila paket dijana, penghalaan berlaku selepas itu, dan terjemahan berlaku pada titik keluar.

Jika anda tidak boleh menamakan yang mana antara tiga peringkat itu rosak, anda bukan menyahpepijat, anda menyusun semula peraturan dan berharap.

Padankan cgroup yang masih wujud esok

nftables boleh menguji keahlian cgroup v2 sesuatu soket, yang benar-benar berguna kerana ia mengikut proses dan bukan destinasi. Perangkapnya ialah pengecam. Aplikasi desktop yang dilancarkan dari menu sering tinggal dalam scope sementara yang namanya berubah pada pelancaran seterusnya.

nft list ruleset
systemctl status session.slice 2>/dev/null
cat /proc/self/cgroup

Menyalin nama scope daripada satu sesi dan mengekodkannya secara keras menghasilkan peraturan yang berfungsi hari ini dan diam-diam berhenti memadankan esok. Letakkan aplikasi dalam konteks pelaksanaan yang stabil dan disengajakan, seperti scope atau unit khusus yang anda kawal, dan padankan dengannya. Peraturan itu kemudian bertahan melalui but semula dan kemas kini pakej. Ia juga menjadi sesuatu yang rakan sekerja boleh fikirkan tanpa sejarah sesi anda.

Berhati-hati juga tentang mekanisme mana yang anda gunakan. Klasifikasi net_cls cgroup v1 dan pemadanan soket cgroup v2 ialah perkara berbeza, dan medan bernama serupa dalam dokumentasi tidak menjadikannya boleh ditukar ganti.

Rantaian route yang mencetuskan carian kedua

Untuk trafik yang dijana secara setempat, jenis rantaian menentukan sama ada sesuatu berlaku selepas tanda ditetapkan. Rantaian output jenis filter boleh menanda paket dan kernel akan terus menggunakan laluan yang telah dipilihnya. Rantaian jenis route ialah mekanisme yang meminta carian baharu.

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

Tanda itu kemudian memerlukan peraturan dasar yang menghantarnya ke jadual, dan jadual itu mesti lengkap: laluan lalai, destinasi setempat yang masih diperlukan aplikasi, dan gateway huluan yang benar-benar menjawab.

Pilih nilai tanda dengan sengaja. WireGuard menggunakan fwmark sendiri untuk trafik pengangkutan luar, dan mendarat pada nombor yang sama secara tidak sengaja boleh mengganggu pengecualian penghalaan terowong itu sendiri dengan cara yang menyakitkan untuk didiagnosis.

Alamat sumber tidak mengikut laluan

Soket yang sudah memilih alamat sumber untuk laluan terowong mengekalkan alamat itu selepas penghalaan semula. Tiada apa dalam perubahan laluan menulis semulanya, itulah sebabnya paket keluar dari antara muka fizikal dengan sumber peribadi yang tidak dapat dikembalikan oleh rangkaian huluan.

Gejala yang kelihatan ialah aplikasi yang kelihatan menghantar data dan tidak pernah menerima jawapan, dan log firewall yang tidak menunjukkan apa-apa kerana paket itu tidak pernah kembali.

Pembetulan sempit ialah peraturan terjemahan sumber yang terhad kepada tanda aplikasi itu dan antara muka output sebenarnya, disepadukan dengan NAT yang sedia ada dan bukan menggantikannya:

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

Terjemahkan pengecualian itu dan tiada yang lain. Peraturan masquerade menyeluruh membaiki gejalanya dan memusnahkan keupayaan anda untuk memberitahu trafik mana yang mengambil laluan mana. Padankan pada tanda, antara muka output sebenar dan, jika boleh, alamat aplikasi itu sendiri. Peraturan luas mudah ditulis dan hampir mustahil untuk diaudit kemudian.

Apa yang masih terlepas daripada pengecualian

Penyelesaian nama mungkin datang daripada proses penyelesai berasingan dalam cgroup lain, jadi mengklasifikasikan soket pelayar tidak mengklasifikasikan cariannya. Jika pertanyaan penyelesai kekal dalam terowong sementara sambungan keluar di luarnya, jawapan split-horizon boleh tidak sepadan dengan laluan. Ketidakpadanan itu menghasilkan kegagalan yang kelihatan seperti pepijat DNS tetapi bukan.

Proses anak mewarisi cgroup dalam kebanyakan persediaan, tetapi pembantu yang memindahkan dirinya ke scope sendiri tidak. Periksa dan jangan andaikan, terutamanya untuk apa-apa yang melaksanakan semula dirinya.

Akhir sekali, tentukan apa yang harus berlaku apabila terowong mati. Pengecualian yang diam-diam menjadi bypass penuh ialah postur keselamatan yang berbeza daripada yang gagal tertutup, dan hanya satu daripadanya yang anda maksudkan.

Artikel berkaitan