Cara Menghalakan Satu Apl Melalui VPN Tanpa Seluruh Mesin
Tiada desktop tanpa pengurusan menawarkan suis VPN per-proses. Pilih lapisan yang memilih trafik: soket terikat, peraturan UID, profil firewall atau hop SOCKS.
Klien VPN bersambung, pelayar berfungsi, dan satu arahan yang benar-benar anda pedulikan masih keluar melalui sambungan rumah anda. Atau sebaliknya berlaku: terowong merampas laluan lalai dan pelayan fail setempat hilang daripada desktop. Saya mengalami ini dengan ejen binaan yang perlu mencapai cermin artifak dalaman sementara seluruh hos kekal di LAN pejabat, dan klien menawarkan tepat dua pilihan, semua trafik atau tiada. Permintaan kedua-dua hala adalah sama, program ini dan bukan seluruh mesin, dan kebanyakan klien tiada kotak semak untuknya, kerana jadual laluan tidak pernah tahu apa itu program.
Mengapa jadual laluan tidak dapat melihat program anda
Apabila proses menghantar paket, tindanan mencari alamat destinasi dalam jadual laluan. Nama boleh laku mahupun port tidak masuk ke dalam carian itu. Nama domain gagal atas sebab yang sama: terowong membawa trafik ke alamat, dan apabila nama diselesaikan menjadi alamat, penghalaan ialah satu-satunya tuas yang masih ada pada kernel. Itulah sebabnya “VPN hanya untuk tapak ini” akhirnya bermaksud proksi, dan “VPN hanya untuk program ini” akhirnya bermaksud salah satu daripada sekumpulan kecil mekanisme.
| Mechanism | What selects | Covers | On tunnel drop |
|---|---|---|---|
| Socket bind | source address | a client you control | connections fail |
| UID rule (Linux) | owning user | every process of one account | connections fail |
| Firewall profile (Windows) | adapter profile | one program | fails closed |
| Network namespace | namespace membership | everything started inside | connections fail |
| SOCKS hop | app proxy setting | one app or one browser profile | connections fail |
Tiada satu pun daripada ini ialah laluan per-proses. Setiap satu memindahkan keputusan ke lapisan yang boleh melihat program, pengguna atau konfigurasi apl itu sendiri.
Satu destinasi tunggal masih merupakan laluan, bukan peraturan program. Pada macOS resipi biasa ialah nyahtanda “Hantar semua trafik melalui VPN” dan tambah laluan hos: sudo route add -host internal-tuner.example -interface ppp0, dibuang semula dengan sudo route delete -host internal-tuner.example -interface ppp0. Baca nama antara muka daripada ifconfig dahulu, kerana ppp0 hanyalah contoh. Kad bebas tidak berfungsi dalam laluan hos, jadi perkhidmatan yang bercakap dengan beberapa nama memerlukan satu entri bagi setiap nama, dan peraturan itu meliputi setiap proses pada mesin, bukan yang anda fikirkan.
Ikat soket pada alamat terowong
Apabila anda mengawal klien, pengikatan ialah pemilih paling murah. Soket yang terikat pada alamat setempat terowong keluar melalui antara muka itu selagi laluan untuk destinasi wujud di sana, dan segala-galanya pada mesin mengekalkan laluan biasa. Kehalusan ialah pengikatan memilih alamat sumber manakala jadual laluan masih memilih jalan keluar. Pengikatan sahaja tidak memindahkan trafik yang tiada laluan ke dalam terowong, dan itulah kesilapan di sebalik kebanyakan laporan “saya ikat tetapi ia masih keluar cara yang salah”.
import socket
s = socket.socket()
s.bind(("10.8.0.2", 0))
s.connect(("build.internal.example", 443))Alat peringkat lebih tinggi mendedahkan idea yang sama: curl --interface 10.8.0.2, CURLOPT_INTERFACE PHP, dan argumen source_address dalam klien HTTP Python. Alamat itu mesti milik terowong, dan salah taip di sini gagal sebagai ralat sambungan biasa, bukan aduan penghalaan. Mengikat pada nama peranti dan bukannya alamat ialah keistimewaan Linux dan tidak dibawa ke Windows atau macOS, sebab itulah skrip mudah alih menghantar alamat.
Linux: padankan pemilik, bukan nama program
Kernel boleh memadankan pengguna pemilik soket, jadi akaun khusus menjadi pemilih.
ip rule add uidrange 1001-1001 lookup 100
ip route add default dev tun0 table 100Ini hanya berfungsi jika terowong belum menjadi laluan lalai. Mulakan klien dengan --route-nopull, atau tapis ubah hala yang ditolak dengan --pull-filter ignore "redirect-gateway" pada OpenVPN 2.4 dan lebih baru, kemudian tambah entri jadual sendiri. Jika tidak, kedua-dua lalai wujud dan yang keutamaan lebih rendah menang. Versi yang disengajakan ialah menghala laluan lalai ke gerbang terowong, atau melakukannya daripada skrip putus sambungan: ia menjauhkan trafik daripada internet apabila terowong terputus, tetapi itu suis bunuh, bukan pemilih, dan ia kekal sehingga seseorang membuangnya.
Versi yang lebih kuat ialah ruang nama rangkaian. Ciptakannya, jalankan klien di dalamnya, dan mulakan aplikasi dengan ip netns exec. Tiada apa-apa di luar ruang nama melihat antara muka terowong, jadi aplikasi tidak boleh kembali ke laluan hos secara tidak sengaja. Kosnya nyata: ruang nama memerlukan pasangan veth untuk mencapai rangkaian fizikal dan fail penyelesai sendiri, kerana ruang nama pasang tidak berkongsi tetapan penyelesaian hos.
Dua mod kegagalan menerangkan kebanyakan kebocoran. Penyelesaian nama masih berlaku dalam penyelesai hos, jadi pertanyaan itu keluar di luar terowong walaupun sambungan TCP masuk ke dalam. Dan IPv6 memerlukan ip -6 rule sendiri, kerana peraturan v4 tidak meliputinya.
Windows dan macOS: skop firewall atau serahkan proksi
Windows juga tiada pemilih laluan per-aplikasi, tetapi peraturan firewallnya boleh diskopkan kepada profil, dan penyesuai VPN boleh dikelaskan sebagai Awam manakala LAN rumah kekal Peribadi. Ciptakan peraturan sekatan keluar untuk program pada profil Peribadi dan Domain, biarkan Awam terbuka, dan aplikasi hanya boleh mencapai rangkaian melalui terowong. Tetapkan kategori rangkaian sambungan dahulu, kemudian sahkan peraturan itu sepadan dalam anak tetingkap pemantau firewall. Ia sekatan, bukan laluan: ia gagal tertutup apabila terowong terputus, dan ia tidak boleh menghentikan aplikasi yang mengabaikan firewall.
macOS mengikut logik yang sama dengan alat berbeza. Pendengar SOCKS yang dicapai melalui SSH ialah pilihan paling tidak invasif, kerana ssh -D 1080 user@host mencipta satu port setempat dan hanya aplikasi yang dikonfigurasikan untuk menggunakannya mengambil laluan itu. Peraturan pf boleh menyekat program mengikut pengguna atau kumpulan, tetapi ia masih tidak boleh memilih terowong untuk program itu sahaja. Tunnelblick tidak boleh menapis mengikut domain sama sekali, kerana laluan berfungsi pada alamat; pengguna OpenConnect beralih kepada vpn-slice apabila pelayan menolak senarai awalan yang terlalu luas.
Dua penyelesaian menampung apa yang terlepas oleh alat platform. Sambungan pelayar yang menukar proksi mengikut domain ialah jawapan praktikal untuk “hanya tapak ini”, kerana ia bertindak pada lapisan aplikasi di mana nama masih wujud; ia meliputi satu pelayar dan tiada yang lain. Yang kasar ialah menjalankan klien vendor di dalam mesin maya supaya tetamu memiliki perubahan laluan manakala hos mengekalkan laluannya, dengan kos dua tindanan rangkaian untuk diselenggara.
Hop SOCKS untuk alat tanpa pilihan ikatan
Kebanyakan aplikasi boleh dihalakan ke proksi HTTP atau SOCKS walaupun ia tidak tahu apa-apa tentang antara muka. Klien SSH membekalkan satu tanpa perubahan di sebelah pelayan:
ssh -N -D 127.0.0.1:9999 [email protected]Apa-apa yang dikonfigurasikan untuk menggunakan port itu keluar di bastion manakala seluruh desktop mengekalkan sambungan biasanya. Instans 3proxy setempat yang terikat pada alamat terowong melakukan perkara yang sama untuk satu port tanpa SSH, dan stunnel meliputi satu port tunggal yang dibalut TLS. Hadnya praktikal: proksi hanya membawa protokol yang tahu menggunakannya, UDP memerlukan persekutuan UDP SOCKS5 yang tidak didayakan oleh tetapan “SOCKS5” banyak klien, dan DNS mesti diselesaikan oleh proksi (socks5h dalam curl) atau nama itu bocor kepada penyelesai setempat.
Biarkan pendengar pada gelung balik melainkan mesin lain memerlukannya.
Sahkan laluan dengan tangkapan, bukan mesej status
Tetingkap status aplikasi menerangkan tetapan, bukan paket. Tangkap pada kedua-dua antara muka dan bandingkan:
tcpdump -i any -n port 443
ss -tnp | grep 443Jika sambungan muncul pada antara muka fizikal tanpa entri sepadan pada terowong, pemilih tidak berkuat kuasa, apa pun yang dilaporkan klien. Periksa IPv6 dan penyelesai secara berasingan, dan periksa laluan kedua seperti proses pembantu atau proksi sistem yang diwarisi.
Kemudian pilih sempadan yang sepadan dengan keperluan: proksi cukup untuk satu tapak, peraturan UID cukup untuk satu akaun, profil firewall cukup apabila sambungan mesti gagal tertutup, dan ruang nama ialah satu-satunya pilihan yang menyembunyikan terowong daripada segala-galanya di luarnya.