VPN контейнеріндегі NET_ADMIN: нені және қайда өзгерте алады
Бұл мүмкіндік бір желілік ат кеңістігінің ішінде интерфейстерді, маршруттарды және firewall-ды өзгертуге рұқсат береді. Хост желісі кезінде бұл кеңістік хосттың өз стегі болып табылады.
NET_ADMIN — Linux мүмкіндігі, ол процеске желілік әкімшілік жүргізуге мүмкіндік береді, ал контейнерде ол дәл осыны процесс жұмыс істеп тұрған желілік ат кеңістігінің ішінде жасайды. Бұл сокет ашуға арналған лицензия емес және құрылғының немесе маршруттың орнын баспайды. Қызықты сұрақ ешқашан мүмкіндіктің берілген-берілмегенінде емес, өзгеріс қай ат кеңістігіне түсетінінде.
Мүмкіндік нені қамтиды
Өз ат кеңістігінің ішінде NET_ADMIN ұстаған процесс интерфейстерді көтеріп, түсіре алады, мекенжайларды тағайындайды, маршруттарды қосып, жоя алады және firewall ережелерін жаза алады, бұл capabilities(7) осы мүмкіндік астында жинайтын операциялар тобы. Ол сондай-ақ ядро трафикті қалай кезекке қойып, сүзетінін басқаратын интерфейс деңгейіндегі параметрлерді реттей алады. VPN клиенті әдетте іске қосылу кезінде олардың бірнешеуін қажет етеді, содан кейін басқа ештеңе қажет етпейді. Сондықтан көптеген бейнелер пайдаланғанынан кеңірек құқық сұрайды.
Сол ат кеңістігінің сыртындағы операциялар қамтылмайды, ал көршілес артықшылықтар бөлек. Шикі пакеттерді оқу мен жазу NET_RAW-ге жатады, ал tun құрылғысын жасау үшін мүмкіндік те, құрылғы түйініне қатынас та қажет. Құрылғысы жоқ процесс желілік ақауға ұқсайтын, бірақ олай болмайтын рұқсат қатесін алады.
Ат кеңістігі залал радиусын анықтайды
Өз көпірлік желісіндегі контейнер өз loopback-ына, өз интерфейстеріне және өз маршруттау кестесіне жетеді. Онда NET_ADMIN беру VPN клиентіне хосттың маршруттау шешімдеріне тимей-ақ туннель құруға мүмкіндік береді, бұл контейнер бейнелерінің көпшілігі болжайтын орналасу.
Ол контейнерді хост желісіне ауыстырыңыз, сонда сол рұқсат енді хосттың маршруттары мен хосттың firewall-ын өңдейді, өйткені бөлек ат кеңістігі қалмады. Бір туннельді басқаруы тиіс клиент бүкіл машинаның трафигін бағыттай алады, ал оның бұзу скриптіндегі қате хостта ешкім жазбаған ережелерді қалдырады. Мүмкіндіктің өзінде ештеңе өзгерген жоқ; контекст өзгерді. Сондықтан бір compose файлы екі хостта басқаша әрекет етеді.
Біріктірілетін үш алғышарт
VPN контейнерлеріндегі іске қосылу ақаулары әдетте үш бөлек нәрсенің біріне қатысты: мүмкіндік, туннель құрылғысы және протоколды ядроның қолдауы. Үшеуін бірге беру жұмыс істейді, әрі келесі ақауды телуге келмейтін етеді. Ең аз compose үзіндісі мүмкіндікті береді және құрылғы түйінін анық жібереді:
services:
vpn:
image: example/vpn-client:latest
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun
sysctls:
- net.ipv4.conf.all.src_valid_mark=1Бейненің өз құжаттамасынан қандай sysctl қажет екенін оқыңыз, өйткені контейнердегі sysctl қосымша артықшылықты немесе хост деңгейіндегі параметрді талап етуі мүмкін. Бейне тек пайдаланушы кеңістігі режимін қолдайтын жерде құрылғы мүлде қажет емес және мүмкіндіктер тізімі соған сай қысқарады.
Тар операцияны беріңіз, режимді емес
Артықшылықты режим барлық мүмкіндікті тапсырып, бір мезгілде құрылғыға қатынасты кеңейтеді, сондықтан үш алғышарттың қайсысы жетіспегенін жасырады. Ол контейнердің ақау режимдерін хост өзгерістерінен ажыратуға келмейтін етеді. Жазу ұзағырақ болса да, анық тізімді таңдаңыз.
Root-сыз және пайдаланушы ат кеңістігіндегі орналастырулар мүмкіндіктің іс жүзіндегі мағынасын өзгертеді, өйткені процесс оны тек салыстырылған ат кеңістігінде ұстай алады. Мүмкіндіктер тізімін root-ты мысалдан root-сыз орындау ортасына көшіріп, сол құқықты күту түстен кейінгі уақытты жоғалтудың кәдімгі жолы.
Құпиялар бөлек шешімге жатады. NET_ADMIN ұстау клиенттің қандай әріптес сәйкестілігін ұсынатыны, қандай тіркелгі деректерін жүктейтіні немесе олардың қалай ауыстырылатыны туралы ештеңе айтпайды. Желілік әкімшілік сенім бермейді.
Өзгерісті тексеріп, рұқсаттың не үшін бар екенін жазыңыз
Туннельді жөндеуден бұрын контейнердің шын мәнінде не алғанын растаңыз. Төмендегі тексеру қосылған мүмкіндіктер мен желі режимін хабарлайды, содан кейін интерфейстер тізімінің ішінен қалай көрінетінін көрсетеді:
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 routeЕгер мүмкіндік бар болса, ал интерфейстер тізімі әлі бос болса, клиент бірдеңе жасауға үлгермей жатып істен шыққан, және келесі қарайтын жер — контейнер журналдары. Егер туннель бар болса, бірақ трафик ақпаса, контейнердің ішіндегі маршруттау кестесі келесі сұраққа жауап береді.
Бұзу жолын да тексеріңіз, өйткені firewall ережелерін жазатын клиент оларды қалдырып кетуі мүмкін. Контейнерді тоқтатып, хост желісі пайдаланылса, хосттың ережелер жиынтығын қайта тексеріңіз. Іске қосылу кезінде тек екі секунд қажет рұқсатты compose файлында оны түсіндіретін ескертусіз тұрақты талап ретінде сипаттауға болмайды.
Әр мүмкіндіктің жанына себебін жазыңыз: қай операция оны қажет етті және онсыз не істен шығады. Бұл ескерту бейне жаңартуларынан кейін де сақталады, және дәл осы тексерілген артықшылықтар тізімі мен көшіріп қою арқылы өскен тізімнің айырмашылығы.