Vienā klēpjdatorā, kad pievienots viens VPN klients, Linux konteineri turpina savā starpā sazināties, bet Windows konteineri apstājas. Mainīgais nav attēls, bet ceļš, pa kuru paketes nonāk resursdatorā. Windows konteineri noklusējuma tīklā aizņemas resursdatora maršrutēšanas tabulu un tulkošanu, tāpēc politika, kas maina resursdatora maršrutēšanu, maina arī tos. Apstipriniet to ar maršruta meklēšanu, pirms kaut ko pārinstalējat.

Kur Windows konteinera paketes nonāk resursdatorā

Konteiners noklusējuma nat tīklā iegūst adresi no Host Networking Service prefiksa, parasti kaut kur 172.16.0.0/12 iekšienē, un sasniedz resursdatoru caur virtuālo adapteri. Resursdators pārvalda šī prefiksa maršrutu un pārveido datplūsmu uz to adapteri, kas pašlaik ir aktīvs. Šī ceļa vidū nav atsevišķas virtuālās mašīnas.

Tieši šī konstrukcija padara bojājumu mehānisku. Kad konteiners sūta paketi, resursdators veic maršruta meklēšanu konteinera prefiksam. Kurš maršruts uzvar, tur pakete aiziet, un konteineram par to nav viedokļa.

Ko VPN klients maina šajā ceļā

Uzņēmuma klients bieži instalē plašu maršrutu kopumu un filtru, kas, kamēr tunelis ir aktīvs, atsaka piekļuvi vietējam apakštīklam. Nodoms ir aizsardzības: apdraudēts vietējais tīkls nedrīkst sasniegt aizsargātu mašīnu. Blakusefekts ir tāds, ka resursdatora maršruts uz konteinera prefiksu vairs nav vietējais NAT tīkls.

Tā vietā meklēšana atbilst tunelim, un pakete tiek nodota vārtejai, kas nekad nav dzirdējusi par šo konteinera adresi. Ping neizdodas, lietojumprogramma nokļūst taimautā, un konteiners izskatās salūzis, kamēr VPN ikona spīd. Apskatiet resursdatora tabulu, kamēr esat savienots, un konkurējošais maršruts ir redzams.

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

Kāpēc Linux konteineri uzvedas citādi

Linux dzinējs palaiž konteinerus vieglā virtuālajā mašīnā, un izejošos savienojumus no šīs mašīnas atver starpnieks resursdatora pusē konteinera vārdā. Ligzdu ierosina resursdators, tāpēc VPN noteikums par konteinera prefiksu uz to neattiecas tādā pašā veidā, un darba slodze turpina sasniegt tīklu.

Šī atšķirība arī izskaidro, kāpēc Linux receptes nepārnāk. Linux konteineram, kuram vajadzīgs savs tunelis, piešķir TUN ierīci un NET_ADMIN iespēju. Windows konteineri nepiešķir nevienu saskarni kā ierīci, tāpēc šim modelim tajā pusē nav ekvivalenta.

Pierādiet maršrutu, tad izvēlieties konstrukciju

Vāciet pierādījumus no resursdatora, nevis no konteinera, jo meklēšanu veic resursdators:

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

Palaidiet maršrutu izvadi vienreiz pirms VPN pievienošanās un vienreiz pēc tam. Ja otrajā izvadē konteinera prefikss norāda uz tuneļa adapteri, diagnoze ir pabeigta, un konteineru restartēšana nepalīdzēs.

Pirmais variants ir politikas lēmums: pajautājiet tīkla īpašniekam, vai šai ierīcei var atļaut vietējo LAN piekļuvi. Vairāki uzņēmuma klienti to piedāvā kā iestatījumu, bet tas vājina apzināti noteiktu robežu. Lūdziet to kā dokumentētu izņēmumu ar īpašnieku un pārskatīšanas datumu. Katras ierīces slēdzis, pie kura neviens neatgriežas, ir veids, kā aizsardzības politika klusi pazūd.

Kur politikai jāpaliek, pārvietojiet darba slodzi, nevis cīnieties ar maršrutu. Caurspīdīgs tīkls ar skaidru apakštīklu un vārteju novieto konteinerus uz vietējā posma, Linux darba slodze darbojas aiz virtuālās mašīnas starpnieka, un atsevišķa virtuālā mašīna ar savu klientu saglabā savu politiku. Izvēlieties vienu apzināti un pārbaudiet to konteinera iekšienē, jo tur rodas lietotāja pieprasījums.

Saistītie raksti