WireGuard dalam ruang nama rangkaian: mengapa socket tertinggal
Memindahkan antara muka tidak memindahkan socket UDP tersulit, yang kekal dalam ruang nama tempat peranti dicipta. Ciptanya dalam sasaran sebaliknya.
Antara muka tersenarai dalam ruang nama yang anda mahu, aplikasi terikat padanya, namun tiada trafik terowong yang muncul. Ini ciri peranti WireGuard dalam kernel Linux yang dicipta dalam satu ruang nama dan dipindahkan ke ruang lain: antara muka berpindah, socket UDP tersulitnya tidak. Kedua-duanya mesti berada di tempat yang betul sebelum trafik dalaman bermakna. Pemeriksaan cepat apabila anda tahu perlu melihat dua konteks, bukan satu.
Gejala: ruang nama betul, tiada paket
Di dalam ruang nama, terowong kelihatan sihat. Peranti wujud, alamat telah diberikan, dan konfigurasi rakan sebaya ada. Di luar, pertukaran UDP yang dijangka tidak pernah muncul pada antara muka yang anda perhatikan, dan sebelah sana melaporkan tiada jabat tangan.
Punca ialah paket dalaman aplikasi sampai ke peranti yang dipindahkan, dan peranti cuba menghantarnya melalui socket yang tergolong dalam konteks rangkaian lain. Laluan asas yang digunakannya, dan setiap peraturan firewall yang terpakai padanya, ialah yang berada dalam ruang nama tempat peranti dicipta.
Ini bukan pepijat dalam pemindahan dan bukan salah konfigurasi rakan sebaya. Begitulah pelaksanaan kernel berfungsi, dan dokumentasi ruang nama untuk WireGuard menerangkan peraturan penciptaan secara langsung.
Mengapa socket mempunyai tempat lahir
Peranti WireGuard memiliki satu socket UDP untuk pengangkutan tersulitnya, dan socket itu dibuka dalam ruang nama tempat peranti dicipta. Memindahkan antara muka dengan arahan pautan memindahkan peranti yang kelihatan tetapi membiarkan pengangkutan di tempat ia bermula. Kedua-dua objek kemudian mempunyai pemilik berbeza.
Kesannya mudah terlepas kerana kedua-dua bahagian diperiksa di tempat berbeza. Laluan dalaman ditentukan dalam ruang nama tempat aplikasi berjalan, dan laluan luaran ditentukan di tempat socket tinggal. Memeriksa hanya satu daripadanya menghasilkan kesimpulan yang yakin tetapi salah. Memeriksa kedua-duanya biasanya menamatkan siasatan dalam satu lintasan.
Ciptanya di tempat anda mahu socket
Penyelesaiannya ialah mencipta peranti di dalam ruang nama sasaran dan bukan menciptanya di luar lalu memindahkannya. Dengan andaian ruang nama yang diluluskan sudah wujud dan namanya belum digunakan:
ip netns exec vpn-apps ip link add wg-demo type wireguard
ip netns exec vpn-apps wg show
Kini antara muka dan socketnya tergolong dalam konteks itu, jadi laluan asas dan peraturan penapisan yang terpakai ialah yang dikonfigurasikan di sana. Jika reka bentuk memerlukan bahagian jelas di tempat lain, letakkan dahulu antara muka asas dalam ruang nama dan kemudian cipta terowong. Urutan ialah sebahagian daripada reka bentuk, bukan perincian pelaksanaan.
Layan ini sebagai arahan pentadbiran rangkaian, bukan resipi. Ia mencipta peranti dan menunjukkan keadaan; kunci, rakan sebaya, alamat dan laluan masih perlu datang daripada konfigurasi yang diluluskan, dan antara muka pengeluaran sedia ada tidak sepatutnya digantikan dalam contoh.
Baca kedua-dua belah laluan
Setelah peranti berada di tempat yang betul, sahkan kedua-dua keputusan secara berasingan. Mulakan dengan carian dalaman daripada konteks aplikasi, kemudian periksa laluan luaran daripada konteks yang memiliki socket:
ip netns exec vpn-apps ip route get 10.30.0.9
ip netns exec vpn-apps wg show
tcpdump -ni any udp port 51820
Jika carian dalaman diselesaikan melalui terowong dan tangkapan luaran menunjukkan pertukaran tersulit, kedua-dua bahagian bersetuju. Jika tangkapan kosong, socket masih di tempat lain, atau laluan asas dalam ruang namanya tidak sampai ke titik akhir.
Satu lagi pemeriksaan tergolong dalam rekod: bagaimana peranti dicipta selepas dimulakan semula. Pengurus yang mencipta semula antara muka dengan konteks penciptaan berbeza mengubah tempat lahir socket. Pemindahan manual yang berjaya sekali bukan bukti tentang laluan terurus.