Anda menambah peraturan untuk trafik VPN dalam rantai FORWARD, menjalankan permintaan dari mesin Linux yang sama, dan pembilang kekal pada sifar. Peraturan itu mungkin betul. Paket tidak pernah melalui laluan itu, kerana permintaan yang dijana pada mesin itu sendiri tidak diteruskan olehnya. Menjejaki kehidupan paket dari soket ke wayar menjelaskan mengapa, dan di mana peraturan itu sepatutnya berada.

Cari di mana paket itu dilahirkan

Urutan cangkuk Netfilter memisahkan tiga kes, dan hanya satu daripadanya melibatkan FORWARD:

OriginPathHook that sees it
Local processOUTPUT then POSTROUTINGOUTPUT, POSTROUTING
Addressed to a local servicePREROUTING then INPUTPREROUTING, INPUT
Received for another hostPREROUTING, FORWARD, POSTROUTINGFORWARD

Aplikasi setempat bermula dalam laluan OUTPUT, kerana kernel telah pun menetapkan bahawa paket itu berasal dari sini dan tidak pernah menjadi calon untuk penghantaran. Mencipta terowong tidak mengubah klasifikasi itu; terowong ialah peranti yang boleh dilalui paket untuk keluar, bukan peringkat yang menukar output setempat menjadi transit.

Dua paket, satu cerita

Setelah terowong aktif, paket dalaman aplikasi dan paket luaran yang disulitkan ialah objek yang berbeza. Paket dalaman membawa destinasi dan muatan yang dipilih oleh aplikasi. Paket luaran membawa teks sifer ke alamat dan port rakan, dan itulah yang benar-benar melintasi antara muka fizikal.

Dasar anda melibatkan salah satu daripadanya, dan memilih yang salah ialah punca biasa sesuatu peraturan kelihatan tidak melakukan apa-apa. Peraturan yang sepadan dengan alamat luaran rakan melihat setiap paket terowong secara sama, apa pun yang dilakukan aplikasi di dalam. Peraturan yang sepadan dengan destinasi dalaman melihat trafik yang anda pedulikan, dan ia hanya akan tercetus jika paket itu sampai ke cangkuk tempat anda memasang peraturan.

Ruang nama menggerakkan sempadan

Kontena menjadikan ini lebih sukar tanpa mengubah prinsipnya. Permintaan aplikasi ialah output setempat di dalam ruang nama rangkaian kontena. Hos menerima trafik itu pada antara muka Ethernet maya dan boleh meneruskannya, jadi peraturan FORWARD pada hos boleh bermakna walaupun proses yang menjana permintaan tidak pernah menyentuh rantai OUTPUT hos.

Sebelum memilih cangkuk, tentukan di mana set peraturan dan terowong sebenarnya berada. Terowong di dalam kontena, terowong pada hos dengan kontena dihalakan melaluinya, dan terowong dalam ruang nama berasingan ialah tiga topologi berbeza dengan tiga penempatan peraturan berbeza. Baca peraturan di dalam ruang nama yang memiliki peranti itu, bukan hanya dalam yang lalai.

Tanya sama ada anda perlukan tanda langsung

Jika matlamatnya adalah menghantar satu awalan destinasi melalui terowong, laluan untuk awalan itu mungkin sudah memadai. Semak dahulu laluan berkesan, termasuk apa sahaja yang ditolak oleh pelayan: laluan lalai yang dialihkan menghantar jauh lebih banyak trafik melalui VPN daripada dasar sempit yang anda bayangkan, dan sebarang jumlah tanda tidak akan menjadikan hasilnya sepadan dengan niat.

Klasifikasi diperlukan apabila keputusan bergantung pada sesuatu yang tidak dapat dinyatakan oleh laluan, seperti sumber, pengguna atau proses. Untuk trafik yang diterima, tanda dalam PREROUTING berfungsi. Untuk trafik setempat, tanda mesti berlaku dalam peringkat output yang boleh mencetuskan carian laluan baharu selepas tanda ditetapkan. Dengan nftables itu ialah rantai jenis route pada cangkuk output; rantai penapis output biasa akan menetapkan nilai dan membiarkan laluan tidak berubah.

Dengan iptables, yang setara berada dalam susunan mangle OUTPUT, dan syarat yang sama terpakai: keputusan penghalakan mesti ditinjau semula selepas tanda wujud. Kemudian peraturan dasar mesti menggunakan tanda itu dan menunjuk ke jadual yang mengandungi laluan yang boleh digunakan. Menetapkan tanda conntrack ialah operasi ketiga yang berasingan; ia menyimpan nilai pada aliran dan tidak meletakkan nilai itu dengan sendirinya pada paket semasa untuk dibaca oleh penghalakan.

Sahkan carian dan pembilang bersama-sama

nft list ruleset
ip route get 198.51.100.25
ip route get 198.51.100.25 mark 0x1

Alamat dan tanda itu bersifat ilustrasi, dan kedua-dua pertanyaan laluan menjawab soalan yang berbeza. Yang kedua bertanya apa yang kernel akan lakukan jika paket membawa tanda itu; ia tidak menunjukkan bahawa set peraturan anda menetapkan satu. Anggapnya sebagai ujian hipotesis, bukan bukti bahawa dasar itu berfungsi.

Kemudian jalankan permintaan tidak berbahaya dan perhatikan dua perkara serentak: pembilang pada cangkuk yang anda pilih, dan jalan keluar yang sebenarnya diambil paket. Jika pembilang bergerak dan paket keluar di tempat lain, tanda atau jadual itu salah. Jika kedua-duanya tidak bergerak, paket tidak sampai ke cangkuk itu langsung, dan soalan seterusnya ialah ruang nama atau laluan.

Akhir sekali, hadkan ujian kepada apa yang boleh dinyatakan oleh mekanisme itu. Satu laluan untuk satu alamat tidak menjadi dasar kekal untuk perkhidmatan yang alamatnya berputar. Tentukan dahulu skop paket, kemudian semak sama ada reka bentuk penghalakan dan tanda dapat mengekalkan skop itu selepas sambungan semula.

Artikel berkaitan