Viename nešiojamajame kompiuteryje, su vienu prijungtu VPN klientu, Linux konteineriai toliau bendrauja tarpusavyje, o Windows konteineriai sustoja. Kintamasis yra ne atvaizdas, o kelias, kuriuo paketai patenka į pagrindinį kompiuterį. Windows konteineriai numatytajame tinkle skolinasi pagrindinio kompiuterio maršrutų lentelę ir vertimą, todėl politika, keičianti pagrindinio kompiuterio maršrutizavimą, keičia ir juos. Patvirtinkite tai maršruto paieška prieš ką nors perinstaliuodami.

Kur Windows konteinerio paketai patenka į pagrindinį kompiuterį

Numatytajame nat tinkle esantis konteineris gauna adresą iš Host Networking Service priešdėlio, dažniausiai kažkur 172.16.0.0/12 viduje, ir pasiekia pagrindinį kompiuterį per virtualų adapterį. Pagrindinis kompiuteris valdo to priešdėlio maršrutą ir verčia srautą link to adapterio, kuris šiuo metu aktyvus. To kelio viduryje nėra atskiros virtualios mašinos.

Būtent ši konstrukcija daro gedimą mechaniniu. Kai konteineris siunčia paketą, pagrindinis kompiuteris atlieka maršruto paiešką konteinerio priešdėliui. Kuris maršrutas laimi, ten paketas ir eina, o konteineris tam neturi nuomonės.

Ką VPN klientas pakeičia tame kelyje

Įmonės klientas dažnai įdiegia platų maršrutų rinkinį ir filtrą, kuris, kol tunelis aktyvus, atsisako prieigos prie vietinio potinklio. Tikslas gynybinis: pažeistas vietinis tinklas neturėtų pasiekti apsaugoto kompiuterio. Šalutinis poveikis tas, kad pagrindinio kompiuterio maršrutas į konteinerio priešdėlį nebėra vietinis NAT tinklas.

Vietoje to paieška atitinka tunelį, o paketas perduodamas šliuzui, kuris niekada negirdėjo apie tą konteinerio adresą. Ping nepavyksta, programa baigia laukti, o konteineris atrodo sugedęs, kol VPN piktograma šviečia. Pažiūrėkite pagrindinio kompiuterio lentelę būdami prisijungę – konkuruojantis maršrutas matomas.

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

Kodėl Linux konteineriai elgiasi kitaip

Linux variklis vykdo konteinerius lengvoje virtualioje mašinoje, o išeinančias jungtis iš tos mašinos atidaro pagrindinio kompiuterio pusėje esantis tarpininkas konteinerio vardu. Lizdą inicijuoja pagrindinis kompiuteris, todėl VPN taisyklė apie konteinerio priešdėlį jam netaikoma taip pat, ir darbo krūvis toliau pasiekia tinklą.

Šis skirtumas paaiškina ir kodėl Linux receptai nepersikelia. Linux konteineriui, kuriam reikia savo tunelio, suteikiamas TUN įrenginys ir NET_ADMIN galimybė. Windows konteineriai neeksponuoja jokios sąsajos kaip įrenginio, todėl šis modelis toje pusėje atitikmens neturi.

Įrodykite maršrutą, tada pasirinkite konstrukciją

Rinkite įrodymus iš pagrindinio kompiuterio, o ne iš konteinerio, nes paiešką atlieka pagrindinis kompiuteris:

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

Paleiskite maršrutų išvestį vieną kartą prieš VPN prisijungiant ir vieną kartą po to. Jei antroje išvestyje konteinerio priešdėlis rodo į tunelio adapterį, diagnozė baigta, o konteinerių paleidimas iš naujo nepadės.

Pirmasis variantas yra politikos sprendimas: paklauskite tinklo savininko, ar šiam įrenginiui galima leisti vietinę LAN prieigą. Keli įmonės klientai tai siūlo kaip nustatymą, bet tai silpnina sąmoningai nustatytą ribą. Prašykite to kaip dokumentuotos išimties su savininku ir peržiūros data. Kiekvieno įrenginio jungiklis, prie kurio niekas negrįžta, yra būdas, kuriuo gynybinė politika tyliai išnyksta.

Ten, kur politika turi išsilaikyti, perkelkite darbo krūvį, o ne kovokite su maršrutu. Skaidrus tinklas su aiškiu potinkliu ir šliuzu padeda konteinerius į vietinę jungtį, Linux darbo krūvis veikia už virtualios mašinos tarpininko, ir atskira virtuali mašina su savo klientu išsaugo savo politiką. Pasirinkite vieną sąmoningai ir išbandykite ją konteinerio viduje, nes būtent ten kyla naudotojo užklausa.

Susiję straipsniai