Tiada suis «kecualikan aplikasi ini»: beri proses sumbernya sendiri
Penghalaan memadankan alamat, bukan nama proses. Beri program yang dikecualikan sumber dan jadualnya sendiri, atau pindahkan keputusan ke penghala, di mana itu jujur.
Satu program harus menggunakan sambungan biasa manakala semua yang lain kekal dalam terowong, dan klien tiada suis untuk itu. Tiada menu tersembunyi untuk dicari juga. Laluan dipilih daripada medan di dalam paket, dan paket membawa alamat serta port, bukan identiti proses yang menciptanya, jadi pengecualian mesti dinyatakan dalam salah satu medan itu. Ikut satu paket sekali dan pilihan yang tersedia berhenti menjadi misteri.
Mengapa klien tidak dapat menawarkannya
Penghalaan destinasi membandingkan alamat destinasi dengan awalan dan menyimpan padanan terpanjang. Pada saat itu setiap paket kelihatan sama, apa pun yang menghasilkannya. Penghalaan dasar sumber meluaskan perbandingan kepada alamat sumber, dan itulah cangkuk yang digunakan setiap penyelesaian praktikal: tukar sumber, dan jadual lain menjadi layak.
Port tidak membantu. Pengecualian mengikut port perlu dinilai sebelum carian destinasi, dan port tidak memainkan peranan dalam keputusan itu. Apa sahaja yang diiklankan sebagai pengecualian berasaskan port sebenarnya mengecualikan melalui medan lain dan menerangkannya secara longgar.
Penghalaan per aplikasi yang sebenar wujud di tempat platform menambah jentera untuknya, seperti panggilan penapis pada Windows atau pengikatan perkhidmatan VPN pada Android. Contoh desktop OpenVPN tidak membawa apa-apa daripada itu, dan tiada bendera konfigurasi yang menciptanya.
Linux: tandakan proses, kemudian halakan tandanya
Pendekatan paling bersih mengikat keputusan kepada proses yang memiliki soket. Padanan owner berfungsi untuk trafik yang dijana secara setempat dalam rantai OUTPUT, jadi tanda yang digunakan di situ boleh memilih jadual berasingan:
iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 0x1
ip rule add fwmark 0x1 table 200
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.0 table 200
ip route add default via 192.168.1.1 dev eth0 table 200
Paket daripada pengguna 1001 kemudian merujuk jadual 200 dan keluar melalui get laluan biasa, manakala jadual utama masih menghantar semua yang lain ke dalam terowong. Padanan owner hanya terpakai kepada paket yang dijana secara setempat, iaitu tepat trafik yang penting di sini, dan ia tidak dapat mengelaskan paket yang dimajukan untuk hos lain. Sahkan dengan alat, bukan dengan niat: ss -tnp menunjukkan alamat setempat dan proses pemilik sambungan yang terbentuk, dan ip route get 1.1.1.1 mark 0x1 menunjukkan jadual mana yang dipilih oleh tanda itu.
Ruang nama rangkaian ialah jawapan yang lebih teguh untuk program yang berdikari, kerana setiap soket yang dicipta di dalamnya terikat kepadanya secara binaan, jadi proses pembantu dan sambungan anak mewarisi tingkah laku tanpa dikelaskan sama sekali. Kosnya ialah kerja paip: sepasang veth, satu alamat pada setiap hujung, dan laluan lalai di dalam ruang nama yang menunjuk kembali kepada hos.
ip netns add novpn
ip link add veth-host type veth peer name veth-ns
ip link set veth-ns netns novpn
ip addr add 10.200.0.1/24 dev veth-host
ip netns exec novpn ip addr add 10.200.0.2/24 dev veth-ns
ip netns exec novpn ip route add default via 10.200.0.1
Windows: destinasi masih menentukan
Windows memilih antara muka keluar daripada destinasi, jadi program yang mahu laluan berbeza perlu menukar sesuatu yang dirujuk oleh tindanan sebelum pilihan itu dibuat. ForceBindIP menutup separuh pertama: ia memulakan program dengan soketnya sudah terikat kepada alamat setempat yang anda namakan. Itu sahaja tidak menukar antara muka yang dilalui oleh paket, kerana destinasi masih memilih laluan. Ikat sumber pada komputer riba yang laluan lalainya menunjuk ke dalam terowong dan paket tetap masuk ke dalam terowong.
Gejala itu mempunyai bentuk yang boleh dibaca setelah anda mengenalnya. Ia berlaku untuk alamat LAN yang dicapai terus oleh antara muka yang dipilih dan gagal untuk apa sahaja di internet yang laluannya menunjuk ke terowong. Ia juga kelihatan berfungsi sehingga program menyerahkan kerja kepada pembantu, kerana pembantu yang membuka soketnya sendiri tidak pernah diberitahu tentang pengikatan itu.
Pindahkan keputusan apabila satu proses ialah unit yang salah
Jika keperluan sebenar ialah peranti dan bukan program, letakkan ia pada SSID atau VLAN sendiri dan biarkan penghala menentukan: sumber itu mengambil laluan biasa manakala sumber lain menggunakan terowong. Mesin get laluan khusus ialah reka bentuk jujur yang lain: ia menyimpan VPN dan hanya menerima destinasi yang dihantar oleh penghala kepadanya. Pada VLAN dasar itu merangkumi setiap aliran yang dibuka oleh peranti, termasuk proses pembantu yang memecahkan pendekatan Windows. Pertukarannya ialah skop: dua program pada peranti itu tidak lagi boleh dirawat secara berbeza.
Kedua-duanya ialah dasar sumber atau destinasi dengan skop yang boleh anda nyatakan dalam satu ayat. Tiada satu pun per aplikasi, dan reka bentuk yang menjual dirinya sebagai per aplikasi gagal kali pertama program itu mewakilkan kerjanya kepada proses kedua.