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 файлд үүнийг тайлбарласан тэмдэглэлгүйгээр байнгын шаардлага гэж дүрслэх ёсгүй.

Чадвар бүрийн хажууд шалтгааныг бич: аль үйлдэл үүнийг шаардсан, үүнгүйгээр юу бүтэлгүйтдэг. Тэр тэмдэглэл образын шинэчлэлээс хойш ч үлддэг бөгөөд энэ нь хянасан эрхийн жагсаалт болон хуулж буулгаснаар өссөн жагсаалтын ялгаа юм.

Холбоотой нийтлэлүүд