Mae eich cynhwysydd twnnel yn gweithio, mae docker compose exec vpn curl -s https://ifconfig.me yn ateb ag anerchiad y darparwr, ac eto mae'r porwr ar eich desg yn gadael drwy eich ISP. Mae'r bwlch hwnnw i'w ddisgwyl. Mae cynhwysydd sy'n rhedeg cleient VPN yn dal gofod enw rhwydwaith, llwybrau a rhyngwyneb twnnel, a dim byd sy'n siarad HTTP na SOCKS; ni all cyhoeddi porth arno greu gwrandawr nad oedd erioed yno.

Lle mae'r cleient yn rhedeg sy'n penderfynu'r dyluniad. Gall cynhwysydd cyfagos symud i ofod enw'r twnnel, ni all cymhwysiad desg, ac mae angen llwybrau ar lwybrydd yn hytrach na maes dirprwy. Camgymerwch y mapio a bydd y symptom yr un fath: cysylltiad wedi'i wrthod, neu draffig sy'n mynd yn dawel ar hyd yr hen lwybr.

Cyfatebwch y trefniant i le mae'r cleient yn rhedeg

Gofynnwch un cwestiwn cyn golygu Compose: a ellir cychwyn y cleient y tu mewn i ofod enw rhwydwaith y cynhwysydd VPN? Gall unrhyw beth sy'n rhedeg yn barod fel cynhwysydd Linux. Ni all porwr, IDE na CLI ar eich desg, oherwydd mae ei osodiad dirprwy yn disgwyl gwasanaeth protocol, nid gofod enw.

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

Nid yw'r tri hyn yn cymysgu. Nid yw maes dirprwy HTTP a bwyntir at anerchiad pont y cynhwysydd yn cyrraedd dim oni bai bod dirprwy yn gwrando yno, ac nid yw gwrandawr dirprwy yn llwybro traffig lwybrydd. Penderfynwch yn gyntaf, yna dilynwch yr adran gyfatebol.

Rhannwch ofod enw'r twnnel gyda chynhwysydd cyfagos

Dyma'r opsiwn rhataf oherwydd nad oes protocol dirprwy yn rhan ohono. Mae'r ap yn ymuno â gofod enw gwasanaeth vpn ac yn etifeddu ei ryngwynebau, ei lwybrau a'i ofod porthladdoedd:

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

Mae tri chyfyngiad yn deillio o'r ffaith bod y gofod enw'n perthyn i wasanaeth arall. Nid yw'r ap yn cael ei allwedd networks ei hun, oherwydd nad oes ganddo ofod enw i ymlynu wrtho. Cyhoeddi porthladdoedd sy'n perthyn i vpn, gan mai yno y mae'r gofod enw. Ac mae ail-greu vpn yn dinistrio'r gofod enw ymunodd yr ap ag ef, felly mae docker compose up -d --force-recreate vpn yn eich gadael i ail-greu app hefyd; nid yw ailgychwyn plaen bob amser yn ddigon. Mae cyfeirlyfr gwasanaethau Compose yn ymdrin â'r trefniant hwn a'i gyfyngiad ar gyhoeddi porthladdoedd.

Peidiwch â chymryd yn ganiataol bod y datryswr yn dod gyda hi. Ffeil fesul cynhwysydd yw /etc/resolv.conf, nid rhan o ofod enw'r rhwydwaith, felly gall yr ap barhau i holi datryswr y gwesteiwr tra bo ei becynnau'n gadael drwy'r twnnel. Darllenwch hi o fewn y cynhwysydd a gosod dns: ar yr ap pan fo'n rhaid datrys enwau preifat drwy'r twnnel.

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

Os yw'r rhestr llwybrau'n cynnwys rhyngwyneb y twnnel a'r anerchiad yn un y darparwr, mae'r ap y tu mewn i'r twnnel. Os yw'r rhyngwyneb ar goll, cychwynnodd app cyn bod gan vpn dwnnel, felly ail-grewch app unwaith y bydd vpn yn adrodd ei fod yn iach.

Rhowch wrandawr dirprwy go iawn yn y gofod enw ar gyfer cleientiaid y gwesteiwr

Ni all porwr desg ymuno â gofod enw, felly rhaid datgelu'r twnnel fel gwasanaeth. Rhedwch ddirprwy SOCKS neu HTTP go iawn y tu mewn i ofod enw vpn a chyhoeddwch ei borthladd yn unig:

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

Anerchiad ochr y gwesteiwr yw hanner pwysig y mapio hwnnw. Mae 127.0.0.1:1080 ar y chwith yn cadw'r gwrandawr oddi ar eich LAN; mae "1080:1080" noeth yn cyhoeddi dirprwy agored i bob dyfais a all gyrraedd eich peiriant.

Mae gan ochr y cynhwysydd ei magl ei hun. Mae porthladdoedd cyhoeddedig yn cael eu danfon i anerchiad y cynhwysydd ar y bont, nid i'w loopback, felly mae dirprwy a gychwynnwyd gyda --socks 127.0.0.1:1080 y tu mewn i'r gofod enw yn derbyn cysylltiadau gan gymdogion ac yn gwrthod popeth sy'n cyrraedd drwy'r porthladd cyhoeddedig. Rhwymwch ef i 0.0.0.0 a dibynnu ar rwymiad loopback ochr y gwesteiwr ar gyfer ynysu. Mae'r un rheol yn berthnasol i'r anerchiad gwrando mewn ffeil ffurfweddu dirprwy.

Yna penderfynwch ble mae enwau'n cael eu datrys. Yn curl, mae --socks5 yn datrys yr enw gwesteiwr yn lleol ac mae --socks5-hostname yn anfon yr enw at y dirprwy; mae porwyr yn dangos yr un switsh o dan label gwahanol. Mae datrysiad lleol yn gollwng yr ymholiad hyd yn oed pan fydd y dudalen yn llwytho drwy'r twnnel.

Triniwch y cynhwysydd fel porthladd dim ond gyda llwybr yn ôl

Ni fydd lwybryddion, VM a ffonau'n defnyddio maes dirprwy HTTP, ac mae rhai cymhwysiadau'n anwybyddu newidynnau dirprwy yn gyfan gwbl. Mae llwybro eu traffig yn golygu haen 3: mae'r cynhwysydd yn anfon pecynnau ymlaen ac yn cyfieithu anerchiadau ar ryngwyneb y twnnel.

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

Mae dau beth yn hawdd eu colli. Mae angen llwybr ar y cleient sy'n pwyntio ei borthladd diofyn at y gwesteiwr hwn, a rhaid i atebion ddod o hyd i'w ffordd yn ôl, naill ai drwy lwybr statig ar y llwybrydd uwch na thrwy NAT ar y rhyngwyneb sy'n wynebu'r cleientiaid. Heb un o'r rheini, mae'r twnnel yn cario'r cais allan ac mae'r ateb yn diflannu.

Mae ganddo'r radiws effaith ehangaf hefyd. Mae gwesteiwr sy'n gwasanaethu fel porthladd ar gyfer y LAN gyfan yn anfon pob cleient wedi'i gamffurfweddu drwy eich cyfrif VPN, ac mae cwymp twnnel naill ai'n tywyllu'r LAN neu'n syrthio'n ôl i'r ISP yn dibynnu ar y kill switch.

Gwiriwch y llwybr allanfa, yna rholiwch yn ôl yn nhrefn

Gwiriwch yn y drefn hon a stopiwch ar y methiant cyntaf: anerchiad allanfa y tu mewn i'r gofod enw, anerchiad allanfa o'r gwesteiwr drwy'r dirprwy, yna datrysiad enwau ar gyfer gwesteiwr preifat.

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

Dylai'r ddau anerchiad cyntaf gyfateb i'r darparwr, a dylai'r trydydd ddatrys drwy'r dirprwy yn hytrach na methu â gwall enw. Mae llinell gyntaf sy'n cyfateb a llinell ail yn methu yn golygu bod y gwrandawr neu'r porthladd cyhoeddedig yn anghywir, nid y twnnel.

Mae rholio'n ôl yn wrthwyneb i'r gosodiad. Tynnwch y newidynnau amgylchedd dirprwy o broffil y plisgyn ac o unrhyw uned systemd, yna gostyngwch y stac fel bod y gofod enw a rennir yn diflannu gyda'i berchennog. Dilëwch y porthladd cyhoeddedig cyn dileu'r gwasanaeth dirprwy, neu bydd y gwesteiwr yn cadw gwrandawr loopback nad oes neb yn ei ddarllen.

Cyn i chi symud ymlaen, cadarnhewch bedwar peth: bod y cleient rydych chi'n poeni amdano yn cyrraedd y twnnel, mai dim ond perchennog y gofod enw sy'n cyhoeddi porthladdoedd, bod enwau preifat yn cael eu datrys lle'r oeddech chi'n bwriadu, ac nad oes dim yn gwrando ar anerchiad gwesteiwr nad yw'n loopback. Mae pob un o'r rhain yn methu'n dawel mewn cynhyrchu, a phob un yn wiriad un llinell uchod.

Erthyglau cysylltiedig