Sut i lwybro traffig y gwesteiwr drwy gynhwysydd Docker VPN
Mae cynhwysydd VPN yn ofod enw rhwydwaith, nid yn ddirprwy. Dewiswch netns a rennir, gwrandawr SOCKS go iawn neu borthladd rhwydwedig, yna gwiriwch y llwybr allanfa.
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.
| Client | Arrangement | What must already exist |
|---|---|---|
| Another Compose service | Shares the vpn namespace via network_mode: service:vpn | A working tunnel and correct start order |
| Host browser, IDE or CLI | Proxy listener inside the namespace, published to host loopback | A configured SOCKS or HTTP proxy and its access rules |
| Router, VM or phone | The container as a layer-3 gateway | Forwarding, 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_healthyMae 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.meOs 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 MASQUERADEMae 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/healthDylai'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.