Mengapa peraturan iptables anda tidak pernah melihat trafik VPN terjambat
Bingkai terjambat boleh memintas rantai IP yang anda pantau. Bandingkan keluarga bridge asli dengan br_netfilter lama sebelum menambah peraturan lain.
Dua mesin maya pada hos yang sama mencapai LAN melalui jambatan, dan peraturan yang diletakkan dalam rantai ip forward menunjukkan pembilang yang tidak pernah bergerak. Bingkainya nyata, trafiknya mengalir, dan peraturan itu sememangnya tiada pada laluannya. Membandingkan dua cara Linux mendedahkan trafik terjambat menjelaskan kesenyapan ini, dan ia juga menjelaskan mengapa memuatkan satu modul lama ialah jawapan yang lebih buruk daripada yang kelihatan.
Dua laluan melalui satu hos
Paket boleh meninggalkan hos ini melalui dua cara yang sangat berbeza, dan perbezaannya menentukan cangkuk mana yang melihatnya. Jika destinasi berada di sebalik port fizikal dan bingkai ditukar antara dua port jambatan, hos memajukan bingkai Ethernet; kod penghalaan tidak dirujuk, dan tiada lompatan berpenghala berlaku. Jika destinasi ialah hos itu sendiri, atau rangkaian yang dicapai melalui antara muka terowong, paket dihalakan dan cangkuk lapisan IP memang terpakai. Ingat percabangan ini, kerana setiap soalan kemudian tentang rantai dan keluarga berpunca daripada laluan yang mana diambil oleh bingkai.
Perbezaan itu ialah seluruh kisah di sebalik peraturan yang tidak mengira apa-apa. Bingkai terjambat dari veth9a1 ke enp3s0 melintasi jambatan, bukan tindanan IP, jadi rantai ip forward tidak melihat apa-apa untuk dipadankan. Nama antara muka dalam contoh lama tidak menentukan laluan yang anda ada, dan itulah sebabnya langkah pertama ialah melihat topologi dan bukan set peraturan.
Terowong menambah kes ketiga yang wajar dinamakan. Peranti TUN menyerahkan paket IP kepada hos, jadi paket itu dihalakan dan benar-benar melalui rantai IP, manakala peranti TAP yang dipasang pada jambatan menyerahkan bingkai dan berkelakuan seperti kes jambatan. Jenis peranti, bukan nama produk, yang menentukan.
Bandingkan dua keluarga yang boleh melihat bingkai terjambat
Linux menyokong penapisan jambatan asli melalui keluarga bridge nftables, dan ia tidak memerlukan sebarang modul lama untuk memeriksa dan menggugurkan bingkai semasa terbang. Dokumentasi jambatan kernel sendiri memberikan syor itu secara langsung, yang wajar diketahui sebelum hasil carian memberitahu anda memuatkan modul.
| Observation point | What it sees | What it costs |
|---|---|---|
nftables bridge family chains | Ethernet frames forwarded between bridge ports, in both directions | Rules must be written in bridge syntax with link-layer matches |
Legacy br_netfilter plus an ip chain | Bridged IPv4 and IPv6 packets, re-exposed through IP-layer hooks | Existing host rules may begin matching traffic they never saw before |
inet chain for routed traffic | Packets the host routes, including traffic arriving from a TUN device | No visibility into purely switched frames |
Menggunakan arahan nft dan bukannya iptables tidak meletakkan peraturan dalam keluarga yang betul dengan sendirinya. Rantai yang diisytiharkan dalam keluarga bridge melihat bingkai; rantai yang diisytiharkan dalam ip, ip6 atau inet tidak melihatnya, tidak kira binari mana yang menciptanya. Keluarga ialah sifat rantai, bukan sifat alat yang menaipnya.
Laluan lama berfungsi secara berbeza, dan itulah sebabnya wajar membandingkan dan bukan memilih pihak kerana kebiasaan. Memuatkan br_netfilter dan mendayakan tetapan bridge-nf-call mendedahkan semula trafik IPv4 dan IPv6 terjambat melalui cangkuk lapisan IP, supaya peraturan iptables biasa akhirnya boleh memadankannya. Bingkainya tidak berubah; set cangkuk yang dilaluinya berubah, yang bermaksud setiap peraturan hos sedia ada kini mempunyai khalayak baharu.
Baca laluan berkesan sebelum menambah peraturan
Tiga arahan menetapkan di mana anda berada: apa yang dipasang pada jambatan, sama ada modul lama aktif, dan rantai apa yang sudah wujud dalam keluarga bridge. Jalankannya sebelum menulis apa-apa, kerana jawapannya menentukan reka bentuk mana yang anda luaskan. Melangkau langkah ini ialah cara peraturan yang betul berakhir dalam rantai yang tidak dilalui apa-apa.
bridge link show
lsmod | grep br_netfilter
nft list ruleset | grep -A4 "chain forward"
Output memisahkan kes dengan bersih. Port yang disenaraikan di bawah jambatan memberitahu anda antara muka mana yang ditukar; hasil lsmod kosong bermaksud tiada keterlihatan lapisan IP bagi bingkai terjambat; rantai forward keluarga bridge yang sedia ada bermaksud pemilik dasar sudah wujud dan peraturan anda terletak di situ dan bukan dalam rantai baharu sendiri.
Kemudian tambah satu peraturan yang mudah dibaca semula, dengan pembilang dan tanpa mengubah keputusan, dan hantar satu aliran wakil melalui jambatan. Pembilang yang bergerak membuktikan bingkai itu sampai ke peraturan. Itu sahaja yang dibuktikannya, jadi ikuti dengan laluan yang ditolak juga, kerana dasar yang menerima segala-galanya juga menghasilkan pembilang yang bergerak.
nft add rule bridge filter forward iifname "veth9a1" oifname "enp3s0" counter acceptDi mana modul lama mengubah tingkah laku
Mendayakan laluan lama pada jambatan yang berjalan bukan tindakan neutral untuk menambah keterlihatan. Peraturan yang sebelum ini tidak tercapai untuk trafik terjambat menjadi tercapai, termasuk peraturan hos yang ditulis untuk antara muka lain, dan dasar drop lalai dalam rantai ip forward boleh tiba-tiba terpakai kepada bingkai yang dahulunya berlalu tanpa disentuh. Pada hos yang diurus melalui jambatan itu, hasilnya ialah terkunci tanpa konsol. Ini bukan mod kegagalan hipotetikal; ini akibat biasa daripada meluaskan set cangkuk pada mesin yang anda capai melalui laluan yang baru sahaja anda luaskan.
Urutan yang lebih selamat ialah memutuskan keluarga mana yang memiliki dasar, menulis peraturan di situ, dan mengekalkan laluan pemulihan bebas sebelum menukar mana-mana sysctl. Jika dua keluarga memegang peraturan, dokumentasikan mana yang berautoriti; dua dasar yang bertindih ialah cara paket diterima di satu tempat dan digugurkan di tempat lain tanpa satu fail pun untuk dibaca.
Pengasingan itu sendiri masih memerlukan reka bentuk lengkap. Membenarkan satu sumber ke satu destinasi hanya membuktikan satu aliran berfungsi, sedangkan keperluannya biasanya ialah VM tidak boleh mencapai jirannya atau hos. Pembilang pada peraturan tolakan lebih penting daripada pembilang pada peraturan penerimaan, kerana pembilang penerimaan ialah yang memang anda jangkakan akan bergerak.
Akhir sekali, asingkan kes input hos. Trafik yang dialamatkan ke IP jambatan itu sendiri tiba di input, bukan di forward, dan peraturan dalam forward tidak akan pernah melihatnya, apa jua keluarga yang anda pilih. Tiga kes, dua keluarga, satu pelajaran: laluan menentukan cangkuk, dan cangkuk menentukan sama ada peraturan anda wujud langsung.