Qattajt il-biċċa l-kbira ta' filgħodu dan ir-rebbiegħa nfittex kontenitur li ma setax isolvi lanqas isem intern wieħed, filwaqt li l-browser ħdejh kien jiftaħ il-wiki mingħajr ilment. It-tunnel kien 'il fuq, il-browser wera dan, u l-kontenitur kien fi spazju tal-isem tan-netwerk ieħor b'tabella tar-rotot differenti u resolver differenti. Dan li ġej huwa l-ordni li nċekkja issa: l-ewwel tabelli tar-rotot, it-tieni s-soluzzjoni tal-ismijiet, it-tielet il-ħruġ 'il quddiem u fl-aħħar il-pjattaforma tal-host. Ieqaf fl-ewwel pass li diġà qed ifalli, għax iż-żieda ta' regoli aktar 'l isfel fl-istack taħbi l-konfini minflok ma ċċaqlaqha.

Qabbel it-tliet tabelli tar-rotot qabel ma tibdel regola

Kontenitur fuq il-bridge default ta' Docker għandu rotta default waħda li tipponta lejn il-gateway docker0 u m'għandux idea li tun0 teżisti. Il-host għandu tun0, ir-rotot li mbotta l-VPN, u forsi regola ta' politika li tibgħat traffiku ta' prova minn interface differenti minn dik li tistenna. WSL iżżid it-tielet tabella wara l-adapter virtwali tiegħu stess. Ipprintja t-tlieta qabel ma teditja waħda minnhom.

ContextCommandWhat a wrong answer looks like
Hostip route get 10.8.0.20Leaves a physical interface instead of tun0
Containerip routeOnly 172.17.0.0/16 via 172.17.0.1
Container DNScat /etc/resolv.confA public resolver, or an upstream the tunnel never pushed
WSLip addr; ip routeOnly the WSL subnet, no Windows VPN adapter

Jekk l-unika rotta tal-kontenitur hija l-bridge u tun0 qatt ma tidher fl-ispazju tal-isem tiegħu, xejn hawn taħt ma se jgħin: l-ebda bidla fis-server tal-ismijiet ma toħloq rotta, u l-ebda rotta ma toħloq identità ta' tunnel li l-peer se jaċċetta. L-ordni hija importanti għax falliment tad-DNS u falliment tar-rotta jidhru l-istess minn ġewwa shell.

Idderieġi r-resolver lejn it-tunnel minflok lejn wieħed pubbliku

Fuq il-host, resolvectl status jelenka s-servers DNS għal kull konnessjoni, u readlink -f /etc/resolv.conf jgħidlek jekk il-fajl huwiex stub ta' systemd, fajl ta' NetworkManager, jew xi ħaġa li klijent ta' bejjiegħ kiteb mill-ġdid. Ġewwa kontenitur fuq netwerk definit mill-utent, /etc/resolv.conf isemmi 127.0.0.11, ir-resolver inkorporat ta' Docker, li jibgħat lill-upstream li bih kien ikkonfigurat id-daemon. Kontenitur fuq il-bridge default min-naħa l-oħra rċieva kopja tal-fajl tal-host meta nħoloq, u jżommha.

Dik il-kopja hija r-raġuni għaliex tunnel li jitla' wara li jibda l-kontenitur iħalli lill-kontenitur jistaqsi lill-upstream antik. Jew għaddi r-resolver tal-VPN b'mod espliċitu b'' docker run --dns 10.8.0.53, jew issettja "dns": ["10.8.0.53"] f'' /etc/docker/daemon.json u erġa' ibda d-daemon, jew erġa' oħloq il-kontenitur meta t-tunnel ikun 'il fuq. L-erġa' ħolqien normalment jiswa inqas milli tiddenbubja resolver li kien korrett siegħa ilu.

Is-sostituzzjoni b'resolver pubbliku hija t-tiswija li żżomm is-sintomu. Tissolvi l-internet u tfalli f'kull żona privata, u tista' taqbeż bil-kwiet il-filtraġġ li għalih teżisti t-tunnel. Jekk tipprova tikteb ġewwa /etc/resolv.conf ta' kontenitur li qed jaħdem, stenna Device or resource busy: Docker jagħmel bind-mount ta' dak il-fajl, għalhekk l-editjar jeħtieġ l-ewwel unmount. L-issettjar ta' --dns waqt il-ħolqien hija s-sekwenza li tissopravvivi restart.

Għaddi 'l quddiem u ttraduċi meta l-kontenituri jissellfu t-tunnel

Bl-bridge default, il-host huwa router bejn docker0 u tun0, u b'mod default ma jagħmel l-ebda waħda miż-żewġ xogħlijiet. Ixgħel il-ħruġ 'il quddiem u ttraduċi l-indirizz tas-sors sabiex il-peer jara indirizz tat-tunnel tal-host minflok wieħed li m'għandux rotta lura għalih (issostitwixxi tun0 bl-isem li l-klijent tiegħek jagħti lill-interface):

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -A FORWARD -i docker0 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o docker0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Ir-regoli FORWARD huma importanti fuq hosts li l-politika tal-ħruġ tagħhom hija DROP. Docker idaħħal il-ktajjen tiegħu stess, għalhekk ittestja b'pakket minflok billi taqra iptables -S: mill-kontenitur, ip route get 10.8.0.20 għandu jsemmi l-gateway tal-bridge, u nc -vz 10.8.0.20 443 għandu jikkonnettja jew jiskadi fuq it-tunnel minflok fuq ir-resolver.

Mingħajr MASQUERADE il-peer jeħtieġ rotta lura lejn 172.17.0.0/16, li l-biċċa l-kbira tal-VPNs tal-aċċess mill-bogħod ma jimbottawx. Hawn ukoll klijent ibbażat fuq il-politika jkisser il-pjan: jekk jaqbad biss traffiku minn UIDs jew cgroups speċifiċi, ir-regoli tal-ħruġ tiegħek qatt ma jaraw il-pakket ġewwa t-tunnel, u t-tiswija tappartjeni lill-politika tar-routing tal-klijent u mhux lil iptables. Regoli miżjuda bl-idejn jisparixxu meta jerġa' jibda, għalhekk poġġihom f'unità systemd jew f'tabella netfilter-persistent u erġa' ttestja wara restart, għax tunnel li jitla' tard jista' jikneshom.

Poġġi t-tunnel ġewwa l-kontenitur meta l-għan huwa l-iżolament

Jekk kontenitur wieħed irid joħroġ minn node speċifiku, ġib il-klijent f'dak il-kontenitur. Jeħtieġ --cap-add NET_ADMIN u --device /dev/net/tun, u mbagħad ikollu t-tun0, ir-rotot u l-firewall tiegħu stess. Jekk kontenituri oħra jgħaddu minnu, jeħtieġ ukoll il-ħruġ 'il quddiem u regola MASQUERADE ġewwa l-kontenitur, u dawk il-peers jeħtieġu rotta jew proxy espliċiti li jippuntaw lejh; il-bridge default ta' Docker ma jżidx dik ir-rotta għalik.

In-netwerk tal-host, docker run --network host, hija l-verżjoni irħisa: il-kontenitur jingħaqad mal-ispazju tal-isem tal-host u jara r-rotot tat-tunnel direttament. Iwarrab ukoll l-iżolament tan-netwerk, jistieden kolliżjonijiet tal-portijiet, u fil-prattika hija għażla ta' Linux. Port ippubblikat mhuwiex sostitut. -p 8080:80 jagħmel servizz aċċessibbli mill-host; ma jagħmilx l-indirizzi interni 10.x aċċessibbli minn ġewwa l-kontenitur, u li tħallat it-tnejn huwa l-mod kif problema tar-routing issir port tad-database espost.

Iddistingwi falliment tal-isem minn subnetwork li jikkoinċidi

Il-bridge default ta' Docker huwa 172.17.0.0/16, u ħafna pools tal-VPN korporattiva jinsabu fi ħdan 172.16.0.0/12. Ladarba t-tunnel ikollha dak il-medda, it-traffiku maħsub għal kontenitur jista' jiġi routjat fit-tunnel minflok. L-ismijiet ifallu, l-iżball jidher bħal DNS, u l-problema hija fl-indirizzi. Iċċekkja d-destinazzjoni, mhux ir-resolver: ip route get 172.17.0.5 fuq il-host, imbagħad qabbel il-prefiss tal-bridge mal-pool tal-VPN u ma' docker network inspect bridge --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}'.

It-tiswija hija li ċċaqlaq waħda mill-meded: jew pool ta' indirizzi default differenti għal Docker f'' daemon.json jew pool differenti fuq il-konċentratur. Iż-żieda ta' server tal-ismijiet ieħor ma tagħmel xejn hawn, u lanqas ssh -b: l-irbit tal-klijent ma' interface jibdel l-indirizz tas-sors, mhux rotta tad-destinazzjoni li tipponta fit-tunnel. Qsim malajr tax-xogħol: isem li jiġi solvut fuq il-host imma mhux fil-kontenitur hija problema tar-resolver, filwaqt li konnessjoni IP diretta li tiddendel fil-kontenitur imma taħdem fuq il-host hija problema tar-rotta jew tal-katina tal-ħruġ.

WSL u Docker Desktop ma jsegwux ir-regoli ta' Linux

Fil-mod NAT default tiegħu, WSL joqgħod wara l-adapter virtwali tiegħu stess u ma jirċevix ir-rotot interni jew is-suffissi DNS tal-VPN ta' Windows, u għalhekk il-browser jaħdem u ping ġewwa d-distribuzzjoni ma jaħdimx. In-netwerk mirja, disponibbli fil-builds reċenti ta' Windows 11, jaqsam l-interfaces tal-host minflok, imma jrid jiġi attivat f'' .wslconfig u d-distribuzzjoni terġa' tinbeda b'' wsl --shutdown. Ikkonferma l-mod attiv b'' wslinfo --networking-mode qabel ma tapplika tiswija, għax it-tweġiba tan-NAT hija ħażina għall-mod mirja u bil-maqlub.

Docker Desktop iżżid saff ieħor. Il-kontenituri Linux fuq Windows joqogħdu wara implimentazzjoni tan-NAT li storikament tissejjaħ vpnkit, u l-mogħdija tagħhom hija differenti minn host Linux nattiv. Il-kontenituri Windows jikkonnettjaw permezz ta' switch virtwali Hyper-V, u klijent korporattiv jista' jimblokka t-traffiku minn dak is-switch, għalhekk kontenituri Linux fuq l-istess magna jistgħu jaslu għan-netwerk filwaqt li l-kontenituri Windows m'għandhom xejn. Switch estern marbut mal-adapter fiżiku huwa s-soluzzjoni tas-soltu, u jibdel l-identità tan-netwerk tal-kontenitur b'modi li l-politika tista' ma tippermettix.

Qabel ma tikteb regola oħra, għaddi l-erba' saffi fl-ordni u ieqaf fejn wieħed minnhom huwa ħażin:

  • Ġewwa l-kontenitur: il-" ip route jasal sal-prefiss privat, u l-" /etc/resolv.conf isemmi upstream li jissolvih?
  • Fuq il-host: il-ħruġ 'il quddiem huwa mixgħul, in-NAT hija marbuta mal-interface tat-tunnel, u l-katina tal-ħruġ taċċetta bridge għal tunnel?
  • Fil-peer: jaf mogħdija lura, jew qed tistrieħ fuq in-NAT biex taħbi s-subnetwork tal-kontenitur?
  • Fil-pjattaforma: WSL hija fil-mod NAT jew mirja, u l-kontenitur huwiex Linux jew Windows?

Erġa' ġib kull test f'kontenitur jew shell ġodda. Proċess ta' tul twil bi tweġiba fil-cache jew konnessjoni stabbilita se jkompli jfalli wara li l-konfigurazzjoni tkun korretta, u dak il-falliment jidher eżattament bħal tiswija li ma ħadmitx.

Artikli relatati