Anda tidak boleh mengecualikan program daripada hos WireGuard bertunel penuh dengan mengedit laluan. Laluan memilih jalan mengikut destinasi, dan yang anda mahu kecualikan ialah proses, jadi kernel tiada apa untuk dipadankan. Pendekatan yang boleh dilaksanakan ialah memberi proses itu konteks rangkaiannya sendiri: ruang nama dengan antara muka, alamat dan laluan lalainya sendiri, disambungkan ke hos melalui pasangan veth. Saya menjalankannya di Ubuntu 24.04 dengan wireguard-tools 1.0.20210914, dan ruang nama tidak pernah menjadi masalah — dasar penghantaran hos dan peraturan penandaan terowong yang menjadi masalah.

Pilih dahulu jenis konteks yang anda perlukan

Dalam amalan dua bentuk muncul. Jika hos menjalankan tunel penuh dan satu program perlu keluar melalui laluan ISP, anda membina ruang nama kedua, menyambungkannya ke hos dan membiarkan hos menghantar serta menterjemah trafik untuknya. Jika ruang nama sudah membawa antara muka VPN dan anda hanya perlukan arahan yang dimulakan di dalamnya, itu kes biasa ip netns exec dan sebahagian besar kerja penghalaan sudah selesai.

Kedua-dua bentuk tidak memberi anda peraturan yang terhad kepada satu ID proses. Netfilter memadankan alamat, port, tanda dan antara muka; tiada jadual penghalaan bagi setiap proses. Penandaan boleh mengarahkan trafik, tetapi tanda mesti diletakkan pada paket yang sudah anda kenal pasti, dan itu masalah yang sama satu lapisan lebih rendah. Ruang nama memisahkan keseluruhan tindanan untuk pokok proses itu, dan itulah sebabnya ia jawapan biasa.

Jika keperluan benar-benar agar tiada apa keluar dari terowong, hentikan terowong itu. Ruang nama wujud untuk kes bercampur: satu program keluar, semua yang lain masuk, pada mesin yang sama, pada masa yang sama.

Bina konteks kedua dan sambungkannya ke hos

Susun atur ilustrasi: hos mempunyai antara muka WireGuard yang membawa laluan lalai, dan ruang nama rangkaian bernama clearnet yang disambungkan ke hos melalui pasangan veth. Alamat di bawah ialah contoh.

ip netns add clearnet
ip link add veth-clear-out type veth peer name veth-clear-in
ip addr add 192.168.100.1/24 dev veth-clear-out
ip link set veth-clear-out up
ip link set veth-clear-in netns clearnet
ip netns exec clearnet ip addr add 192.168.100.2/24 dev veth-clear-in
ip netns exec clearnet ip link set veth-clear-in up
ip netns exec clearnet ip route add default via 192.168.100.1

Ruang nama itu kini boleh mencapai hos dan tiada yang lain. Hos mesti menghantar trafik dan menulis semula alamat sumber, kerana 192.168.100.0/24 adalah peribadi dan penghala di atasnya tiada laluan kembali ke dalamnya:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o <wan-interface> -j MASQUERADE

Sahkan bahagian ruang nama sebelum meneruskan.ip netns exec clearnet ip route sepatutnya menunjukkan laluan veth dan laluan lalai melalui 192.168.100.1, dan ping ke alamat itu sepatutnya menjawab. Jika ping ke alamat hos gagal, alamat atau keadaan pautan itu salah dan tiada peraturan firewall akan membantu.

Apabila nama diselesaikan tetapi tiada apa kembali, baca FORWARD

Kegagalan klasik kelihatan seperti pepijat penghalaan: ruang nama menyelesaikan nama, paket keluar dan tiada jawapan pernah tiba. Pada hos yang mempunyai dasar FORWARD DROP — beberapa edaran dan kebanyakan imej diperkukuh berbuat demikian — paket digugurkan di tengah jalan, dan ralat yang dicetak aplikasi tidak mengatakan apa-apa tentang penapisan.

Baca rantai sebelum menambah apa-apa:

iptables -S FORWARD
nft list chain inet filter forward

Kemudian benarkan trafik dalam kedua-dua arah, dengan pembilang, supaya anda tahu sama ada peraturan itu pernah padan:

iptables -A FORWARD -i veth-clear-out -o <wan-interface> -j ACCEPT
iptables -A FORWARD -i <wan-interface> -o veth-clear-out -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
watch -n1 'iptables -L FORWARD -v -n'

Peraturan dengan pembilang paket sifar tidak berada di laluan. Sama ada nama antara muka berbeza daripada andaian anda, atau peraturan terdahulu dalam rantai telah menerima, menggugurkan atau memulangkan paket itu dahulu. Betulkan susunan, bukan teks peraturan.

Trafik balasan ialah separuh yang orang lupakan. Peraturan balik memerlukan nama veth yang sama serta padanan keadaan sambungan, atau penerimaan antara muka biasa jika anda membiarkan dasar terbuka. Tambah peraturan keluar sahaja dan gejala asal kembali, dengan peraturan baru anda berdiri di situ dan kelihatan betul.

Jauhkan peraturan penandaan terowong daripada laluan baru

Langkah ini mengubah ruang nama yang berfungsi menjadi satu yang bocor. Persediaan WireGuard biasanya memasang dasar tanda firewall bersama peraturan penghalaan mereka sendiri dan jadual khusus, jadi paket tanpa tanda jatuh kembali ke jadual utama manakala paket bertanda menggunakan jadual terowong. Trafik yang dihantar dari ruang nama dinilai terhadap penghalaan dasar semasa keluar, dan bergantung kepada cara peraturan itu ditulis, ia boleh masuk ke jadual terowong.

Dua tambahan memisahkan laluan. Pulang awal dalam rantai mangle untuk subrangkaian ruang nama, dan tambah peraturan berasaskan sumber yang meletakkan subrangkaian itu dalam jadual utama:

iptables -t mangle -I PREROUTING -s 192.168.100.0/24 -j RETURN
ip rule add from 192.168.100.0/24 lookup main priority 100

Keutamaan 100 disusun sebelum peraturan terowong pada hos saya, jadi jadual biasa yang menentukan untuk sumber itu. Jangan salin nombor itu secara buta: keutamaan yang wg-quick pasang berbeza antara versi dan antara persediaan IPv4 dan IPv6, jadi jalankan ip rule show dan pilih keutamaan yang jatuh di hadapan peraturan terowong pada mesin anda.

Sahkan dengan carian khusus sumber dan bukannya mempercayai senarai peraturan:

ip route get 1.1.1.1 from 192.168.100.2
ip netns exec clearnet ip route get 1.1.1.1

Jika arahan pertama melaporkan antara muka WireGuard, peraturan baru belum berada di hadapan dasar terowong. Jika ia melaporkan antara muka WAN manakala yang kedua masih menunjukkan laluan lalai veth, hos dan ruang nama tidak bersetuju dan anda patut membaca semula kedua-dua jadual penghalaan.

Mulakan proses yang membuka sambungan

Memulakan arahan ialah satu baris, tetapi mulakan proses yang benar-benar mencipta soket.ip netns exec clearnet curl -s https://ifconfig.me ialah ujian jujur terkecil: ia menunjukkan alamat yang ruang nama tunjukkan kepada dunia, bukan yang hos akan gunakan.

Untuk perkhidmatan, lampirkan ruang nama mengikut laluan supaya proses kekal di dalamnya sepanjang hayatnya:

[Service]
NetworkNamespacePath=/run/netns/clearnet

Aplikasi grafik ialah tempat pendekatan satu baris gagal secara senyap. Pelayar yang dilancarkan dari menu selalunya menyerahkan permintaan kepada contoh yang sudah berjalan di luar ruang nama, jadi tetingkap baru muncul dan trafik masih keluar melalui terowong. Beri ia profil berasingan supaya contoh baru benar-benar dicipta, kemudian periksa konteks proses dan bukannya meneka:

readlink /proc/$(pgrep -f clearnet-profile | head -1)/ns/net
readlink /run/netns/clearnet

Kedua-dua output mesti sepadan. Pemeriksaan yang sama berfungsi untuk mana-mana program yang berjalan lama, dan ia berbaloi dilakukan sekali bagi setiap aplikasi dan bukannya menganggap pelancar melakukan apa yang anda maksudkan.

Penyelesaian nama memerlukan keputusannya sendiri. Mencipta ruang nama tidak memberinya konfigurasi penyelesai; fail bagi setiap ruang nama disokong melalui /etc/netns/<name>/resolv.conf dan tanpanya anda mewarisi tingkah laku yang mudah disalah baca. IPv6 memerlukan rawatan yang sama: jika ruang nama tiada laluan lalai v6 manakala aplikasi mengutamakan v6, permintaan boleh tersekat sebelum berundur, yang kelihatan seperti terowong rosak.

Periksa rangkanya, bukan hanya alamat keluar

Alamat awam yang berfungsi membuktikan laluan, bukan keseluruhan keperluan. Lalui selebihnya dalam susunan ini:

  • ip netns exec clearnet ip route get 1.1.1.1 menunjukkan laluan lalai veth, bukan antara muka WireGuard.
  • Pembilang FORWARD pada kedua-dua peraturan meningkat semasa permintaan berjalan.
  • Proses aplikasi melaporkan inod ruang nama yang anda jangkakan.
  • Selepas but semula ruang nama wujud sebelum perkhidmatan bermula; unit yang berjalan lebih awal gagal atau, lebih teruk, berjalan di luar ruang nama.

Kemudian putuskan apa yang patut berlaku apabila terowong jatuh. Ruang nama terus berfungsi, itulah matlamat latihan ini dan juga risikonya: program yang dikecualikan kekal bersambung manakala semua yang lain berhenti. Rekodkan itu sebagai pilihan dasar dan jelaskan apa yang pengecualian tidak liputi — identiti akaun, keadaan pelayar yang disimpan dan penyedia DNS anda semuanya berada di luar skop ruang nama rangkaian, dan menganggap pengecualian itu sebagai tanpa nama ialah kesilapan yang hidup lebih lama daripada konfigurasi.

Artikel berkaitan