Контейнерын дүрсүүд шаардлагатай бүх OpenVPN хоёртын болон тохиргооны файлыг агуулж болох бөгөөд эхний сүлжээний дуудлагад бүтэлгүйтсээр байна. Алдаа нь /dev/net/tun-г нэрлэдэг, учир нь програм цөмөөс TUN интерфэйс хүссэн боловч контейнерт төхөөрөмжийн зангилаа ч, үүсгэх чадвар ч байгаагүй. Эдгээр нь хоёр тусдаа зөвшөөрөл бөгөөд нэгийг засах нь нөгөөг яг байсан газарт нь үлдээдэг.

Тэднийг салгахад тус бүрд нь нэг команд хэрэгтэй. Дараах алдааны мэдээлэл танд яг аль хил дээр зогсож байсныг хэлнэ.

Төхөөрөмжийн зангилаа ба чадвар нь хоёр хаалга

Төхөөрөмжийн зангилаа нь файлын системийн объект тул контейнер үүнийг өөрийн mount нэрний орон зайд харах ёстой. Чадвар нь зөвшөөрөл тул процесс интерфэйс үүсэх нэрний орон зайд CAP_NET_ADMIN шаардана. Төхөөрөмжийг чадваргүйгээр дамжуулбал нээгддэг зангилаа ба бүтэлгүйтдэг ioctl өгнө. Чадварыг төхөөрөмжгүйгээр өгвөл програм юу ч нээж чадахгүй болдог, тиймээс жишээнүүдэд хоёул ихэвчлэн хамт гардаг.

Docker-ийн devices тохиргоо хостын төхөөрөмжийг контейнерт буулгана, харин cap_add чадварын багцыг тохируулна. Ижил замын bind mount нь төхөөрөмжийн хандалтын утгыг хэрэглэхгүйгээр файлыг харагдах талбарт оруулна.

Үүнийг Compose файлаас гадна давтана уу

Үйлчилгээг засахын өмнө хост төхөөрөмжтэй эсэх, энгийн контейнер интерфэйс үүсгэж чадах эсэхийг шалгана уу. Доорх команд зориуд хамгийн бага бөгөөд түүний цор ганц зорилго нь хост асуудлыг compose асуудлаас салгах юм. Хэрэв бүтэлгүйтвэл ямар ч compose өөрчлөлт тус болохгүй.

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'

Хост дээр зангилаа байхгүй нь tun модуль боломжгүй гэсэн үг бөгөөд энэ нь контейнер биш хост талын засвар юм. Зангилаа байгаа боловч контейнер дотор нээгдэхгүй бол төхөөрөмжийн хандалт руу заана, мөн мэдээлэл no such file биш permission denied гэж хэлнэ. Эдгээр хоёр бүтэлгүйтлийн дараалал нь бүх оношлогоо юм. Ямар нэг флагийг өөрчлөхийн өмнө алийг нь харсанаа бичиж үлдээнэ үү.

TUN-ийн дараах алдаанууд өөр асуудлууд

Интерфэйс гарч ирмэгц дараагийн бүтэлгүйтэл өөр эзэнтэй болно. Баталгаажуулалтын алдаа нь туннель серверт хүрч, итгэмжлэлүүд татгалзагдсаныг илэрхийлдэг тул чадварын өөрчлөлт тус болохгүй. Програмууд бүтэлгүйтсээр байхад туннель тогтвол зам, дамжуулалт, контейнер доторх DNS шийдвэрлэлт эсвэл контейнерийн өөрийн сүлжээний зохион байгуулалт руу заана. Тэдгээрийн аль нь ч TUN зөвшөөрөл хариулж чадахгүй энгийн сүлжээний асуулт юм. Өөрчлөлт бүрийн дараа анхны тестийг давтах нь бүтэлгүйтлүүд нэг сэтгэгдэлд нийлэхээс сэргийлнэ.

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

Контейнер дотор интерфэйсийг шалгана уу

Интерфэйс болон чадварын багцыг шалгана уу хостоос биш, ажиллаж буй контейнерийн дотроос. Доорх командууд төхөөрөмжийн зангилаа, чадварын жагсаалт, интерфэйс огт үүсгэж болох эсэхийг харуулна. Тэдгээрийг клиент ажиллуулж буй ижил контейнерт ажиллуулж, дүрс хамгийн бага бол хэрэгслүүдийг суулгана уу.

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

bounding set-д байгаа ч effective set-д байхгүй чадвар нь хэзээ ч өгөөгүй чадвараас өөрөөр ажилладаг бөгөөд capsh хоёуланг нь харуулна. Зангилаа байгаа, чадвар байгаа ч үүсгэлт бүтэлгүйтсээр байвал ажиллах орчин өөр зүйлийг шаарддаг, жишээ нь үйлдлийг хязгаарлах seccomp профайл эсвэл AppArmor бодлого. Энэ нь програм биш ажиллах орчин баримтжуулдаг гурав дахь хил юм.

Контейнерийн флагууд, дүрс, оролдлого бүрийн яг алдааг бичиж үлдээнэ үү. Тэр тэмдэглэлийг дараа уншсан хүн бүх мөрдөн байцаалтыг давтахгүйгээр аль хаалга хаалттай байсныг хэлж чадна.

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