Нэг зөөврийн компьютер дээр нэг VPN клиент холбогдсон үед Linux контейнерууд хоорондоо ярилсаар байхад Windows контейнерууд зогсдог. Хувьсагч нь дүрс биш, пакетууд хост руу орох зам юм. Өгөгдмөл сүлжээний Windows контейнерууд хостын маршрутын хүснэгт, хөрвүүлэлтийг зээлдэг тул хостын маршрутчлалыг өөрчилдөг бодлого тэднийг ч өөрчилдөг. Ямар нэг зүйлийг дахин суулгахын өмнө үүнийг маршрут хайлтаар баталгаажуулаарай.

Windows контейнерын пакетууд хост руу хаана ордог

Өгөгдмөл nat сүлжээний контейнер Host Networking Service-ийн префиксээс хаяг авдаг, ихэвчлэн 172.16.0.0/12-ийн дотор хаа нэгтээ, виртуал адаптераар дамжин хостод хүрдэг. Хост тухайн префиксын маршрутыг эзэмшиж, одоо идэвхтэй байгаа адаптер руу урсгалыг хөрвүүлдэг. Тухайн замын голд тусдаа виртуал машин байхгүй.

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

VPN клиент тухайн зам дээр юу өөрчилдөг

Корпорацийн клиент ихэвчлэн маршрутын өргөн багц, туннель идэвхтэй үед локал дэд сүлжээнд хандахыг хориглодог шүүлтүүр суулгадаг. Зорилго нь хамгаалалт: эвдэрсэн локал сүлжээ хамгаалагдсан машин руу хүрэх ёсгүй. Гаж нөлөө нь хостын контейнерын префикс хүртэлх маршрут цаашид локал NAT сүлжээ биш.

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

Container modeOutbound pathTypical result behind the VPN
Windows, default natHost routes and translates container trafficContainer prefix follows the tunnel and fails
Windows, transparentContainer sits on the physical linkDepends on the local subnet being allowed
Linux engine on Docker DesktopVM egress proxied by a host processOften keeps working

Linux контейнерууд яагаад өөрөөр ажилладаг

Linux хөдөлгүүр контейнеруудыг хөнгөн виртуал машины дотор ажиллуулдаг бөгөөд тухайн машинаас гарах холболтыг контейнерын өмнөөс хост талын прокси нээдэг. Сокетыг хост эхлүүлдэг тул контейнерын префиксын тухай VPN дүрэм түүнд мөн адил үйлчлэхгүй бөгөөд ажлын ачаалал сүлжээнд хүрсээр байна.

Энэ ялгаа нь Linux жорынгууд яагаад шилждэггүйг ч тайлбарладаг. Өөрийн туннель хэрэгтэй Linux контейнерт TUN төхөөрөмж ба NET_ADMIN боломжийг өгдөг. Windows контейнерууд ямар ч интерфейсийг төхөөрөмж болгон ил гаргадаггүй тул энэ загварын тэр талд дүйцэх зүйл байхгүй.

Маршрутыг батал, дараа нь загвар сонго

Нотолгоог контейнерээс биш хостноос цуглуулаарай, учир нь хайлтыг хост хийдэг:

docker network inspect nat --format "{{range .IPAM.Config}}{{.Subnet}}{{end}}"
route print -4
Get-NetRoute -AddressFamily IPv4 | Where-Object DestinationPrefix -like "172.16.*"

Маршрутын гаралтыг VPN холбогдохын өмнө нэг удаа, дараа нь нэг удаа ажиллуулаарай. Хоёр дахь гаралтад контейнерын префикс туннелийн адаптер руу зааж байвал оношлогоо дууссан бөгөөд контейнеруудыг дахин эхлүүлэх нь тус болохгүй.

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

Бодлого тогтох ёстой газарт маршруттай тэмцэхийн оронд ажлын ачааллыг зөө. Тодорхой дэд сүлжээ, гарцтай тунгалаг сүлжээ контейнеруудыг локал холбоос дээр тавьж, Linux ажлын ачаалал виртуал машины проксийн ард ажилладаг ба өөрийн клиенттэй тусдаа виртуал машин өөрийн бодлогыг хадгална. Нэгийг нь санаатайгаар сонгож, контейнерын дотроос шалгаарай, учир нь хэрэглэгчийн хүсэлт тэндээс үүсдэг.

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