Windows konteineri un VPN: kāpēc vietējais tīkls sabrūk
Windows konteiners izmanto resursdatora maršrutēšanas tabulu, tāpēc VPN, kas bloķē vietējo apakštīklu, paņem līdzi arī konteinera prefiksu. Linux režīms iet citu ceļu.
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 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 |
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.