Како усмерити саобраћај домаћина кроз Docker VPN контејнер
VPN контејнер је мрежни именски простор, а не прокси. Изаберите заједнички netns, прави SOCKS слушалац или усмерена капија, затим проверите излазну путању.
Ваш контејнер тунела ради, docker compose exec vpn curl -s https://ifconfig.me одговара адресом добављача, а ипак прегледач на вашој радној површини излази преко вашег ISP-а. Тај јаз је очекиван. Контејнер који покреће VPN клијента држи мрежни именски простор, руте и интерфејс тунела, и ништа што говори HTTP или SOCKS; објављивање порта на њему не може створити слушалац који никада није постојао.
Где се клијент извршава одређује дизајн. Братски контејнер може прећи у именски простор тунела, десктоп апликација не може, а рутер захтева руте, а не поље проксија. Ако погрешите мапирање, симптом је исти: веза одбијена или саобраћај који тихо иде старим путем.
Прилагодите распоред месту где се клијент извршава
Поставите једно питање пре уређивања Compose-а: може ли клијент да се покрене унутар мрежног именског простора VPN контејнера? Све што већ ради као Linux контејнер може. Прегледач, IDE или CLI на вашем столу не може, јер његово подешавање проксија очекује протоколну услугу, а не именски простор.
| 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 |
Ова три се не мешају. Поље HTTP проксија усмерено на мостну адресу контејнера не достиже ништа ако тамо не слуша прокси, а слушалац проксија не усмерава саобраћај рутера. Прво одлучите, затим следите одговарајући одељак.
Поделите именски простор тунела са братским контејнером
Ово је најјефтинија опција јер није укључен ниједан протокол проксија. Апликација улази у именски простор услуге vpn и наслеђује њене интерфејсе, руте и простор портова:
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Три ограничења произлазе из тога што именски простор припада другој услузи. Апликација не добија сопствени кључ networks, јер нема именски простор за који би се прикачила. Објављивање портова припада vpn-у, јер тамо живи именски простор. А поновно стварање vpn-а уништава именски простор у који је апликација ушла, зато docker compose up -d --force-recreate vpn оставља вама да поново створите и app; обичан рестарт није увек довољан. Референца Compose услуга покрива овај распоред и његово ограничење објављивања портова.
Не претпостављајте да резолвер долази с њим. /etc/resolv.conf је датотека по контејнеру, а не део мрежног именског простора, зато апликација још може да пита резолвер домаћина док њени пакети излазе кроз тунел. Прочитајте је унутар контејнера и подесите dns: на апликацији када приватна имена морају да се реше кроз тунел.
docker compose exec app ip route
docker compose exec app cat /etc/resolv.conf
docker compose exec app curl -s https://ifconfig.meАко листа рута садржи интерфејс тунела и адреса је добављачева, апликација је унутар тунела. Ако интерфејс недостаје, app је стартовао пре него што је vpn имао тунел, зато поново створите app када vpn пријави здравље.
Поставите прави слушалац проксија у именски простор за клијенте домаћина
Десктоп прегледач не може да се придружи именском простору, зато тунел мора да се изложи као услуга. Покрените прави SOCKS или HTTP прокси унутар именског простора vpn и објавите само његов порт:
services:
vpn:
ports:
- "127.0.0.1:1080:1080"
proxy:
image: your-proxy
network_mode: service:vpn
command: ["--socks", "0.0.0.0:1080"]Адреса на страни домаћина је важна половина тог мапирања. 127.0.0.1:1080 лево држи слушалац изван ваше LAN мреже; голи "1080:1080" објављује отворени прокси сваком уређају који може да достигне вашу машину.
Страна контејнера има сопствену замку. Објављени портови се достављају на адресу контејнера на мосту, а не на његов loopback, зато прокси покренут са --socks 127.0.0.1:1080 унутар именског простора прихвата везе браће и одбија све што пристиже кроз објављени порт. Вежите га за 0.0.0.0 и за изолацију се ослоните на loopback везу на страни домаћина. Исто правило важи за адресу слушања у конфигурационој датотеци проксија.
Затим одлучите где се имена решавају. У curl-у --socks5 решава име домаћина локално, а --socks5-hostname шаље име проксију; прегледачи приказују исти прекидач под другом ознаком. Локално решавање одаје упит чак и када се страница учита кроз тунел.
Третирајте контејнер као капију само са повратном рутом
Рутери, VM-ови и телефони неће користити поље HTTP проксија, а неке апликације потпуно игноришу променљиве проксија. Усмеравање њиховог саобраћаја значи слој 3: контејнер прослеђује пакете и преводи адресе на интерфејсу тунела.
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADEДве ствари се лако пропусте. Клијенту је потребна рута која његову подразумевану капију усмерава на овај домаћин, а одговори морају да нађу пут назад, било кроз статичку руту на надређеном рутеру или кроз NAT на интерфејсу окренутом ка клијентима. Без једног од тога тунел износи захтев напоље и одговор нестаје.
Има и најшири радијус дејства. Домаћин који служи као капија за целу LAN мрежу шаље сваког погрешно конфигурисаног клијента кроз ваш VPN налог, а пад тунела или замрачује LAN или се враћа на ISP зависно од kill switch-а.
Проверите излазну путању, затим се вратите по реду
Проверавајте овим редом и зауставите се на првом неуспеху: излазна адреса унутар именског простора, излазна адреса са домаћина кроз прокси, затим решавање имена за приватни домаћин.
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Прве две адресе треба да се поклопе са добављачем, а трећа треба да се реши кроз прокси уместо да пропадне са грешком имена. Поклапање првог реда и неуспех другог значе да су слушалац или објављени порт погрешни, а не тунел.
Враћање је супротно од подешавања. Уклоните променљиве окружења проксија из профила шкољке и из било које systemd јединице, затим спустите стек да заједнички именски простор нестане са својим власником. Избришите објављени порт пре брисања прокси услуге, иначе домаћин задржава loopback слушалац који нико не чита.
Пре него што наставите, потврдите четири ствари: клијент који вам је важан заиста стиже до тунела, портове објављује само власник именског простора, приватна имена се решавају тамо где сте намеравали, и ништа не слуша на адреси домаћина која није loopback. Свака од њих тихо отказује у продукцији, и свака је провера од једног реда горе.