Хост дээрх хөтөч тань VPN-ий гарах хаягийг харуулж, контейнер таны гэрийн холболтыг мэдээлж, хэн нэгэн үүнийг алдагдал гэж нэрлэдэг. Юу ч алдагдаагүй. Хостийн туннель нь хостийн сүлжээний нэрийн орон зайд хамаарах интерфейс, маршрут, дүрмийн багц бөгөөд гүүрэн дээрх контейнер нь өөрийн анхдагч маршруттай өөр нэрийн орон зай юм. VPN клиент долоо хоногуудын турш холбогдсон байсан ч нэг ч контейнерын пакет хэзээ ч түүнд орж байгаагүй Compose стек дээр би суусан.

Нэрийн орон зайг трей дүрсний өмнө шалга

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

Тусгаарлалтаас гарах хоёр дэмжигдсэн алхам байна. --network host контейнерыг хостийн нэрийн орон зайд байрлуулдаг тул хостийн маршрут, улмаар туннелийг өвлөн авдаг. --network container:vpn өөр контейнерын нэрийн орон зайг хуваалцдаг бөгөөд ихэнх sidecar загвар ажлын ачааллыг VPN контейнерээр дамжуулдаг нь ийм л юм. Хоёулаа тодорхой сонголт; ихэвчлэн зөвхөн нэг нь байрлуулж буй хүний санаанд байсан зүйл.

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

Пакетыг гүүрнээс гартал дага

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

Пакет туннелийн төгсгөлийн цэгт хүрэхэд хостийн хаягийг агуулж байна. Контейнерын анхны хаяг дээр тулгуурласан аливаа дүрэм, бодлогын маршрут эсвэл хуваагдсан туннелийн шийдвэр тохирохоо болино, өөр өөр гарах замаар гарах ёстой хоёр контейнерыг зөвхөн эхээр ялгах боломжгүй. Хэрэв танд контейнер тус бүрийн маршрутчлал хэрэгтэй бол шийдвэрийг хөрвүүлэлтийн өмнө эсвэл таны хянаж буй нэрийн орон зайд гаргах ёстой.

Docker эдгээр дүрмийг өөрөө арчилдаг, daemon аль firewall backend-ээр тохируулагдсанаар дамжуулан. Дамжуулсан урсгалд зориулсан дэмжигдсэн дэгээнээс гадуур гараар бичсэн дүрмүүд, DOCKER-USER, daemon дахин эхлэх эсвэл хост шинэчлэгдэх үед дахин эрэмбэлэгдэж эсвэл хасагдаж болно. Docker-ийн пакет шүүлтийн баримт бичиг гинжин хэлхээний дарааллыг харуулдаг; практик зүйл нь дүрэм бүрт эзэн болон таны үнэхээр туршиж үзсэн дахин ачаалах зам хэрэгтэй.

Хоёр системийг тусад нь турш

Нэг нэрийн орон зайн нотолгоо нөгөөгийн талаар юу ч хэлэхгүй. VPN контейнерын дотор ажиллуулсан хүсэлт туннель тэр контейнерт ажиллаж байгааг нотолно. Энэ нь хостийн тухай нотолгоо биш бөгөөд --network host контейнероос ажиллуулсан ижил команд нь гүүрний тухай нотолгоо биш.

# host namespace
ip route get 1.1.1.1
ip -brief addr show

# a fresh container on the same bridge network
docker run --rm --network appnet alpine sh -c 'ip route; cat /etc/resolv.conf; ip -6 route'

Дараа нь туршилтыг ижил төстэй дүрс биш, харин жинхэнэ програмын контейнерын дотор давт. Програм нэмэлт маршрут, прокси орчны хувьсагч эсвэл өөр шийдэгчтэй байж болох бөгөөд тэдгээр нь тус бүр хариултыг өөрчилдөг. Нэр шийдэлт болон хоёр дахь хаягийн бүлгийг тэр бүр шалга: хэрэглэгчийн тодорхойлсон гүүрэн дэх контейнерууд Docker-ийн суурилагдсан шийдэгчээр 127.0.0.11 дээр шийдэгддэг бөгөөд гүүрэн дэх IPv6 анхдагч маршрут нь та зөвхөн IPv4 туннель туршиж байх хооронд урсгалыг гадагш гаргаж болно.

Итгэмжлэлийг хүрэхээс өмнө хэв маягийг унш

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

What you seeUsual causeFirst check
Host exits through the VPN, container shows the ISP addressThe container never entered the tunnelDefault route inside the container
Container works until the daemon restarts, then stopsRules outside the supported hook, or a changed backendDaemon's reported firewall backend and DOCKER-USER
Container loses internal hosts after the tunnel comes upVPN prefix overlaps the Docker bridge subnetip route on the host, then docker network inspect
Small replies arrive, large ones hangTunnel MTU or missing MSS clampingLink MTU on both ends of the tunnel
Container falls back to the ISP address when the tunnel dropsNothing enforces the kill switch for forwarded trafficStop the tunnel with a request in flight

Давхцлын мөр өөрийн өгүүлбэртэй байх ёстой. 172.17.0.0/16-д эсвэл таны гүүрний угтварыг санамсаргүй агуулсан 10.0.0.0/8-д маршрут түлхэж буй VPN профайл туннелийг контейнерын дэд сүлжээг шаардуулахад хүргэдэг бөгөөд хөрвүүлсэн хаяг руу явсан хариултууд буруу зүгт явна эсвэл алга болно. Docker сүлжээг дахин дугаарлах нь ихэвчлэн үл хамаарах зүйлсийг хуримтлуулахаас илүү цэвэр.

Хамрах хүрээг тодорхой болго, дараа нь санаатайгаар эвд

Хоёр загвар хяналтад тэсдэг. VPN контейнерын нэрийн орон зайг хуваалц, тэгвэл хамрагдсан ажлын ачаалал бүр нэг дахин эхлэх хил бүхий нэг туннель ашиглана, энэ нь нэг үйлчилгээнд өөр гарах зам эсвэл өөрийн DNS зам хэрэгтэй болох хүртэл энгийн. Эсвэл контейнерын сүлжээг хост дээрх VPN гарц руу чиглүүл: дамжуулалт идэвхтэй, гүүрний угтвар туннель рүү чиглэсэн, буцах урсгал тодорхой зохицуулагдсан. Энэ нь сүлжээ тус бүрийн хяналтыг худалдаж авч, daemon болон клиентийн шинэчлэлтийн туршид арчлах дүрмийн багцыг танд зарцуулдаг.

Ямар ч байсан, чухал туршилт бол бүтэлгүйтлийн тохиолдол юм. Контейнерын хүсэлт нисэж байх үед туннелийг зогсоож, пакет хаашаа явж байгааг хар. Хэрэв шууд зам руу буцаж унавал хамрах хүрээ хэзээ ч хэрэгжээгүй, учир нь клиентийн kill switch нь клиентийн өөрийн урсгалыг удирддаг, гүүрнээс дамжуулсан пакетыг биш. Дараа нь daemon болон хостыг дахин эхлүүлж, үр дүнг хоёр дахь удаагаа батал; гараар бичсэн дүрмүүд алга болох мөч нь яг тэр.

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

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