Кантэйнеры Windows і VPN: чаму ламаецца лакальная сетка
Кантэйнер Windows карыстаецца табліцай маршрутаў хоста, таму VPN, які блакуе лакальную падсетку, забірае з сабой і прэфікс кантэйнера. Рэжым Linux ідзе іншым шляхам.
На адным ноўтбуку, з адным падключаным кліентам VPN, кантэйнеры Linux працягваюць размаўляць адзін з адным, а кантэйнеры Windows спыняюцца. Пераменная — не вобраз, а шлях, які пакеты праходзяць у хост. Кантэйнеры Windows у стандартнай сетцы пазычаюць табліцу маршрутаў і трансляцыю хоста, таму палітыка, якая змяняе маршрутызацыю хоста, змяняе і іх. Пацвердзіце гэта пошукам маршруту, перш чым нешта пераўсталёўваць.
Дзе пакеты кантэйнера Windows трапляюць у хост
Кантэйнер у стандартнай сетцы nat атрымлівае адрас з прэфікса Host Networking Service, звычайна недзе ўнутры 172.16.0.0/12, і дасягае хоста праз віртуальны адаптар. Хост валодае маршрутам для гэтага прэфікса і транслюе трафік да таго адаптара, які цяпер актыўны. Пасярэдзіне гэтага шляху няма асобнай віртуальнай машыны.
Менавіта гэтая схема робіць збой механічным. Калі кантэйнер адпраўляе пакет, хост выконвае пошук маршруту для прэфікса кантэйнера. Які б маршрут ні перамог, туды пакет і пойдзе, і кантэйнер на гэта не ўплывае.
Што кліент VPN змяняе на гэтым шляху
Карпаратыўны кліент часта ўсталёўвае шырокі набор маршрутаў і фільтр, які забараняе доступ да лакальнай падсеткі, пакуль тунэль узняты. Намер абарончы: скампраметаваная лакальная сетка не павінна дасягаць абароненай машыны. Пабочны эфект у тым, што маршрут хоста да прэфікса кантэйнера ўжо не лакальная сетка NAT.
Замест гэтага пошук супадае з тунэлем, і пакет аддаецца шлюзу, які ніколі не чуў пра гэты адрас кантэйнера. Ping не праходзіць, праграма чакае да тайм-аўту, і кантэйнер выглядае зламаным, пакуль значок VPN свеціцца. Паглядзіце на табліцу хоста падчас падключэння — канкуруючы маршрут бачны.
| Container mode | Outbound path | Typical result behind the VPN |
|---|---|---|
| Windows, default nat | Host routes and translates container traffic | Container prefix follows the tunnel and fails |
| Windows, transparent | Container sits on the physical link | Depends on the local subnet being allowed |
| Linux engine on Docker Desktop | VM egress proxied by a host process | Often 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 ідзе за проксі VM, і асобная віртуальная машына з уласным кліентам захоўвае ўласную палітыку. Выберыце адзін варыянт свядома і праверце яго знутры кантэйнера, бо менавіта там узнікае запыт карыстальніка.