Kontena LXD tidak boleh membuka /dev/net/tun? Semak entri unix-char
LXD mesti menyalurkan peranti TUN hos ke dalam kontena sebelum klien VPN boleh menggunakannya. Lihat apa yang ditambah unix-char, apa yang tidak, dan cara mengesahkannya.
LXD mendedahkan peranti aksara hos kepada kontena dengan menambah nod peranti, bukan dengan mengajar tetamu menciptanya. Jika kontena tiada /dev/net/tun, hos mungkin mempunyai peranti itu dan tetamu mungkin masih tidak dapat membukanya. Entri unix-char ialah separuh bahagian pengurus dalam laluan itu, dan ia sengaja lebih sempit daripada kontena istimewa. Sebab itu nod hos dan nod kontena wajar diperiksa secara berasingan.
Mekanismenya cukup pendek untuk dijejaki: LXD menyelesaikan laluan hos, mencipta nod yang sepadan dalam instans dan menambah peranti itu ke dalam cgroup peranti kontena. Selepas itu proses tetamu memerlukan kebenaran dan keupayaannya sendiri untuk menggunakan nod itu bagi apa jua tujuan.
Apa yang sebenarnya diubah oleh entri unix-char
Peranti unix-char memberitahu LXD supaya mendedahkan satu peranti aksara hos pada laluan yang dipilih dalam kontena. Entri ini mempunyai tiga bahagian penting: label peranti yang digunakan pengurus, laluan source pada hos dan path yang dilihat tetamu. Hanya dua yang terakhir menerangkan peranti itu sendiri. Salah taip pada mana-mana satu daripadanya menghasilkan nod di lokasi yang tidak pernah dibuka klien.
Pada hos, peranti itu biasanya /dev/net/tun. Dalam kontena anda boleh mengekalkan laluan yang sama atau memilih yang lain, tetapi laluan itu mesti sepadan dengan apa yang dijangka oleh klien VPN. Mengekalkan /dev/net/tun mengelakkan masalah konfigurasi kedua, kerana kebanyakan klien membuka laluan itu tanpa bertanya.
Pengurus menggunakan entri itu semasa instans dimulakan atau semasa peranti dipasang panas. Ia tidak menyalin pemacu ke dalam tetamu dan tidak mencipta antara muka terowong. Ia menjadikan nod kelihatan dan membenarkan akses melalui kumpulan kawalan peranti kontena.
Isytiharkan peranti pada instans, bukan di dalam tetamu
Tambahkan entri daripada konteks pentadbiran LXD, dengan menamakan instans dan label yang boleh anda kenal kemudian. Untuk kontena bernama vpnbox, perintahnya ialah:
lxc config device add vpnbox tun unix-char source=/dev/net/tun path=/dev/net/tun
lxc config device show vpnbox
Label tun adalah setempat kepada konfigurasi instans. Ia bukan nama antara muka dan tidak perlu sepadan dengan apa pun dalam tetamu. Jika profil sudah menyediakan peranti yang sama, menambah entri kedua mencipta konflik dan bukannya berlebihan, jadi semak konfigurasi berkesan terlebih dahulu.
Menyunting fail di dalam kontena ialah lapisan yang salah. mknod dalam skrip permulaan mungkin kelihatan berfungsi pada kontena istimewa, kemudian hilang semasa penciptaan semula atau gagal pada kontena yang kurang istimewa. Pengurus memiliki set peranti instans; biarkan ia memiliki nod itu juga.
Padankan pemilikan dan mod dengan proses tetamu
Entri unix-char boleh menetapkan uid, gid dan mode untuk nod di dalam kontena. Gunakannya untuk sepadan dengan akaun yang menjalankan klien VPN, dan bukannya membuka peranti kepada setiap pengguna atau menukar kontena ke mod istimewa.
Keterlihatan tidak sama dengan kebenaran. Nod milik root dengan mod 600 kelihatan kepada perkhidmatan yang berjalan sebagai pengguna tanpa keistimewaan dan masih tidak dapat dibukanya. Semak akaun tetamu dahulu, kemudian tetapkan pemilikan kepada akaun itu, dan kekalkan mod tidak lebih lebar daripada keperluan klien.
Proses itu juga memerlukan keupayaan untuk mengkonfigurasi antara muka terowong, biasanya CAP_NET_ADMIN dalam ruang nama rangkaian kontena. Menyalurkan peranti tidak memberikan keupayaan itu, dan memberikan keupayaan tidak membekalkan peranti; ia keperluan yang berasingan.
Ketahui apa yang tidak diberikan oleh entri
Nod yang kelihatan bukan VPN yang berfungsi. Pakej klien masih perlu dipasang, profil masih perlu sah, dan perkhidmatan masih perlu bermula. Pengesahan, laluan dan DNS kekal kerja klien, dan kegagalan di situ bukan bukti entri peranti itu salah.
systemd boleh menambah sekatan lain. Unit dengan DeviceAllow atau dasar peranti yang diperketat boleh menafikan akses kepada nod yang dibekalkan oleh pengurus kontena. Semak dasar peranti unit itu apabila nod wujud tetapi perkhidmatan melaporkan ralat kebenaran, dan ubah dasar itu dan bukannya meluaskan kontena.
Pemalam panas adalah pilihan dan eksplisit. Entri dengan required=false memerlukan laluan sumber dan boleh muncul atau hilang apabila peranti hos berubah. Kitaran hayat itu sesuai untuk perkakasan yang datang dan pergi; bagi peranti TUN yang diperlukan VPN semasa but, entri pilihan boleh membiarkan perkhidmatan bermula sebelum prasyaratnya wujud.
Sahkan keterlihatan, pembukaan dan antara muka dalam susunan itu
Pertama sahkan nod di dalam kontena yang dimaksudkan. Laluan, nombor major dan minor serta pemilikan sepatutnya sepadan dengan peranti hos dan entri yang anda tambah. Nod yang hilang bermakna pengurus tidak menggunakan entri itu, atau menggunakannya pada instans lain.
lxc exec vpnbox -- ls -l /dev/net/tun
lxc exec vpnbox -- sh -c 'test -c /dev/net/tun && echo char-device-ok'
Seterusnya sahkan bahawa akaun perkhidmatan boleh membukanya. Ujian singkat sebagai akaun itu memisahkan masalah pemilikan daripada masalah perkhidmatan. Akhir sekali, mulakan klien dan sahkan bahawa antara muka terowong muncul; hanya langkah ketiga itu membuktikan seluruh laluan, kerana dua yang pertama boleh lulus sementara profil atau keupayaan klien masih salah.
Catatkan instans, label peranti, sumber hos, laluan tetamu dan akaun pemilik apabila perubahan diluluskan. Kelima-lima nilai itu ialah apa yang perlu dipelihara oleh penciptaan semula, penghijrahan atau perubahan profil kemudian, dan ia jauh lebih mudah dibandingkan daripada ralat kebenaran tanpa konteks.