VPN konteynerida NET_ADMIN: nimani va qayerda o'zgartira oladi
Bu qobiliyat bitta tarmoq nom maydoni ichida interfeys, marshrut va tarmoq devori o'zgarishlariga ruxsat beradi. Xost tarmog'i bilan bu maydon xostning o'z stegi hisoblanadi.
NET_ADMIN — bu jarayonga tarmoq administratsiyasini bajarishga imkon beruvchi Linux qobiliyati bo'lib, konteynerda u aynan shuni jarayon ishlayotgan tarmoq nom maydoni ichida amalga oshiradi. Bu soket ochish litsenziyasi emas va qurilma yoki marshrutning o'rnini bosmaydi. Qiziqarli savol hech qachon qobiliyat berilganmi yoki yo'qmi emas, balki o'zgarish qaysi nom maydoniga tushishi.
Qobiliyat nimani qamrab oladi
O'z nom maydoni ichida NET_ADMIN tutgan jarayon interfeyslarni ko'tarib va tushirib, manzillarni tayinlab, marshrutlarni qo'shib va olib tashlab, tarmoq devori qoidalarini yozishi mumkin, bu esa capabilities(7) ushbu qobiliyat ostida to'playdigan amallar guruhi. U shuningdek yadro trafikni qanday navbatga qo'yishini va filtrashini boshqaradigan interfeys darajasidagi sozlamalarni ham o'zgartira oladi. VPN mijozi odatda ishga tushishda ulardan bir nechtasiga muhtoj bo'ladi va keyin boshqa hech narsaga muhtoj emas. Shuning uchun aksariyat obrazlar ishlatganidan ko'ra kengroq ruxsat so'raydi.
O'sha nom maydonidan tashqaridagi amallar qamrab olinmaydi, qo'shni imtiyozlar esa alohida. Xom paketlarni o'qish va yozish NET_RAW ga tegishli, tun qurilmasini yaratish esa ham qobiliyatni, ham qurilma tuguniga kirishni talab qiladi. Qurilma bo'lmagan jarayon tarmoq muammosiga o'xshaydigan, lekin unday bo'lmagan ruxsat xatosini oladi.
Nom maydoni zarar radiusini belgilaydi
O'z ko'prik tarmog'idagi konteyner o'z loopbackiga, o'z interfeyslariga va o'z marshrutlash jadvaliga yetadi. U yerda NET_ADMIN berish VPN mijoziga xostning marshrutlash qarorlariga tegmasdan tunnel qurish imkonini beradi, bu aksariyat konteyner obrazlari taxmin qiladigan tartib.
O'sha konteynerni xost tarmog'iga o'tkazing va o'sha ruxsat endi xostning marshrutlarini va xostning tarmoq devorini tahrirlaydi, chunki alohida nom maydoni qolmagan. Bitta tunnelni boshqarishi kerak bo'lgan mijoz endi butun mashinaning trafigini yo'naltirishi mumkin, va uning yig'ish skriptidagi xato xostda hech kim yozmagan qoidalarni qoldiradi. Qobiliyatning o'zida hech narsa o'zgarmadi; kontekst o'zgardi. Shuning uchun bir xil compose fayli ikki xostda turlicha harakat qiladi.
Bittaga qo'shiladigan uch shart
VPN konteynerlaridagi ishga tushish xatolari odatda uch alohida narsadan biriga tegishli: qobiliyat, tunnel qurilmasi va protokol uchun yadro yordami. Uchtasini birga berish ishlaydi va keyingi xatoni ham ayblash imkonsiz qiladi. Minimal compose qismi qobiliyatni beradi va qurilma tugunini aniq uzatadi:
services:
vpn:
image: example/vpn-client:latest
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun
sysctls:
- net.ipv4.conf.all.src_valid_mark=1Obrazning o'z hujjatlaridan qaysi sysctl kerakligini o'qing, chunki konteynerdagi sysctl qo'shimcha imtiyoz yoki xost darajasidagi sozlamani talab qilishi mumkin. Obraz faqat foydalanuvchi fazosi rejimini qo'llab-quvvatlaydigan joyda qurilma umuman kerak emas va qobiliyatlar ro'yxati shunga mos qisqaradi.
Tor amalni bering, rejimni emas
Imtiyozli rejim har bir qobiliyatni topshiradi va bir vaqtning o'zida qurilmalarga kirishni kengaytiradi, shuning uchun uch shartdan qaysi biri yetishmaganini yashiradi. U konteynerning nosozlik usullarini xost o'zgarishlaridan ajratib bo'lmaydigan ham qiladi. Yozish uzunroq bo'lsa ham aniq ro'yxatni afzal ko'ring.
Rootsiz va foydalanuvchi nom maydonidagi joylashtirishlar qobiliyatning amaldagi ma'nosini o'zgartiradi, chunki jarayon uni faqat xaritalangan nom maydoni ichida saqlashi mumkin. Qobiliyatlar ro'yxatini rootli misoldan rootsiz ish muhitiga ko'chirish va xuddi shu ruxsatni kutish tushdan keyin vaqtni yo'qotishning odatiy usuli.
Sirlar alohida qarorga tegishli. NET_ADMIN tutish mijoz qaysi hamkor identifikatorini taqdim etishi, qaysi hisob ma'lumotlarini yuklashi yoki ular qanday almashtirilishini aytmaydi. Tarmoq administratsiyasi ishonch bermaydi.
O'zgarishni tekshiring va ruxsat nima uchun borligini yozib qo'ying
Tunnelni tuzatishdan oldin konteyner haqiqatda nima olganini tasdiqlang. Quyidagi tekshiruv qo'shilgan qobiliyatlar va tarmoq rejimini xabar qiladi, so'ng interfeyslar ro'yxati ichkaridan qanday ko'rinishini ko'rsatadi:
docker inspect --format '{{.HostConfig.CapAdd}} {{.HostConfig.NetworkMode}} {{.HostConfig.Privileged}}' vpn
docker exec vpn sh -c 'grep CapEff /proc/self/status'
docker exec vpn ip -br addr
docker exec vpn ip routeAgar qobiliyat mavjud bo'lsa-yu, interfeyslar ro'yxati hali bo'sh bo'lsa, mijoz biror narsa yaratishdan oldin ishdan chiqqan, va keyingi qarash joyi konteyner jurnallari. Agar tunnel mavjud bo'lsa-yu, trafik oqmasa, konteyner ichidagi marshrutlash jadvali keyingi savolga javob beradi.
Yig'ish yo'lini ham sinab ko'ring, chunki tarmoq devori qoidalarini yozadigan mijoz ularni ortda qoldirishi mumkin. Konteynerni to'xtatib, xost tarmog'i ishlatilsa xostning qoidalar to'plamini qayta tekshiring. Ishga tushishda faqat ikki soniya kerak bo'ladigan ruxsatni compose faylida buni tushuntiruvchi izohsiz doimiy talab sifatida tasvirlamaslik kerak.
Har bir qobiliyat yoniga sababini yozing: qaysi amal unga muhtoj edi va usiz nima ishlamaydi. O'sha izoh obraz yangilanishlaridan keyin ham saqlanadi, va aynan u ko'rib chiqilgan imtiyozlar ro'yxati bilan nusxa ko'chirish hisobiga o'sgan ro'yxat o'rtasidagi farqdir.