Chaith mé an chuid is mó de mhaidin an earraigh seo ag ruaigeadh coimeádáin nach raibh in ann fiú ainm inmheánach amháin a réiteach, agus an brabhsálaí ina aice ag oscailt an vicí gan gearán. Bhí an tollán in airde, chruthaigh an brabhsálaí é, agus bhí an coimeádán ina luí i spás ainmneacha líonra eile le tábla bealaí eile agus réititheoir eile. Seo a leanas an t-ord a sheiceálaim anois: táblaí bealaí ar dtús, réiteach an dara, aistriú an tríú, agus ardán an óstaigh ar deireadh. Stop ag an gcéad chéim a theipeann cheana, mar déanann rialacha a chur níos faide síos sa chruach an teorainn a cheilt in ionad í a bhogadh.

Cuir na trí thábla bealaí i gcomparáid sula n-athraíonn tú riail

Tá bealach réamhshocraithe amháin ag coimeádán ar dhroichead réamhshocraithe Docker a dhíríonn ar gheata docker0, agus níl a fhios aige go bhfuil tun0 ann. Tá tun0 ag an óstach, na bealaí a bhrúigh an VPN, agus b'fhéidir riail pholasaí a sheolann trácht iniúchta amach trí chomhéadan difriúil ón gceann a mbíonn súil agat leis. Cuireann WSL tríú tábla leis taobh thiar dá oiriúnaitheoir fíorúil féin. Priontáil na trí cinn sula ndéanann tú aon cheann acu a chur in eagar.

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

Má tá droichead mar an t-aon bhealach atá ag an gcoimeádán agus mura dtagann tun0 chun solais riamh ina spás ainmneacha, ní chabhróidh aon rud thíos: ní chruthaíonn aon athrú freastalaí ainmneacha bealach, agus ní chruthaíonn aon bhealach féiniúlacht tolláin a nglacfaidh an piaraí léi. Tá tábhacht leis an ord mar tá teip DNS agus teip bealaí cuma chéanna orthu ó thaobh istigh de bhlaosc.

Dírigh an réititheoir ar an tollán in ionad ceann poiblí

Ar an óstach, resolvectl status liostaíonn sé freastalaithe DNS de réir naisc, agus readlink -f /etc/resolv.conf insíonn sé duit an é an stub systemd, comhad NetworkManager nó rud éigin a d'athscríobh cliant díoltóra an comhad. Laistigh de choimeádán ar líonra sainithe ag an úsáideoir, /etc/resolv.conf ainmníonn 127.0.0.11, réititheoir leabaithe Docker, a aistríonn chuig cibé upstream a raibh an daemon cumraithe leis. Fuair coimeádán ar an droichead réamhshocraithe cóip de chomhad an óstaigh nuair a cruthaíodh é, áfach, agus coinníonn sé é.

Is é an chóip sin an chúis a bhfágann tollán a éiríonn tar éis an coimeádán a thosú an coimeádán ag fiafraí den sean-upstream. Cuir réititheoir an VPN ar aghaidh go sainráite le docker run --dns 10.8.0.53, nó socraigh "dns": ["10.8.0.53"] i /etc/docker/daemon.json agus atosaigh an daemon, nó athchruthaigh an coimeádán nuair a bhíonn an tollán in airde. De ghnáth bíonn athchruthú níos saoire ná dífhabhtú réititheora a bhí ceart uair an chloig ó shin.

Is é an deisiú a choinníonn an tsiomptóm ná réititheoir poiblí a chur ina áit. Réitíonn sé an t-idirlíon agus teipeann sé i ngach crios príobháideach, agus is féidir leis an scagadh a sheachaint go ciúin a bhfuil an tollán ann lena fhorfheidhmiú. Má dhéanann tú iarracht scríobh taobh istigh de /etc/resolv.conf coimeádáin atá ag rith, bí ag súil le Device or resource busy: déanann Docker bind-mount ar an gcomhad sin, mar sin teastaíonn díchóimeáil ar dtús ón eagarthóireacht. Is é --dns a shocrú ag cruthú an t-ord a mhaireann atosú.

Seol ar aghaidh agus aistrigh nuair a thógann coimeádáin an tollán ar iasacht

Leis an droichead réamhshocraithe, is ródaí é an t-óstach idir docker0 agus tun0, agus ní dhéanann sé ceachtar den dá phost de réir réamhshocraithe. Cuir aistriú air agus aistrigh an seoladh foinse ionas go bhfeicfidh an piaraí seoladh tolláin óstaigh in ionad ceann nach bhfuil bealach ar ais aige chuige (cuir tun0 in ionad an ainm a thugann do chliant ar an gcomhéadan):

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

Tá tábhacht le rialacha FORWARD ar óstaigh a bhfuil a bpolasaí aistrithe DROP. Cuireann Docker a shlabhraí féin isteach, mar sin déan tástáil le paicéad in ionad leamh iptables -S: ón gcoimeádán, ip route get 10.8.0.20 ba cheart geata an droichid a ainmniú, agus nc -vz 10.8.0.20 443 ba cheart ceangal nó amú ama a dhéanamh ag an tollán in ionad ag an réititheoir.

Gan MASQUERADE teastaíonn bealach ar ais chuig 172.17.0.0/16 ón bpiaraí, rud nach mbrúfaidh formhór na VPNanna rochtana cianda. Seo freisin a bhriseann cliant polasaí-bhunaithe an plean: mura ngabhann sé ach trácht ó UIDanna nó cgroups áirithe, ní fheicfidh do rialacha aistrithe an paicéad laistigh den tollán riamh, agus baineann an deisiú le polasaí ródaithe an chliaint seachas le iptables. Imíonn rialacha a chuirtear leis de láimh ar atosú, mar sin cuir iad in aonad systemd nó i dtábla netfilter-persistent agus déan ath-thástáil tar éis atosú, ós rud é gur féidir le tollán a éiríonn go déanach iad a scuabadh chun siúil.

Cuir an tollán taobh istigh den choimeádán nuair is é an t-aonrú an sprioc

Mura mór do choimeádán amháin dul amach trí nód áirithe, rith an cliant sa choimeádán sin. Teastaíonn --cap-add NET_ADMIN agus --device /dev/net/tun uaidh, agus ansin tá a thun0, a bhealaí agus a bhalla dóiteáin féin aige. Má théann coimeádáin eile tríd, teastaíonn aistriú agus riail MASQUERADE laistigh den choimeádán uaidh freisin, agus teastaíonn bealach nó seachfhreastalaí sainráite a dhíríonn air ó na piaraí sin; ní chuireann droichead réamhshocraithe Docker an bealach sin leis duit.

Líonrú óstaigh, docker run --network host, is é an leagan saor: téann an coimeádán isteach i spás ainmneacha an óstaigh agus feiceann sé bealaí an tolláin go díreach. Caitheann sé aonrú líonra uaidh freisin, tugann cuireadh d'imbhuailtí calafoirt, agus go praiticiúil is rogha Linux é. Ní ionadaí é calafort foilsithe. -p 8080:80 déanann sé seirbhís inrochtana ón óstach; ní dhéanann sé seoltaí inmheánacha 10.x inrochtana ó thaobh istigh den choimeádán, agus is é meascadh an dá rud an bealach a n-iompaíonn fadhb ródaithe ina calafort bunachar sonraí nochta.

Idirdhealaigh teip ainmneacha ó fholíonra forluí

Is é 172.17.0.0/16 droichead réamhshocraithe Docker, agus tá go leor linnte VPN corparáideacha suite laistigh de 172.16.0.0/12. Nuair a bhíonn an raon sin ag an tollán, is féidir trácht atá ceaptha do choimeádán a ródú isteach sa tollán ina ionad. Teipeann ainmneacha, tá cuma DNS ar an earráid, agus is iad na seoltaí an fhadhb. Seiceáil an ceann scríbe, ní an réititheoir: ip route get 172.17.0.5 ar an óstach, ansin cuir réimír an droichid i gcomparáid le linn VPN agus le docker network inspect bridge --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}'.

Is é an deisiú ná ceann de na raonta a bhogadh: ceachtar linn seoltaí réamhshocraithe eile do Docker i daemon.json nó linn eile ar an tiúchtóir. Ní dhéanann freastalaí ainmneacha eile a chur leis aon rud anseo, agus ní dhéanann ssh -b ach an oiread: athraíonn ceangal an chliaint le comhéadan an seoladh foinse, ní bealach cinn scríbe a dhíríonn isteach sa tollán. Roinnt tapa oibre: is fadhb réititheora é ainm a réitítear ar an óstach ach nach réitítear sa choimeádán, agus is fadhb bealaí nó slabhra aistrithe é nasc IP díreach a chrochann sa choimeádán ach a oibríonn ar an óstach.

Ní leanann WSL agus Docker Desktop rialacha Linux

Ina mhód NAT réamhshocraithe, suíonn WSL taobh thiar dá oiriúnaitheoir fíorúil féin agus ní fhaigheann sé bealaí inmheánacha ná iarmhíreanna DNS VPN Windows, agus is é sin an fáth a n-oibríonn an brabhsálaí agus ping laistigh den dáileadh nach n-oibríonn. Roinneann líonrú scáthánaí, atá ar fáil i mbuildí deireanacha Windows 11, comhéadain an óstaigh ina ionad, ach caithfear é a chumasú i .wslconfig agus an dáileadh a atosú le wsl --shutdown. Deimhnigh an mód gníomhach le wslinfo --networking-mode sula gcuireann tú deisiú i bhfeidhm, mar tá freagra NAT mícheart don mhód scáthánaí agus a mhalairt.

Cuireann Docker Desktop ciseal eile leis. Suíonn coimeádáin Linux ar Windows taobh thiar de chur i bhfeidhm NAT ar a dtugtar vpnkit go stairiúil, agus tá a gconair difriúil ó óstach Linux dúchasach. Ceanglaíonn coimeádáin Windows trí mhalartán fíorúil Hyper-V, agus is féidir le cliant corparáideach trácht ón malartán sin a bhlocáil, mar sin d'fhéadfadh coimeádáin Linux ar an meaisín céanna an líonra a bhaint amach agus gan aon rud ag coimeádáin Windows. Is é malartán seachtrach atá ceangailte leis an oiriúnaitheoir fisiciúil an ghnáthbhealach timpeall, agus athraíonn sé féiniúlacht líonra an choimeádáin ar bhealaí nach gceadódh an polasaí b'fhéidir.

Sula scríobhann tú riail eile, siúil na ceithre chiseal in ord agus stop san áit a bhfuil ceann acu mícheart:

  • Laistigh den choimeádán: an sroicheann ip route an réimír phríobháideach, agus an ainmníonn /etc/resolv.conf upstream a réitíonn é?
  • Ar an óstach: an bhfuil aistriú air, an bhfuil NAT ceangailte le comhéadan an tolláin, agus an nglacann an slabhra aistrithe droichead go tollán?
  • Ar an bpiaraí: an bhfuil bealach ar ais ar eolas aige, nó an bhfuil tú ag brath ar NAT chun folíonra an choimeádáin a cheilt?
  • Ar an ardán: an bhfuil WSL i mód NAT nó scáthánaí, agus an Linux nó Windows é an coimeádán?

Athrith gach tástáil i gcoimeádán nó blaosc úr. Leanfaidh próiseas fadreatha a bhfuil freagra i dtaisce nó nasc bunaithe aige de theip tar éis an chumraíocht a bheith ceart, agus tá cuma díreach cosúil le deisiú nár oibrigh ar an teip sin.

Ailt ghaolmhara