Kọ́ńténíà ihò rẹ ń ṣiṣẹ́, docker compose exec vpn curl -s https://ifconfig.me ń dáhùn pẹ̀lú àdírẹ́sì olùpèsè náà, ṣùgbọ́n aṣàwákiri lórí tábìlì rẹ ṣì ń jáde nípasẹ̀ ISP rẹ. Àlàfo yẹn jẹ́ ohun tí a retí. Kọ́ńténíà tí ń mú kíláìntì VPN ṣiṣẹ́ ń di ààyè orúkọ nẹ́tíwọ́kì mú, àwọn ọ̀nà àti ojú-ọ̀nà ihò, kò sì di ohunkóhun tí ń sọ HTTP tàbí SOCKS; pípè port kan lórí rẹ̀ kò lè dá olùgbọ́ tí kò tíì sí rí.

Ibẹ̀ tí kíláìntì ń ṣiṣẹ́ ni ó ń pinnu àpẹrẹ. Kọ́ńténíà ẹgbẹ́ lè lọ sínú ààyè orúkọ ihò náà, ohun èlò tábìlì kò lè, ẹnubodè sì nílò àwọn ọ̀nà kì í ṣe pápá aṣojú. Tí o bá ṣe àtúnsọ̀rọ̀ náà ní àṣìṣe, àmì náà jẹ́ kan náà: ìsopọ̀ tí a kọ̀, tàbí ẹrù tí ń gbà ọ̀nà àtijọ́ ní ìdákẹ́jẹ́.

Bá ìṣètò mu pẹ̀lú ibi tí kíláìntì ń ṣiṣẹ́

Bèèrè ìbéèrè kan kí o tó ṣàtúnṣe Compose: ṣé a lè gbé kíláìntì bẹ̀rẹ̀ nínú ààyè orúkọ nẹ́tíwọ́kì kọ́ńténíà VPN? Ohunkóhun tí ń ṣiṣẹ́ bíi kọ́ńténíà Linux lè. Aṣàwákiri, IDE tàbí CLI lórí tábìlì rẹ kò lè, nítorí ètò aṣojú rẹ̀ ń retí iṣẹ́ ìlànà, kì í ṣe ààyè orúkọ.

ClientArrangementWhat must already exist
Another Compose serviceShares the vpn namespace via network_mode: service:vpnA working tunnel and correct start order
Host browser, IDE or CLIProxy listener inside the namespace, published to host loopbackA configured SOCKS or HTTP proxy and its access rules
Router, VM or phoneThe container as a layer-3 gatewayForwarding, NAT and a return route

Àwọn mẹ́ta wọ̀nyí kò dàpọ̀. Pápá aṣojú HTTP tí ó tọ́ka sí àdírẹ́sì afárá kọ́ńténíà kò dé ibikíbi àyàfi tí aṣojú bá ń gbọ́ níbẹ̀, olùgbọ́ aṣojú kò sì darí ẹrù ẹnubodè. Pinnu kí o tó tẹ̀síwájú, lẹ́yìn náà tẹ̀lé apá tí ó bá mu.

Pín ààyè orúkọ ihò pẹ̀lú kọ́ńténíà ẹgbẹ́

Èyí ni àṣàyàn tí ó pọ̀ jùlọ nínú owó nítorí kò sí ìlànà aṣojú kankan nínú. Ohun èlò náà wọ ààyè orúkọ iṣẹ́ vpn, ó sì jogún àwọn ojú-ọ̀nà, àwọn ọ̀nà àti ààyè port rẹ̀:

services:
  vpn:
    image: your-vpn-client
    cap_add:
      - NET_ADMIN
    healthcheck:
      test: ["CMD-SHELL", "ip link show tun0 >/dev/null"]
      interval: 10s
      retries: 5
  app:
    image: your-app
    network_mode: service:vpn
    depends_on:
      vpn:
        condition: service_healthy

Àwọn ìdíwọ́ mẹ́ta ń wá láti inú ìṣẹ̀lẹ̀ náà pé iṣẹ́ mìíràn ni ó ni ààyè orúkọ náà. Ohun èlò kò gba kọ́kọ́rọ́ networks tirẹ̀, nítorí kò ní ààyè orúkọ láti fi ara mọ́. Pípè port jẹ́ ti vpn, nítorí ibẹ̀ ni ààyè orúkọ ń gbé. Àti pé àtúnṣe vpn ń pa ààyè orúkọ tí ohun èlò wọ̀ run, nítorí náà docker compose up -d --force-recreate vpn fi ọ́ sílẹ̀ láti tún app ṣe pẹ̀lú; àtúnbẹ̀rẹ̀ lásán kì í tó nígbà gbogbo. Ìwé ìtọ́kasí àwọn iṣẹ́ Compose bo ìṣètò yìí àti ìdíwọ́ pípè port rẹ̀.

Má ṣe rò pé olùyọjú náà ń bá a wá. /etc/resolv.conf jẹ́ fáìlì fún kọ́ńténíà kọ̀ọ̀kan, kì í ṣe apá ààyè orúkọ nẹ́tíwọ́kì, nítorí náà ohun èlò ṣì lè béèrè olùyọjú ẹrù kọ̀mpútà nígbà tí àwọn pákéètì rẹ̀ ń jáde gbà ihò. Kà á láti inú kọ́ńténíà, kí o sì ṣètò dns: lórí ohun èlò nígbà tí a gbọ́dọ̀ yanjú àwọn orúkọ àdáni gbà ihò.

docker compose exec app ip route
docker compose exec app cat /etc/resolv.conf
docker compose exec app curl -s https://ifconfig.me

Tí àkójọ ọ̀nà bá ní ojú-ọ̀nà ihò tí àdírẹ́sì sì jẹ́ ti olùpèsè, ohun èlò wà nínú ihò. Tí ojú-ọ̀nà kò bá sí, app bẹ̀rẹ̀ kí vpn tó ní ihò, nítorí náà tún app ṣe ní kété tí vpn bá kéde ìlera.

Fi olùgbọ́ aṣojú gidi sínú ààyè orúkọ fún àwọn kíláìntì ẹrù kọ̀mpútà

Aṣàwákiri tábìlì kò lè darapọ̀ mọ́ ààyè orúkọ, nítorí náà a gbọ́dọ̀ ṣí ihò náà gẹ́gẹ́ bí iṣẹ́. Ṣe aṣojú SOCKS tàbí HTTP gidi nínú ààyè orúkọ vpn, kí o sì pè port rẹ̀ nìkan:

services:
  vpn:
    ports:
      - "127.0.0.1:1080:1080"
  proxy:
    image: your-proxy
    network_mode: service:vpn
    command: ["--socks", "0.0.0.0:1080"]

Àdírẹ́sì ní ẹ̀gbẹ́ ẹrù kọ̀mpútà ni ìdajì pàtàkì àtúnsọ̀rọ̀ yẹn. 127.0.0.1:1080 ní apá òsì ń pa olùgbọ́ mọ́ kúrò ní LAN rẹ; "1080:1080" ìhò ń pè aṣojú ṣíṣí fún gbogbo ẹ̀rọ tí ó lè dé ẹ̀rọ rẹ.

Ẹ̀gbẹ́ kọ́ńténíà ní páànù tirẹ̀. A ń fi àwọn port tí a pè jíṣẹ́ sí àdírẹ́sì kọ́ńténíà lórí afárá, kì í ṣe loopback rẹ̀, nítorí náà aṣojú tí a fi --socks 127.0.0.1:1080 gbé kalẹ̀ nínú ààyè orúkọ gba àwọn ìsopọ̀ láti ọ̀dọ̀ àwọn ẹgbẹ́, ó sì kọ gbogbo ohun tí ó gbà port tí a pè wá. So ó mọ́ 0.0.0.0, kí o sì gbẹ́kẹ̀ lé ìso loopback ẹ̀gbẹ́ ẹrù kọ̀mpútà fún ìyàsọ́tọ̀. Òfin kan náà kan àdírẹ́sì gbígbọ́ nínú fáìlì ètò aṣojú pẹ̀lú.

Lẹ́yìn náà pinnu ibi tí a ti ń yanjú àwọn orúkọ. Nínú curl, --socks5 ń yanjú orúkọ ẹrù kọ̀mpútà ní àdúgbò, --socks5-hostname sì ń fi orúkọ ránṣẹ́ sí aṣojú; àwọn aṣàwákiri ń fi ìyípadà kan náà hàn lábẹ́ àmì mìíràn. Ìyọjú àdúgbò ń tú ìbéèrè jáde pàápàá nígbà tí ojú-ìwé bá gbé wá gbà ihò.

Ka kọ́ńténíà sí ẹnubodè nígbà tí ó bá ní ọ̀nà ìpadàbọ̀ nìkan

Àwọn ẹnubodè, VM àti fọ́nù kò ní lo pápá aṣojú HTTP, àwọn ohun èlò kan sì ń fojú fo àwọn àyípadà aṣojú pátápátá. Dídarí ẹrù wọn túmọ̀ sí ìpele 3: kọ́ńténíà ń tẹ̀síwájú àwọn pákéètì, ó sì ń túmọ̀ àwọn àdírẹ́sì lórí ojú-ọ̀nà ihò.

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

Àwọn nǹkan méjì ń sọnù ní rọ̀rùn. Kíláìntì nílò ọ̀nà tí yóò tọ́ka ẹnubodè àkọ́kọ́ rẹ̀ sí ẹrù kọ̀mpútà yìí, àwọn ìdáhùn sì gbọ́dọ̀ rí ọ̀nà ìpadàbọ̀, yálà gbà ọ̀nà ìdúró lórí ẹnubodè òkè tàbí gbà NAT lórí ojú-ọ̀nà tí ó kọjú sí àwọn kíláìntì. Láìsí ọ̀kan nínú àwọn méjèèjì, ihò yóò gbé ìbéèrè jáde, ìdáhùn yóò sì pòórá.

Ó tún ní àyíká ìpa tí ó gbòòrò jùlọ. Ẹrù kọ̀mpútà tí ń ṣiṣẹ́ bíi ẹnubodè fún gbogbo LAN ń fi gbogbo kíláìntì tí a ṣàtúnṣe lọ́nà tí kò tọ́ ránṣẹ́ gbà àkọsílẹ̀ VPN rẹ, àti ìṣubú ihò yóò yálà sọ LAN di òkùnkùn tàbí yóò padà sọ́dọ̀ ISP ní ìbámu pẹ̀lú kill switch.

Ṣàyẹ̀wò ọ̀nà àbájáde, lẹ́yìn náà yí padà ní ìtẹ̀léra

Ṣàyẹ̀wò ní ìtẹ̀léra yìí kí o sì dúró ní ìkùnà àkọ́kọ́: àdírẹ́sì àbájáde nínú ààyè orúkọ, àdírẹ́sì àbájáde láti ẹrù kọ̀mpútà gbà aṣojú, lẹ́yìn náà ìyọjú orúkọ fún ẹrù kọ̀mpútà àdáni.

docker compose exec vpn curl -s https://ifconfig.me
curl -s -x socks5h://127.0.0.1:1080 https://ifconfig.me
curl -s -x socks5h://127.0.0.1:1080 http://internal.example/health

Àwọn àdírẹ́sì méjì àkọ́kọ́ gbọ́dọ̀ bá olùpèsè mu, ti ẹ̀kẹta sì gbọ́dọ̀ yanjú gbà aṣojú dípò kí ó kùnà pẹ̀lú àṣìṣe orúkọ. Ìlà àkọ́kọ́ tí ó bá mu àti ìlà kejì tí ó kùnà túmọ̀ sí pé olùgbọ́ tàbí port tí a pè ni ó tọ́, kì í ṣe ihò.

Yíyí padà ni ìdàkejì ìṣètò. Yọ àwọn àyípadà àyíká aṣojú kúrò nínú profáìlì shell àti nínú ẹyọ systemd kankan, lẹ́yìn náà sọ àkójọ kalẹ̀ kí ààyè orúkọ àjọpín lè pòórá pẹ̀lú olówó rẹ̀. Pa port tí a pè kí o tó pa iṣẹ́ aṣojú, bí bẹ́ẹ̀ kọ́ ẹrù kọ̀mpútà yóò pa olùgbọ́ loopback mọ́ tí ẹnìkankan kò kà.

Kí o tó tẹ̀síwájú, jẹ́rìí àwọn nǹkan mẹ́rin: kíláìntì tí ó ṣe pàtàkì fún ọ ń dé ihò gangan, olówó ààyè orúkọ nìkan ni ó ń pè àwọn port, a ń yanjú àwọn orúkọ àdáni ní ibi tí o ti pinnu, àti pé kò sí ohunkóhun tí ń gbọ́ lórí àdírẹ́sì ẹrù kọ̀mpútà tí kì í ṣe loopback. Ọ̀kọ̀ọ̀kan wọn ń kùnà ní ìdákẹ́jẹ́ nínú ìgbéjáde, ọ̀kọ̀ọ̀kan sì jẹ́ àyẹ̀wò ìlà kan lókè.

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