API àdáni ń ṣí nínú browser desktop rẹ, ó sì ń kùnà nínú container ìdàgbàsókè. Ìyẹn kì í ṣe ìtakora, ó sì ṣọ̀wọ́n nígbà tí VPN fúnra rẹ̀ ni ó fa. Ìbéèrè browser àti ìbéèrè tí ó kùnà ni àwọn ìlànà ọ̀tọ̀ọ̀tọ̀ ṣe, pẹ̀lú resolver, proxy àti ọ̀nà ọ̀tọ̀ọ̀tọ̀, àti ní ọ̀pọ̀ ìgbà láti inú ààyè orúkọ nẹ́tíwọ́ọ̀kì tí ó yàtọ̀ pátápátá. "Lórí laptop mi" lè túmọ̀ sí host Windows, ìpín WSL kan, ẹ̀rọ àfọwọ́kọ Docker Desktop àti container kan nínú ẹ̀rọ yẹn, ìyípadà mẹ́rin tí ọ̀kọ̀ọ̀kan lè dáhùn orúkọ host kan náà ní ọ̀nà tí ó yàtọ̀. Ṣe àwárí èyí tí ìlànà tí ó kùnà ń lò kí o tó fi ọwọ́ kan ètò kan pàápàá.

Wá ìlànà náà kí o tó yí ètò padà

Bẹ̀rẹ̀ pẹ̀lú engine container dípò client VPN. Béèrè ìyípadà wo ni ìlà àṣẹ ń bá sọ̀rọ̀, àti ètò ìṣiṣẹ́ wo ni engine yẹn ń ṣiṣẹ́ lórí, nítorí container Linux tí ẹ̀rọ àfọwọ́kọ desktop ń ṣàkóso jẹ́ ọ̀nà tí ó yàtọ̀ sí èyí tí daemon àdúgbò ń ṣàkóso:

docker context ls
docker info --format '{{.OperatingSystem}} / {{.Name}}'
docker run --rm alpine ip route

Lórí Windows, wsl -l -v sọ fún ọ bóyá ìpín náà ń ṣiṣẹ́ lábẹ́ WSL 2, èyí tí ó gbé e sẹ́yìn switch àfọwọ́kọ tirẹ̀. Àlàyé yẹn pinnu bóyá container pín table ìtọ́sọ́nà host tàbí ó wà sẹ́yìn NAT tí ó nílò port tí a ti gbé lọ tàbí orúkọ host láti dé ọ̀dọ̀ host.

Jẹ́ kí ìbéèrè kan dúró ṣinṣin kí o sì fi wé

Yan endpoint kan tí kò léwu lórí host àdáni kí o sì lò ó fún gbogbo ìfiwéra, láti browser, láti terminal host, láti ìpín WSL àti láti inú container. Kọ ohun mẹ́rin sílẹ̀ fún gbogbo ìgbìyànjú: àdírẹ́sì tí a yanjú, bóyá a lò proxy, irú ìkùnà àti àkókò tí ó kọjá. Wíwá orúkọ, ìdásílẹ̀ ìsopọ̀, ìjẹ́rìí TLS àti ipò HTTP jẹ́ ìṣòro mẹ́rin tí ó yàtọ̀, àti dídà wọ́n pọ̀ sí "kò ṣiṣẹ́" ń fi àárọ̀ kan ṣòfò.

Ṣe ìfiwéra náà nínú container tí ó ń kùnà, pẹ̀lú àkókò ààlà kí firewall tí ó dákẹ́ má bàa di terminal mú fún ìṣẹ́jú. Container tuntun ń tún ìyípadà nẹ́tíwọ́ọ̀kì engine ṣe, ṣùgbọ́n kì í tún ààyè orúkọ, àwọn oníyẹ̀yẹ́ proxy tàbí resolver ti container ohun èlò ṣe, nítorí náà docker exec sínú èyí gidi ni ìdánwò tí ó ní àṣẹ, container ẹ̀gbẹ́ sì jẹ́ ọ̀nà láti yà sọ́tọ̀ bóyá ìyàtọ̀ wà nínú engine tàbí container:

docker exec -it app /bin/sh -c "getent hosts api.internal; curl -v --max-time 8 https://api.internal/ 2>&1 | tail -20"
docker run --rm --network container:app curlimages/curl:latest -sv --max-time 8 https://api.internal/ 2>&1 | tail -20

Àwòrán ìpìlẹ̀ alpine ní busybox kò sì ní curl, ìyẹn gan-an ni irú àlàyé tí ó ń mú kí àkójọpọ̀ àyẹ̀wò tí a dàwò sí kùnà: yan àwòrán tí ó ní client, tàbí fi kún un nínú ìṣiṣẹ́ kan náà. Ìfiwéra pẹ̀lú àwọn ojú-òpó ìta tí kò ní ìbáṣepọ̀ kò yà ohunkóhun sọ́tọ̀. Tí https://example.com bá ṣiṣẹ́ láti container, o kọ́ pé container ní ànfààní íńtánẹ́ẹ̀tì àti ohunkóhun nípa bóyá ó lè dé àdírẹ́sì àdáni nípasẹ̀ tunnel. Bákan náà, ṣíṣí terminal tuntun fi hàn pé terminal tuntun ń ṣiṣẹ́ nìkan, kì í fi hàn pé ó pín àyíká ìṣiṣẹ́ pẹ̀lú ohun èlò tí ó kùnà.

Docker Desktop lè ṣiṣẹ́ pẹ̀lú VPN

Ìwé Docker fúnra rẹ̀ nípa VPN àti ìsopọ̀ host ṣàpèjúwe èyí gẹ́gẹ́ bí ètò tí a ń ṣe àtìlẹ́yìn fún, àti àkópọ̀ òtítọ́ ni pé ó ń ṣiṣẹ́ dípò kí ó ti bàjẹ́ fúnra rẹ̀. Má ṣe rò pé ẹ̀rọ àfọwọ́kọ desktop ń forí tunnel host gẹ́gẹ́ bí ọ̀rọ̀ àpẹẹrẹ; nínú ọ̀pọ̀ ètò, ìrìn ń tẹ̀lé tunnel host lọ́nà títọ́, ìdí ni pé ìtàn "Docker ń gbójú fo VPN" ń mú ìmọ̀ràn onígbọ́kànlélẹ̀ tí ó já mọ́ nínú ìṣìnà.

Ohun tí ó ṣì ṣe pàtàkì ni backend tí a ń lò, ìlànà split tunnel ti client, àti ìṣètò resolver tí ẹ̀rọ àfọwọ́kọ gbà. Client VPN tí ó fi àwọn ọ̀nà sínú ṣùgbọ́n kì í fi DNS, tàbí tí ó ń ti DNS server tí ẹ̀rọ àfọwọ́kọ kò lè dé, ń mú ìkùnà wíwá orúkọ nínú container jáde nígbà tí host ń ṣiṣẹ́ nítorí host ní resolver àfikún tàbí ìdáhùn tí a ti tọ́jú. Ìyẹn jẹ́ ìṣòro resolver tí ó wọ aṣọ container. Ó ń làkọjá gbogbo ìsopọ̀ VPN tuntun tí o bá gbìyànjú, nítorí tunnel ti ń gbé ìrìn tí o ní kí ó gbé.

Ìkọlù àdírẹ́sì àti MTU jẹ́ ìkùnà tí ó yàtọ̀

Ìkùnà méjì yẹ fún àyẹ̀wò tiwọn nítorí a sábà ṣe àṣìṣe wọ́n fún ìlànà ànfààní. Èyí àkọ́kọ́ ni ìkọlù àdírẹ́sì: tí VPN bá ti ìwọ̀n tí ó bá subnet bridge àìyẹ̀wò ti nẹ́tíwọ́ọ̀kì container kọlù, ọ̀nà container fún ìwọ̀n yẹn ń tọ́ka sí bridge àdúgbò kò sì ní dé tunnel rárá. Ṣàyẹ̀wò àwọn subnet gidi dípò ṣíṣe àríwísi:

docker network inspect bridge --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}'
ip route get 10.20.30.40

Èyí kejì ni ìṣòro MTU. Tí ìsopọ̀ bá fìdí kalẹ̀ tí TLS sì parí ṣùgbọ́n àwọn ìdáhùn tí ó tóbi ń dúró, o ní ìṣòro ìwọ̀n packet, kì í ṣe ìṣòro àṣẹ, àti yíyí àwọn àkọsílẹ̀ DNS padà kò ní tún un ṣe láé. Dánwò pẹ̀lú ìbéèrè kékeré àti èyí tí ó tóbi kí o tó yí ohunkóhun padà, kí o sì kọ àwọn èsì méjèèjì sílẹ̀.

Àtúnṣe fún ìkọlù ni subnet container mìíràn tàbí ọ̀nà tí a fi ààlà sí, tí ẹni tí ó ní ètò àdírẹ́sì yàn. Àtúnṣe fún ìdúró MTU ni dídá MTU tunnel tàbí interface sí iye tí ó lè kọjá ọ̀nà, tí a fi sí ipele tí ìwọ ń ṣàkóso.

Ìṣètò proxy jẹ́ ti ìlànà kọ̀ọ̀kan, kì í ṣe ti ẹ̀rọ

Nínú container, localhost ń pe ìyípadà nẹ́tíwọ́ọ̀kì ti container náà fúnra rẹ̀, nítorí náà proxy tí ó ń ṣiṣẹ́ lórí host kò lè dé ibẹ̀ lábẹ́ orúkọ yẹn. Docker Desktop ń pèsè host.docker.internal fún ànfààní host, àti lórí Linux o fi kún un ní gbangba pẹ̀lú --add-host=host.docker.internal:host-gateway. Ní ọ̀nàkọnà, orúkọ yẹn fún ọ ní ọ̀nà sí host; kò dá iṣẹ́ proxy sílẹ̀, kò sì fún ọ ní àṣẹ láti lò ó.

Lo àdírẹ́sì àti port proxy tí a pèsè fún àyíká gidi, kí o sì ṣàyẹ̀wò ẹni tí ó ń kà á. Àwọn oníyẹ̀yẹ́ tí a gbé jáde nínú shell ìbáraẹnisọ̀rọ̀ kò ní ṣètò gbogbo àfikún olóòtú, server èdè, irinṣẹ́ ìkọ́ àti daemon ẹ̀yìn fúnra wọn. Èyí tí ó ṣe pàtàkì ni ìlànà tí ó ṣe ìbéèrè tí ó kùnà, nítorí náà ṣàyẹ̀wò àyíká rẹ̀ dípò ti terminal rẹ.

Níkẹyìn, jẹ́ kí àtúnṣe náà ṣàlàyé fúnra rẹ̀. Ìpinnu tí ó wúlò ń dárúkọ ààlà tí kò tọ́nà, ètò tí ó yí i padà, àti àkójọ àwọn ìlànà tí ó ń kan báyìí. Títún VPN, olóòtú àti engine ṣe lẹ́sẹẹsẹ lè yí àmì àìsàn padà, ṣùgbọ́n kò fi ohunkóhun sílẹ̀ tí ẹni tí ó tẹ̀lé e lè lò.

Àwọn àpilẹ̀kọ tó jọra