Konteyner obrazlari kerak bo‘lgan barcha OpenVPN ikkilik va konfiguratsiya fayllarini olib yurishi va baribir birinchi tarmoq chaqiruvida muvaffaqiyatsiz bo‘lishi mumkin. Xato /dev/net/tun nomini tilga oladi, chunki dastur yadrodan TUN interfeysini so‘radi va konteynerda na qurilma tuguni, na uni yaratish imkoniyati bor edi. Bular ikki alohida ruxsatdir va birini tuzatish ikkinchisini aynan o‘sha joyda qoldiradi.

Ularni ajratish har biri uchun bitta buyruq talab qiladi. Keyingi xato xabari sizga aslida qaysi chegarada turganingizni aytadi.

Qurilma tuguni va imkoniyat ikki eshikdir

Qurilma tuguni fayl tizimi obyekti, shuning uchun konteyner uni o‘zining mount nomlar fazosida ko‘rishi kerak. Imkoniyat ruxsatdir, shuning uchun jarayonga interfeys yaratiladigan nomlar fazosida CAP_NET_ADMIN kerak. Qurilmani imkoniyatsiz o‘tkazish sizga ochiladigan tugun va muvaffaqiyatsiz bo‘ladigan ioctl beradi. Imkoniyatni qurilmasiz berish dasturni hech narsani ocholmaydigan holatda qoldiradi, shuning uchun misollarda ikkalasi odatda birga ko‘rinadi.

Docker'ning devices sozlamasi host qurilmasini konteynerga xaritalaydi, cap_add esa imkoniyatlar to‘plamini sozlaydi. Xuddi shu yo‘lning bind mount'i faylni qurilma kirish semantikasini qo‘llamasdan ko‘rinish maydoniga qo‘yadi.

Buni Compose faylidan tashqarida takrorlang

Xizmatni tahrirlashdan oldin hostda qurilma borligini va yalang‘och konteyner interfeys yarata olishini tekshiring. Quyidagi buyruq ataylab minimal bo‘lib, uning yagona maqsadi host muammosini compose muammosidan ajratishdir. Agar u muvaffaqiyatsiz bo‘lsa, hech qanday compose o‘zgarishi yordam bermaydi.

ls -l /dev/net/tun
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun:/dev/net/tun alpine sh -c 'apk add -q iproute2 && ip tuntap add dev tun9 mode tun && ip link show tun9'

Hostda tugun yo‘qligi tun moduli mavjud emasligini bildiradi, bu konteyner emas, host tomonidagi tuzatishdir. Tugun bor bo‘lsa-da konteyner ichida ochilmasa, bu qurilmaga kirishni ko‘rsatadi va xabar no such file emas, permission denied deb aytadi. Bu ikki muvaffaqiyatsizlikning tartibi butun tashxisdir. Biron bir bayroqni o‘zgartirishdan oldin qaysinisini ko‘rganingizni yozib qo‘ying.

TUN dan keyingi xatolar boshqa muammolardir

Interfeys paydo bo‘lishi bilan keyingi muvaffaqiyatsizlikning egasi boshqa bo‘ladi. Autentifikatsiya xatolari tunnel serverga yetib borganini va hisob ma'lumotlari rad etilganini bildiradi, shuning uchun imkoniyat o‘zgarishlari yordam bermaydi. Dasturlar hali ham muvaffaqiyatsiz bo‘layotganda tunnel o‘rnatilsa, bu marshrutlar, yo‘naltirish, konteyner ichidagi DNS hal qilish yoki konteynerning o‘z tarmoq tuzilishiga ishora qiladi. Ularning har biri TUN ruxsati javob bera olmaydigan oddiy tarmoq savolidir. Har bir o‘zgarishdan keyin asl testni takrorlash muvaffaqiyatsizliklarning bitta taassurotga qo‘shilib ketishini oldini oladi.

Ishlaydigan misoldan har bir sozlamani ko‘chirish minimal tuzatishni o‘qib bo‘lmaydigan xizmat ta'rifiga aylantiradigan yo‘ldir. Faqat shu joylashtirishga kerak bo‘lganlarini olib keling va har biri nima uchun borligini yozing.

Konteyner ichida interfeysni tekshiring

Interfeys va imkoniyatlar to‘plamini tekshiring hostdan emas, ishlab turgan konteyner ichidan. Quyidagi buyruqlar qurilma tugunini, imkoniyatlar ro‘yxatini va umuman interfeys yaratish mumkinmi-yo‘qmi ko‘rsatadi. Ularni mijozni ishga tushirgan ayni konteynerda ishga tushiring va obraz minimal bo‘lsa, asboblarni o‘rnating.

ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9

bounding set da mavjud, lekin effective set da mavjud bo‘lmagan imkoniyat hech qachon berilmagan imkoniyatdan boshqacha harakat qiladi va capsh ikkalasini ham ko‘rsatadi. Tugun mavjud va imkoniyat ham bor bo‘lsa-da yaratish hali ham muvaffaqiyatsiz bo‘lsa, ish muhiti operatsiyani cheklaydigan seccomp profili yoki AppArmor siyosati kabi boshqa narsani qo‘llayapti. Bu dastur emas, ish muhiti hujjatlashtiradigan uchinchi chegaradir.

Konteyner bayroqlarini, obrazni va har bir urinishning aniq xatosini yozib qo‘ying. O‘sha eslatmani keyin o‘qigan kishi butun tekshiruvni takrorlamasdan qaysi eshik yopiq bo‘lganini ayta oladi.

O'xshash maqolalar