NET_ADMIN у VPN контејнеру: шта и где може да промени
Ова способност дозвољава промене интерфејса, рута и заштитног зида унутар једног мрежног именског простора. Са мрежом хоста, тај простор је сопствени стек хоста.
NET_ADMIN је Linux способност која процесу омогућава да обавља мрежну администрацију, а у контејнеру ради управо то у оном мрежном именском простору у ком процес ради. То није лиценца за отварање сокета и није замена за уређај или руту. Занимљиво питање никада није да ли је способност додељена, већ који именски простор прима промену.
Шта способност покрива
Унутар свог именског простора процес који држи NET_ADMIN може да подиже и спушта интерфејсе, додељује адресе, додаје и уклања руте и пише правила заштитног зида, што је група операција које capabilities(7) прикупља под овом способношћу. Може и да подешава поставке на нивоу интерфејса које контролишу како језгро ставља саобраћај у ред и филтрира га. VPN клијенту је обично потребно неколико њих при покретању и ништа друго после. Зато већина слика тражи већи обухват него што користи.
Операције изван тог именског простора нису покривене, а суседне привилегије су одвојене. Читање и писање сирових пакета припада NET_RAW, а стварање tun уређаја захтева и способност и приступ чвору уређаја. Процес без уређаја добија грешку дозволе која изгледа као мрежни проблем, а није.
Именски простор одређује радијус штете
Контејнер на сопственој мостовној мрежи достиже сопствени loopback, сопствене интерфејсе и сопствену табелу рутирања. Додела NET_ADMIN тамо омогућава VPN клијенту да изгради тунел без дирања одлука рутирања хоста, што је распоред који претпоставља већина контејнерских слика.
Пребаците тај контејнер на мрежу хоста и иста дозвола сада уређује руте хоста и заштитни зид хоста, јер није остао одвојен именски простор. Клијент који је требало да управља једним тунелом тада може да преусмери саобраћај целе машине, а грешка у његовој скрипти за растављање оставља хосту правила која нико није написао. Ништа у самој способности се није променило; променио се контекст. Зато се исти 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Ако је способност присутна, а листа интерфејса је још празна, клијент је отказао пре него што је могао било шта да створи, и следеће место за гледање су логови контејнера. Ако тунел постоји, али саобраћај не тече, на следеће питање одговара табела рутирања унутар контејнера.
Тестирајте и пут растављања, јер клијент који пише правила заштитног зида може да их остави за собом. Зауставите контејнер и поново проверите скуп правила хоста ако се користи мрежа хоста. Дозвола која је потребна само две секунде при покретању не треба у compose фајлу да буде описана као трајни захтев без напомене која то објашњава.
Запишите разлог поред сваке способности: која операција ју је захтевала и шта отказује без ње. Та напомена преживљава ажурирања слике, и управо она разликује прегледану листу привилегија од оне која је нарасла копирањем и лепљењем.