Бір ноутбукте, бір қосылған 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 жүктемесі виртуалды машина проксиінің артында жүреді және өз клиенті бар бөлек виртуалды машина өз саясатын сақтайды. Біреуін әдейі таңдап, оны контейнердің ішінен сынап көріңіз, өйткені пайдаланушы сұранысы дәл сонда туындайды.

Қатысты мақалалар