Windows-containerar og VPN: kvifor lokalt nettverk bryt saman
Ein Windows-container nyttar rutetabellen til verten, så ein VPN som blokkerer det lokale subnettet tek containerprefikset med seg. Linux-modus går ein annan veg.
På éin berbar PC, med éin tilkopla VPN-klient, held Linux-containerar fram med å snakke saman medan Windows-containerar stoppar. Variabelen er ikkje imaget, men vegen pakkane tek inn i verten. Windows-containerar på standardnettet låner rutetabellen og omsetjinga til verten, så ein policy som endrar rutinga til verten endrar dei òg. Stadfest det med eit ruteoppslag før du reinstallerer noko.
Kvar pakkane til ein Windows-container kjem inn i verten
Ein container på standardnettet nat får ei adresse frå eit prefiks i Host Networking Service, vanlegvis ein stad innanfor 172.16.0.0/12, og når verten gjennom ein virtuell adapter. Verten eig ruta for dette prefikset og omset trafikk mot den adapteren som er aktiv. Det er inga eiga virtuell maskin midt i den vegen.
Det er denne utforminga som gjer feilen mekanisk. Når containeren sender ein pakke, gjer verten eit ruteoppslag for containerprefikset. Den ruta som vinn, er der pakken går, og containeren har inga meining om det.
Kva VPN-klienten endrar på den vegen
Ein bedriftsklient installerer ofte eit breitt sett med ruter og eit filter som nektar tilgang til det lokale subnettet medan tunnelen er oppe. Hensikta er defensiv: eit kompromittert lokalt nettverk skal ikkje nå ein verna maskin. Biverknaden er at ruta til verten mot containerprefikset ikkje lenger er det lokale NAT-nettet.
I staden treffer oppslaget tunnelen, og pakken vert overlevert til gatewayen, som aldri har høyrt om den containeradressa. Ping feilar, applikasjonen går ut på tid, og containeren ser øydelagd ut medan VPN-ikonet lyser. Sjå på tabellen til verten medan du er tilkopla, så er den konkurrerande ruta synleg.
| 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 |
Kvifor Linux-containerar oppfører seg annleis
Linux-motoren køyrer containerar inne i ein lett virtuell maskin, og utgåande samband frå den maskina vert opna av ein proxy på vertssida på vegner av containeren. Verten startar socketen, så regelen til VPN-en om containerprefikset gjeld ikkje for han på same måte, og arbeidslasta held fram med å nå nettet.
Den skilnaden forklarar òg kvifor Linux-oppskrifter ikkje kan overførast. Ein Linux-container som treng sin eigen tunnel, får eit TUN-utstyr pluss NET_ADMIN-evna. Windows-containerar eksponerer ingen grensesnitt som utstyr, så det mønsteret har ingen ekvivalent på den sida.
Prov ruta, og vel så ei utforming
Samle prov frå verten, ikkje frå containeren, fordi det er verten som gjer oppslaget:
docker network inspect nat --format "{{range .IPAM.Config}}{{.Subnet}}{{end}}"
route print -4
Get-NetRoute -AddressFamily IPv4 | Where-Object DestinationPrefix -like "172.16.*"
Køyr ruteutskrifta éin gong før VPN-en koplar til og éin gong etterpå. Viss containerprefikset i den andre utskrifta peikar på tunneladapteren, er diagnosen komplett, og omstart av containerar vil ikkje hjelpe.
Det første alternativet er ei policyavgjerd: spør nettverkseigaren om lokal LAN-tilgang kan tillatast for denne eininga. Fleire bedriftsklientar tilbyr det som ei innstilling, men det svekkjer ei medviten grense. Be om det som eit dokumentert unntak med eigar og revisjonsdato. Ein brytar per eining som ingen går tilbake til, er måten ein defensiv policy stille forsvinn på.
Der policyen må stå, flytt arbeidslasta i staden for å kjempe mot ruta. Eit gjennomsiktig nettverk med eksplisitt subnett og gateway set containerar på den lokale lenkja, ei Linux-arbeidslast køyrer bak VM-proxyen, og ei eiga virtuell maskin med sin eigen klient held på sin eigen policy. Vel éin medvite, og test han frå innsida av containeren, fordi det er der førespurnaden til brukaren oppstår.