Àwọn container ń dáhùn lórí LAN ọ́fíìsì, lẹ́yìn náà wọ́n dáhùn dúró ní àkókò tí VPN ilé-iṣẹ́ bá so pọ̀. Kò sí ohun tí ó yí padà nínú container: kò sí àtúnbẹ̀rẹ̀, kò sí ìmúdójúìwọ̀n àwòrán, kò sí àtúnṣe ìṣètò. Ohun tí ó yí padà ni tábìlì ìtọ́ ọ̀nà ti host, níbi tí ọ̀nà tí tunnel fi kún ti bo àdírẹ́sì tí Docker fúnni báyìí. Kí o tó ṣàtúnṣe subnet tàbí béèrè ìyọkúrò VPN, fi àwọn ètò àdírẹ́sì méjèèjì sí ẹ̀gbẹ́ ara wọn, nítorí pé àwọn àtúnṣe ń gba àkókò tí ó yàtọ̀ gidigidi.

Ka ọ̀nà kí o tó yí ìṣètò padà

Bẹ̀rẹ̀ pẹ̀lú nẹ́tíwọ́kì tí Docker kọ́ ní ti gidi. Àkójọ IPAM ni ètò àdírẹ́sì, subnet sì ni ìlà tí ó ṣe pàtàkì:

docker network inspect project_default --format '{{json .IPAM.Config}}'
# [{"Subnet":"172.18.0.0/16","Gateway":"172.18.0.1"}]

Compose ń pín /16 fún gbogbo iṣẹ́ tuntun ní àìpẹ̀, nítorí náà àwọn iṣẹ́ méjì lè wà nínú ààlà àdírẹ́sì 65,536. Ìbú náà ni ìdí tí àwọn ìfarapọ̀ fi wọ́pọ̀: /16 tí a yàn láìṣeé ni ó tóbi tó láti gbé ojú-ìwé tí o ń dé ọ̀dọ̀ rẹ̀ nípasẹ̀ tunnel mì, kò sì sí ẹni tí ó ṣàkíyèsí títí tunnel yóò fi gòkè.

Lẹ́yìn náà fi ìyàn ọ̀nà fún àdírẹ́sì container kan wé, lẹ́ẹ̀kan pẹ̀lú tunnel ní ìparí àti lẹ́ẹ̀kan pẹ̀lú rẹ̀ ní ìbẹ̀rẹ̀:

ip route get 172.18.0.7
# 172.18.0.7 dev br-3f2a9c src 172.18.0.1

Àwọn ìrísí ìdáhùn méjì ń yorí sí ibi tí ó yàtọ̀. Bí ìjáde bá dárúkọ tun0, wg0 tàbí ẹ̀rọ tunnel mìíràn, ìpilẹ̀ VPN kéré tí ó dọ́gba pẹ̀lú ọ̀nà afárá, àti packet kò ní dé ọ̀dọ̀ container láé. Bí ó bá ṣì ń dárúkọ afárá, host lè dé ọ̀dọ̀ container, àṣìṣe rẹ sì ni ìdánwò, DNS tàbí ọ̀nà ìpadà tí ń kùnà ní ẹ̀gbẹ́ kan ṣoṣo.

Ìdí tí ìfọwọ́pa /16 fi rọ̀rùn

Docker ń gba àwọn nẹ́tíwọ́kì afárá láti inú àwọn púlù àdáni, púlù àìpẹ̀ sì ń wá láti inú àkójọ 172.16.0.0/12 ní àwọn ege /16. Àwọn nẹ́tíwọ́kì ilé-iṣẹ́ sábà máa ń lo ààyè àdáni kan náà, VPN ìwọlé jíjìn sì ń ti àwọn ìpilẹ̀ yẹn lọ sí ọ̀dọ̀ gbogbo alábàáṣiṣẹ́ tí ó so pọ̀. Nígbà tí ẹ̀gbẹ́ méjèèjì bá gbà pé àwọn ni 172.18.0.0/16, tábìlì ìtọ́ ọ̀nà kan ń di àwọn ẹ̀sùn méjì tí ó tako ara wọn mú.

Ìpẹ̀ ìpilẹ̀ ni ó ń pinnu ẹni tí ó ṣẹ́gun, kì í ṣe ìtòlẹ́sẹẹsẹ àwọn ọ̀nà. Tunnel tí ń ti 10.0.0.0/8 lọ kò ṣẹ́gun ọ̀nà afárá 172.18.0.0/16, nítorí /8 kò ṣe pàtàkì tó. Tunnel tí ń ti 172.18.0.0/16, tàbí 172.18.5.0/24 nínú rẹ̀, lọ yóò ṣẹ́gun. Ìdí ni pé kọ̀mpútà gbé agbára kan ń ṣiṣẹ́ lórí nẹ́tíwọ́kì ọ́fíìsì tí ó sì ń kùnà lórí Wi-Fi òtẹ́ẹ̀lì pẹ̀lú VPN kan náà: alábàáṣiṣẹ́ ń gba àwọn ìpilẹ̀ tí ó yàtọ̀.

Tábìlì kan náà ń ṣàkóso ẹ̀gbẹ́ kejì. Container tí ó nílò host inú ní 10.8.4.20 ń fi packet ránṣẹ́ sí ẹnu-ọ̀nà afárá rẹ̀, host sì ń tọ́ ọ lọ sínú tunnel. Ọ̀nà yẹn sábà ń ṣiṣẹ́ nítorí pé host ni ó ń ṣe NAT, ṣùgbọ́n ó ń kùnà nígbà tí ẹ̀gbẹ́ ilé-iṣẹ́ bá gba àdírẹ́sì VPN kọ̀mpútà nìkan, tàbí nígbà tí ìdánwò ọ̀nà ìpadà bá sọ ìdáhùn aláìdọ́gba nù.

Fi àwọn àtúnṣe mẹ́ta wé

Ọ̀nà ìjáde mẹ́ta péré ló wà, wọ́n sì yàtọ̀ ní ẹni tí ó gbọdọ̀ fọwọ́ sí wọn àti ohun tí ó ń bàjẹ́ nígbà tí o ń lo ọ̀kan.

RepairWho owns itWhat it costs
Renumber the container networkYouRecreates the network, restarts services, invalidates literal addresses in configs and scripts
Exclude your range from the tunnelNetwork teamChanges what every laptop sees, needs a change request and a client profile update
Reach the service through a published portYou and the clientOne port only, no direct container-to-container routing across the tunnel

Àtúnṣe iye ni àtúnṣe kan ṣoṣo tí o lè parí láìsí tikẹ́ẹ̀tì, ìdí ni pé ọ̀pọ̀ àpilẹ̀kọ ń dúró níbẹ̀. Ó pọ̀ owó lórí iṣẹ́ tuntun, ó sì ń di gbèdé nígbà tí irinṣẹ́ ìṣíkiri tàbí okùn ìsopọ̀ tí a fi pamọ́ bá tọ́ka sí àdírẹ́sì gidi. Ka àwọn ìtọ́kasí yẹn kí o tó ṣàtúnṣe YAML, kì í ṣe lẹ́yìn.

Ìyọkúrò kúrò nínú tunnel ni ìdáhùn tí ó mọ́ jùlọ nígbà tí ìfarapọ̀ wà nínú ààlà tí ilé-iṣẹ́ rẹ gbà pé ó ni ní ti gidi. Ó tún lọ́ra jùlọ, kò sì wúlò fún olùgbàṣe tí kò lè yí profáìlì alábàáṣiṣẹ́ padà. Port tí a tẹ̀ jáde tàbí proxy yíyí kékeré ń yẹra fún àríyànjiyàn yìí: alábàáṣiṣẹ́ ń bá àdírẹ́sì tí tunnel ti ń tọ́ ọ̀nà tọ́ sọ̀rọ̀, port yẹn nìkan ni ó gbọdọ̀ lè dé.

Fi ààlà kan mú ní àmọ̀ọ́nú

Fún iṣẹ́ kan, kéde subnet nínú fáìlì compose kí iṣẹ́ náà lè dá ṣíṣe gbígbá láti inú púlù tí a pín:

networks:
  default:
    ipam:
      config:
        - subnet: 10.201.7.0/24

Gba ààlà yẹn láti inú ìwé àkọsílẹ̀ tí ẹgbẹ́ rẹ ń tọ́jú, kì í ṣe láti inú àpẹẹrẹ tí o rí nígbà wíwá. Fi wé àwọn ìpilẹ̀ tí VPN ń ti lọ, àwọn LAN ilé tí àwọn ènìyàn ń ṣiṣẹ́ láti inú wọn, àti àwọn nẹ́tíwọ́kì container mìíràn lórí host kan náà. Lẹ́yìn náà ṣètò àtúndá, nítorí nẹ́tíwọ́kì tí ó wà tẹ́lẹ̀ ń pa subnet rẹ̀ àtijọ́ mọ́: docker compose down, lẹ́yìn náà up -d. docker network rm ń kọ̀ nígbà tí àwọn ibi ìparí so mọ́, gbogbo àkọsílẹ̀ ipv4_address nínú fáìlì sì gbọdọ̀ wà nínú ààlà tuntun.

Fún àwọn nẹ́tíwọ́kì tí Docker ń dá fúnra rẹ̀, ṣètò púlù daemon nínú /etc/docker/daemon.json:

{
  "default-address-pools": [
    { "base": "10.201.0.0/16", "size": 24 },
    { "base": "10.202.0.0/16", "size": 24 }
  ]
}

Púlù náà kan àwọn nẹ́tíwọ́kì tí a dá lẹ́yìn àtúnbẹ̀rẹ̀ daemon, àwọn afárá tí ó ti wà ń pa àdírẹ́sì wọn mọ́. Ìyẹn rọrùn, ó sì ṣeé gbàgbé, nítorí náà ka iṣẹ́ àtijọ́ sí ẹni tí ó ṣì ń farapọ̀ títí ẹnìkan yóò fi tún nẹ́tíwọ́kì rẹ̀ dá. ìwé ìtọ́nà nẹ́tíwọ́kì ẹ́ńjìnì Docker ṣàlàyé àwọn ìlànà pínpín bí o bá nílò láti gbèjà púlù náà nínú àyẹ̀wò.

Afárá Linux àti Docker Desktop ń kùnà lọ́nà tí ó yàtọ̀

Lórí host Linux, àwọn container jókòó lórí àwọn afárá nínú ààyè orúkọ host. Tábìlì kan ń pinnu ohun gbogbo, nítorí náà ìfiwéra tí ó wà lókè ni gbogbo ìtàn: ka ọ̀nà afárá, ka ọ̀nà tunnel, kí o sì wo èyí tí ó ṣẹ́gun fún àdírẹ́sì container gidi.

Docker Desktop ń gbé àwọn container sí ẹ̀yìn VM tí ó ní NAT tirẹ̀. Host kò ní ọ̀nà kankan sí àdírẹ́sì container; ó ń dé ọ̀dọ̀ iṣẹ́ náà nípasẹ̀ port tí a tẹ̀ jáde, tí a sábà so mọ́ 127.0.0.1. Nítorí náà alábàáṣiṣẹ́ VPN lè bàjẹ́ iṣẹ́ náà láìsí ìfarapọ̀ subnet kankan: yálà nípa fífi ọ̀nà sílẹ̀ fún ààlà inú VM tàbí nípa dídènà ìrìnnà loopback nígbà tí tunnel so pọ̀. Bí ip route get lórí host bá sọ pé kò sí ọ̀nà fún àdírẹ́sì container, ìyẹn ni a retí, kì í ṣe àṣìṣe.

Àbájáde gidi ni ibi tí o ti wo àkọ́kọ́. Lórí Linux, bẹ̀rẹ̀ pẹ̀lú tábìlì ìtọ́ ọ̀nà. Lórí Desktop, bẹ̀rẹ̀ pẹ̀lú port tí a tẹ̀ jáde àti àwọn ìlànà firewall alábàáṣiṣẹ́ VPN, lẹ́yìn náà ṣàyẹ̀wò bóyá subnet inú VM ń farapọ̀ mọ́ ohun tí tunnel ń ti lọ.

Ṣàyẹ̀wò pẹ̀lú tunnel ní ìbẹ̀rẹ̀

So VPN pọ̀ lẹ́ẹ̀mejì kí o tó sọ pé ó ti tán, nítorí profáìlì tí ń ti ọ̀nà lọ nígbà ìsopọ̀ tí ó sì ń fa wọn padà nígbà ìyàsọ́ lè dàbí ẹni tí ó tọ́ lẹ́yìn ìgbìyànjú àkọ́kọ́. Lẹ́yìn náà ṣe àwọn àyẹ̀wò tí alábàáṣiṣẹ́ ń ṣe ní ti gidi:

  1. ip route get láti ọ̀dọ̀ host, ní lílo àdírẹ́sì gidi container.
  2. Ìbéèrè láti ọ̀dọ̀ container mìíràn, láti fi hàn pé iṣẹ́ náà fúnra rẹ̀ ní ìlera.
  3. curl -sv http://127.0.0.1:8080/ láti ọ̀dọ̀ alábàáṣiṣẹ́ pẹ̀lú tunnel ní ìbẹ̀rẹ̀, lẹ́yìn náà traceroute -n sí àdírẹ́sì container láti ẹ́rọ kan nínú LAN.
  4. sysctl net.ipv4.conf.all.rp_filter bí ìbéèrè bá dé ọ̀dọ̀ host ṣùgbọ́n ìdáhùn sọnù.

Ní ìparí, kọ ààlà tí a yàn sínú ìwé àkọsílẹ̀ kan náà tí o lò láti yàn án, pẹ̀lú ọjọ́ àti iṣẹ́ tí ó ni í. Ìfarapọ̀ tí ó kàn yóò wá láti inú iṣẹ́ tí ẹnìkan kò kọ, ìdáàbòbò kan ṣoṣo ni pé a fi ààlà náà pamọ́ ní àmọ̀ọ́nú, kì í ṣe pé a yàn án láìṣeé.

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