Aplikasi dalam ruang nama VPN tidak dapat dicapai dari LAN
Ruang nama rangkaian memberi satu program terowong dan gelung baliknya sendiri. Terbitkan hanya portnya dengan lompatan socat atau pasangan veth dan bukan hos.
Perkhidmatan anda berjalan pada mesin, terowong sudah naik, tetapi pelayar di meja anda masih menunggu jawapan. Tiada apa yang rosak dalam erti kata biasa: aplikasi mendengar di dalam ruang nama rangkaian, dan tindanan itu tidak kelihatan kepada LAN. Gelung baliknya milik ruang nama, jadi klien pada mesin lain tiada alamat yang sampai ke port itu. Satu lompatan yang disengajakan, atau satu pasangan veth, membaikinya tanpa mengalihkan seluruh hos.
Mengapa tiada apa yang menjawab pada alamat LAN
Ruang nama ialah tindanan rangkaian lengkap: antara muka, laluan, peraturan tembok api dan gelung balik peribadi. Proses yang dilancarkan melalui ip netns exec hanya melihat tindanan itu dan tiada yang lain, jadi alamat yang diikatnya hanya diselesaikan di dalam ruang nama. 127.0.0.1 hos itu sendiri ialah gelung balik yang sama sekali berbeza.
Itulah sebabnya curl pada hos gagal manakala arahan yang sama di dalam ruang nama berjaya. Aplikasi itu sihat; alamat itu sememangnya tiada dalam tindanan hos.
Terbitkan satu port dengan lompatan socat
socat menjambatani kedua-dua tindanan di ruang pengguna, yang memadai apabila satu port TCP perlu melintas. Bahagian hos mendengar pada LAN dan, bagi setiap sambungan yang diterima, memulakan socat kedua di dalam ruang nama yang bersambung ke gelung balik aplikasi. Proses dalaman mencapai aplikasi tepat seperti yang akan dilakukan oleh klien setempat. Tiada apa dalam penghalaan ruang nama berubah, jadi aplikasi terus menggunakan terowong sebagai satu-satunya jalan keluar.
socat TCP-LISTEN:9100,reuseaddr,fork EXEC:'ip netns exec vpn socat STDIO tcp-connect:127.0.0.1:9100',nofork
Proses luar memerlukan root atau keupayaan untuk masuk ke ruang nama. Jika VPN terputus, aplikasi kehilangan laluannya dan port yang diterbitkan gagal tertutup, dan itulah tingkah laku yang anda mahu daripada penjara.
Gunakan pasangan veth apabila lebih daripada satu port melintas
Pasangan veth ialah jawapan yang betul apabila beberapa port atau protokol perlu melintas, atau apabila hos lain perlu memulakan sambungan. Satu hujung kekal dalam hos, hujung yang lain berpindah ke ruang nama, dan /30 kecil memberi kedua-dua belah alamat yang stabil. Laluan hos kemudian menghantar alamat ruang nama melalui pasangan itu.
ip link add veth0 type veth peer name veth1
ip link set veth1 netns vpn
ip addr add 10.77.0.1/30 dev veth0
ip link set veth0 up
ip netns exec vpn ip addr add 10.77.0.2/30 dev veth1
ip netns exec vpn ip link set veth1 up
Jangan tambah laluan lalai melalui hos kecuali anda berniat untuk memecahkan penjara. Terowong harus kekal sebagai jalan keluar, jadi hanya alamat perkhidmatan yang diterbitkan boleh dicapai melalui pasangan itu. Beri ruang nama fail penyelesai sendiri juga, kerana ip netns exec membaca /etc/netns/vpn/resolv.conf dan tanpanya penyelesaian nama di dalam penjara kosong.
Uji dari mesin lain, bukan dari hos
Jalankan ujian dari mesin kedua, kerana hos boleh mencapai pendengar setempat melalui laluan yang tidak berkata apa-apa tentang LAN. Periksa dahulu apa yang sebenarnya diikat oleh aplikasi di dalam ruang nama, kemudian sambung ke alamat yang diterbitkan dari luar. Mengikat pada setiap alamat di sana tidak melebarkan penjara, kerana kad liar masih milik ruang nama dan LAN tidak dapat melihatnya.
ip netns exec vpn ss -lntp
Jika sambungan dari hos berfungsi dan sambungan dari LAN tidak, bahagian yang hilang ialah lompatan atau laluan, bukan alamat ikatan. Mulakan OpenVPN di dalam ruang nama dan bukannya mengalihkan peranti tun hidup ke dalamnya, kerana mengalihkan antara muka mematikannya dan boleh memadam laluan yang kemudian tidak dapat anda baiki dari luar. Simpan arahan pemulihan pada konsol, bukan di dalam penjara.