Tun ọ̀nà Docker àti WSL tí kò ka VPN ẹ̀rọ-ìpamọ́ sí
Àwọn kọ́ńténíà àti WSL ń pa ọ̀nà, olùyẹ́sí àti ipa-ọ̀nà mídàá wọn mọ́, nítorí náà ọ̀nà-abẹ́ ẹ̀rọ-ìpamọ́ tí ń ṣiṣẹ́ á fi wọ́n sílẹ̀ pẹ̀lú DNS àtijọ́ tàbí láìsí ojú-ọ̀nà jáde. Tun ẹ̀ka kọ̀ọ̀kan.
Ní ìgbà ìrúwé yìí, mo lo ọ̀pọ̀ ìlà-oòjọ́ kan láti máa tẹ̀lé kọ́ńténíà kan tí kò lè yanjú orúkọ inú kan pàápàá, nígbà tí aṣàwákiri ẹ̀gbẹ́ rẹ̀ ń ṣí wiki láìsí ẹ̀dùn. Ọ̀nà-abẹ́ náà ti gbé sókè, aṣàwákiri fi hàn, ṣùgbọ́n kọ́ńténíà wà ní ààyè orúkọ nẹ́tíwọ́kì mìíràn pẹ̀lú tábìlì ọ̀nà mìíràn àti olùyẹ́sí mìíràn. Èyí tí ó tẹ̀lé ni ìtòlẹ́sẹẹsẹ tí mo ń ṣàyẹ̀wò báyìí: tábìlì ọ̀nà kọ́kọ́, ìyẹ́sí orúkọ ẹlẹ́ẹ̀kejì, mímúdàá ẹlẹ́ẹ̀kẹta àti pẹ̀tẹ́lẹ̀ ẹ̀rọ-ìpamọ́ ní ìparí. Dúró ní ìgbésẹ̀ àkọ́kọ́ tí ó ti ń kùnà, nítorí pé fífi ìlànà kún ní ìsàlẹ̀ àkójọpọ̀ ń fi ààlà pamọ́ dípò fífi í ṣí.
Fi àwọn tábìlì ọ̀nà mẹ́ta wé ara wọn kí o tó yí ìlànà padà
Kọ́ńténíà lórí afárá àìlòmọ́ Docker ní ọ̀nà àìlòmọ́ kan ṣoṣo lọ sí ẹnubodè docker0, kò sì mọ̀ pé tun0 wà. Ẹ̀rọ-ìpamọ́ ní tun0, àwọn ọ̀nà tí VPN ti tì, àti bóyá ìlànà ìmúlò kan tí ń fi ọ̀nà ìdánwò jáde gba ojú-ọ̀nà mìíràn ju èyí tí o retí. WSL ń fi tábìlì ẹlẹ́ẹ̀kẹta kún ẹ̀yìn àdàpọ̀ àfarawé tirẹ̀. Tẹ́ gbogbo mẹ́tẹ̀ẹ̀ta kí o tó ṣàtúnṣe ọ̀kankan.
| Context | Command | What a wrong answer looks like |
|---|---|---|
| Host | ip route get 10.8.0.20 | Leaves a physical interface instead of tun0 |
| Container | ip route | Only 172.17.0.0/16 via 172.17.0.1 |
| Container DNS | cat /etc/resolv.conf | A public resolver, or an upstream the tunnel never pushed |
| WSL | ip addr; ip route | Only the WSL subnet, no Windows VPN adapter |
Bí ọ̀nà kan ṣoṣo kọ́ńténíà bá jẹ́ afárá tí tun0 kò sì farahàn nínú ààyè orúkọ rẹ̀ rárá, kò sí ohun tí yóò ràn ọ́ lọ́wọ́ nísàlẹ̀: kò sí ìyípadà olùsìn orúkọ tí ń dá ọ̀nà, kò sì sí ọ̀nà tí ń dá ìdánimọ̀ ọ̀nà-abẹ́ tí alábàáṣepọ̀ yóò gbà. Ìtòlẹ́sẹẹsẹ ṣe pàtàkì nítorí pé ìkùnà DNS àti ìkùnà ọ̀nà ń hàn bákan náà láti inú shell.
Darí olùyẹ́sí sí ọ̀nà-abẹ́ dípò sí èyí tí gbogbo ènìyàn lè lò
Lórí ẹ̀rọ-ìpamọ́, resolvectl status ń ṣe àkójọ àwọn olùsìn DNS fún ìsopọ̀ kọ̀ọ̀kan, readlink -f /etc/resolv.conf sì sọ bóyá fáìlì náà jẹ́ stub systemd, fáìlì NetworkManager tàbí ohun tí ẹ̀rọ alábàárò olùpèsè ti kọ lẹ́ẹ̀kan sí i. Nínú kọ́ńténíà lórí nẹ́tíwọ́kì tí olùlò ti pààlẹ̀mọ́, /etc/resolv.conf ń dárúkọ 127.0.0.11, olùyẹ́sí àdámọ́ Docker, tí ó ń fi sí upstream tí a ti ṣètò daemon pẹ̀lú. Ṣùgbọ́n kọ́ńténíà lórí afárá àìlòmọ́ gba ẹ̀dà fáìlì ẹ̀rọ-ìpamọ́ nígbà tí a dá a, ó sì ń pa á mọ́.
Ẹ̀dà yẹn ni ìdí tí ọ̀nà-abẹ́ tí ó gbé sókè lẹ́yìn àkókò tí kọ́ńténíà bẹ̀rẹ̀ fi ń jẹ́ kí kọ́ńténíà máa béèrè lọ́wọ́ upstream àtijọ́. Bóyá fi olùyẹ́sí VPN lọ pẹ̀lú rẹ̀ kedere pẹ̀lú docker run --dns 10.8.0.53, tàbí ṣètò "dns": ["10.8.0.53"] nínú /etc/docker/daemon.json kí o sì tún daemon bẹ̀rẹ̀, tàbí tún kọ́ńténíà dá nígbà tí ọ̀nà-abẹ́ ti gbé sókè. Àtúndá sábà máa ń rọrùn ju ṣíṣe àtúnyẹ̀wò olùyẹ́sí tí ó ti tọ́ ní wákàtí kan sẹ́yìn.
Fífi olùyẹ́sí gbogbo ènìyàn lò ni àtúnṣe tí ń pa àmì àrùn mọ́. Ó ń yanjú íńtánẹ́ẹ̀tì, ó sì ń kùnà ní gbogbo agbègbè aládàáni, ó sì lè yí àyẹ̀wò tí ọ̀nà-abẹ́ wà fún kọjá lọ ní ìdákẹ́jẹ́. Bí o bá gbìyànjú láti kọ sínú /etc/resolv.conf kọ́ńténíà tí ń ṣiṣẹ́, retí Device or resource busy: Docker ń ṣe bind-mount fáìlì yẹn, nítorí náà àtúnṣe nílò àyọkúrò kọ́kọ́. Fífi --dns ṣètò nígbà ìdá ni ìtòlẹ́sẹẹsẹ tí ń ye àtúndá já.
Fi ọ̀nà jáde kí o sì túmọ̀ nígbà tí kọ́ńténíà bá yá ọ̀nà-abẹ́
Pẹ̀lú afárá àìlòmọ́, ẹ̀rọ-ìpamọ́ ni olùdarí ọ̀nà láàrín docker0 àti tun0, ní àìlòmọ́ kò sì ṣe ọ̀kan nínú iṣẹ́ méjèèjì. Tan mímúdàá jáde kí o sì túmọ̀ àdírẹ́sì orísun kí alábàáṣepọ̀ lè rí àdírẹ́sì ọ̀nà-abẹ́ ẹ̀rọ-ìpamọ́ dípò èyí tí kò ní ọ̀nà ìpadà (rọ́pò tun0 pẹ̀lú orúkọ tí ẹ̀rọ alábàárò rẹ fi fún ojú-ọ̀nà):
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Àwọn ìlànà FORWARD ṣe pàtàkì lórí ẹ̀rọ-ìpamọ́ tí ìlànà mímúdàá jáde wọn jẹ́ DROP. Docker ń fi ẹ̀wọ̀n tirẹ̀ kún, nítorí náà dánwò pẹ̀lú àpòpọ̀ dípò kíkà iptables -S: láti kọ́ńténíà, ip route get 10.8.0.20 yẹ kí ó dárúkọ ẹnubodè afárá, nc -vz 10.8.0.20 443 sì yẹ kí ó sopọ̀ tàbí kí àkókò rẹ̀ tán lórí ọ̀nà-abẹ́, kì í ṣe lórí olùyẹ́sí.
Láìsí MASQUERADE alábàáṣepọ̀ nílò ọ̀nà ìpadà sí 172.17.0.0/16, èyí tí ọ̀pọ̀ VPN ìwọlé ọ̀nà jíjìn kì í tì. Níbí yìí pẹ̀lú ni ẹ̀rọ alábàárò tí ó dá lórí ìlànà ń fọ́ ètò náà: bí ó bá ń mú ọ̀nà ìrìnàjò àwọn UID tàbí cgroups pàtó kan, àwọn ìlànà mímúdàá jáde rẹ kì yóò rí àpòpọ̀ nínú ọ̀nà-abẹ́ rárá, àtúnṣe sì wà nínú ìlànà ọ̀nà ẹ̀rọ alábàárò kì í ṣe iptables. Àwọn ìlànà tí a fi ọwọ́ kún ń pòórá nígbà àtúndá, nítorí náà fi wọ́n sínú ẹ̀yà systemd tàbí tábìlì netfilter-persistent kí o sì dánwò lẹ́ẹ̀kan sí i lẹ́yìn àtúndá, nítorí pé ọ̀nà-abẹ́ tí ó gbé sókè pẹ́ ni ó lè gbá wọn dànù.
Fi ọ̀nà-abẹ́ sínú kọ́ńténíà nígbà tí èròǹgbà jẹ́ ìyàsọ́tọ̀
Bí kọ́ńténíà kan bá gbọ́dọ̀ jáde gba ipá kan pàtó, ṣe ẹ̀rọ alábàárò nínú kọ́ńténíà yẹn. Ó nílò --cap-add NET_ADMIN àti --device /dev/net/tun, lẹ́yìn náà ó ní tun0, àwọn ọ̀nà àti ògiri-iná tirẹ̀. Bí àwọn kọ́ńténíà mìíràn bá ń gba ibi rẹ̀ kọjá, ó tún nílò mímúdàá jáde àti ìlànà MASQUERADE nínú kọ́ńténíà, àwọn alábàáṣepọ̀ yẹn sì nílò ọ̀nà tàbí aṣojú tí ó tọ́ka sí i; afárá àìlòmọ́ Docker kì í fi ọ̀nà yẹn kún fún ọ.
Nẹ́tíwọ́kì ẹ̀rọ-ìpamọ́, docker run --network host, ni ẹ̀yà tí kò gbówó lórí: kọ́ńténíà ń darapọ̀ mọ́ ààyè orúkọ ẹ̀rọ-ìpamọ́ ó sì ń rí àwọn ọ̀nà ọ̀nà-abẹ́ tààrà. Ó tún fi ìyàsọ́tọ̀ nẹ́tíwọ́kì sílẹ̀, ó ń pe ìkọlù ebute, ní ìṣe gbogbogbò ó jẹ́ àṣàyàn Linux. Ebute tí a tẹ̀ jáde kì í ṣe àrọ́wọ́tó. -p 8080:80 ń jẹ́ kí iṣẹ́ kan dé ọ̀dọ̀ láti ẹ̀rọ-ìpamọ́; kì í jẹ́ kí àwọn àdírẹ́sì inú 10.x dé ọ̀dọ̀ láti inú kọ́ńténíà, àti dído àwọn méjèèjì pọ̀ ni ọ̀nà tí ìṣòro ọ̀nà fi di ebute ìpamọ́ dátà tí ó ṣí.
Ya ìkùnà orúkọ sọ́tọ̀ kúrò nínú subnet tí ó ń bo ara wọn
Afárá àìlòmọ́ Docker jẹ́ 172.17.0.0/16, ọ̀pọ̀ àkójọ VPN ilé-iṣẹ́ sì wà nínú 172.16.0.0/12. Nígbà tí ọ̀nà-abẹ́ bá ni àgbègbè yẹn, ìrìnàjò tí a dì sí kọ́ńténíà lè lọ sínú ọ̀nà-abẹ́ dípò. Àwọn orúkọ ń kùnà, àṣìṣe ń hàn bí DNS, ìṣòro sì wà nínú àwọn àdírẹ́sì. Ṣàyẹ̀wò ibi tí a ń lọ, kì í ṣe olùyẹ́sí: ip route get 172.17.0.5 lórí ẹ̀rọ-ìpamọ́, lẹ́yìn náà fi àkọ́sọ́ afárá wé àkójọ VPN àti docker network inspect bridge --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}'.
Àtúnṣe ni láti gbé ọ̀kan nínú àwọn àgbègbè: bóyá àkójọ àdírẹ́sì àìlòmọ́ mìíràn fún Docker nínú daemon.json tàbí àkójọ mìíràn lórí olùkójọ. Fífi olùsìn orúkọ mìíràn kún níbí kò ṣe nkankan, ssh -b pẹ̀lú kò ṣe: fífi ẹ̀rọ alábàárò so mọ́ ojú-ọ̀nà ń yí àdírẹ́sì orísun padà, kì í ṣe ọ̀nà ibi tí ó ń tọ́ka sínú ọ̀nà-abẹ́. Pípín iṣẹ́ kíákíá: orúkọ tí a ń yanjú lórí ẹ̀rọ-ìpamọ́ ṣùgbọ́n kì í ṣe nínú kọ́ńténíà jẹ́ ìṣòro olùyẹ́sí, nígbà tí ìsopọ̀ IP tààrà tí ó ń dúró nínú kọ́ńténíà ṣùgbọ́n tí ń ṣiṣẹ́ lórí ẹ̀rọ-ìpamọ́ jẹ́ ìṣòro ọ̀nà tàbí ẹ̀wọ̀n mímúdàá jáde.
WSL àti Docker Desktop kì í tẹ̀lé àwọn ìlànà Linux
Nínú ipò NAT àìlòmọ́ rẹ̀, WSL jókòó lẹ́yìn àdàpọ̀ àfarawé tirẹ̀, kò sì gba àwọn ọ̀nà inú tàbí ìparí DNS VPN Windows, ìdí nìyẹn tí aṣàwákiri fi ń ṣiṣẹ́ tí ping nínú pínpín kò sì ṣiṣẹ́. Nẹ́tíwọ́kì dígí, tí ó wà nínú àwọn ìkọ́ Windows 11 àìpẹ́, ń pín àwọn ojú-ọ̀nà ẹ̀rọ-ìpamọ́ dípò, ṣùgbọ́n ó gbọ́dọ̀ ṣí nínú .wslconfig kí a sì tún pínpín bẹ̀rẹ̀ pẹ̀lú wsl --shutdown. Fi wslinfo --networking-mode ìdánilójú ipò tí ń ṣiṣẹ́, kí o tó fi àtúnṣe sílẹ̀, nítorí pé ìdáhùn NAT kò tọ́ fún ipò dígí àti ní ìdàkejì.
Docker Desktop ń fi ẹ̀ka mìíràn kún. Àwọn kọ́ńténíà Linux lórí Windows jókòó lẹ́yìn ìmúṣẹ NAT tí a ń pè ní vpnkit ní ìtàn, ọ̀nà wọn sì yàtọ̀ sí ti ẹ̀rọ-ìpamọ́ Linux ìbílẹ̀. Àwọn kọ́ńténíà Windows ń sopọ̀ gba ìyípadà àfarawé Hyper-V, ẹ̀rọ alábàárò ilé-iṣẹ́ sì lè dí ìrìnàjò láti ìyípadà yẹn, nítorí náà àwọn kọ́ńténíà Linux lórí ẹ̀rọ kanna lè dé nẹ́tíwọ́kì nígbà tí àwọn kọ́ńténíà Windows kò ní nkankan. Ìyípadà ìta tí a so mọ́ àdàpọ̀ ti ara jẹ́ ojútùú tí ó wọ́pọ̀, ó sì ń yí ìdánimọ̀ nẹ́tíwọ́kì kọ́ńténíà padà ní ọ̀nà tí ìlànà lè máà gbà.
Kí o tó kọ ìlànà mìíràn, rin àwọn ẹ̀ka mẹ́rin lẹ́sẹẹsẹ kí o sì dúró níbi tí ọ̀kan nínú wọn kò tọ́:
- Nínú kọ́ńténíà: ṣé
ip routeń dé àkọ́sọ́ aládàáni, ṣé/etc/resolv.confsì ń dárúkọ upstream tí ń yanjú rẹ̀? - Lórí ẹ̀rọ-ìpamọ́: ṣé mímúdàá jáde wà ní ṣíṣí, ṣé NAT so mọ́ ojú-ọ̀nà ọ̀nà-abẹ́, ṣé ẹ̀wọ̀n mímúdàá jáde sì gba afárá sí ọ̀nà-abẹ́?
- Ní ọ̀dọ̀ alábàáṣepọ̀: ṣé ó mọ ọ̀nà ìpadà, tàbí ìwọ ń gbẹ́kẹ̀ lé NAT láti fi subnet kọ́ńténíà pamọ́?
- Lórí pẹ̀tẹ́lẹ̀: ṣé WSL wà ní ipò NAT tàbí dígí, ṣé kọ́ńténíà sì jẹ́ Linux tàbí Windows?
Tún ṣe gbogbo ìdánwò nínú kọ́ńténíà tàbí shell tuntun. Ìlànà iṣẹ́ àtijọ́ pẹ̀lú ìdáhùn tí a ti kó sínú káàsì tàbí ìsopọ̀ tí a ti dá yóò máa kùnà lẹ́yìn tí ìṣètò bá tọ́, ìkùnà yẹn sì ń hàn gẹ́gẹ́ bí àtúnṣe tí kò ṣiṣẹ́.