د 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 د تونل له جوړېدو مخکې پیل شوی، نو کله چې vpn روغتیا راپور کړ app بیا جوړ کړئ.
د کوربه کلاینټونو لپاره په نومونه فضا کې ریښتینی پروکسي اورېدونکی کېږدئ
ډیسکټاپ براوزر نشي کولای نومونه فضا ته ننوځي، نو تونل باید د خدمت په توګه ښکاره شي. د vpn نومونه فضا په داخل کې ریښتینی SOCKS یا HTTP پروکسي چل کړئ او یوازې د هغه پورټ خپور کړئ:
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 تیاره کوي یا د kill switch له مخې ISP ته بېرته ځي.
د وتلو لاره وګورئ، بیا په ترتیب سره بېرته وګرځوئ
په دې ترتیب وګورئ او پر لومړنۍ ناکامۍ ودروئ: په نومونه فضا کې د وتلو پته، له کوربه د پروکسي له لارې د وتلو پته، بیا د شخصي کوربه لپاره د نومونو حل.
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لومړنۍ دوه پتې باید د چمتو کونکي سره سمې وي، او درېیمه باید د نوم تېروتنې سره ناکامه کېدو پرځای د پروکسي له لارې حل شي. لومړی کرښه سمه او دوهمه ناکامه وي نو اورېدونکی یا خپرېدونکی پورټ غلط دی، نه تونل.
بېرته ګرځول د ترتیباتو برعکس دی. د پروکسي چاپېریال متغیرونه د shell پروفایل او هر systemd واحد څخه لرې کړئ، بیا سټک ښکته کړئ ترڅو شریکه نومونه فضا د خپل مالک سره ورکې شي. خپرېدونکی پورټ د پروکسي خدمت له حذف مخکې حذف کړئ، که نه کوربه هغه loopback اورېدونکی ساتي چې څوک یې نه لولي.
له تګ مخکې څلور شیان تایید کړئ: هغه کلاینټ چې تاسو ته مهم دی واقعاً تونل ته رسېږي، پورټونه یوازې د نومونه فضا مالک خپروي، شخصي نومونه هغه ځای حل کېږي چې تاسو غوښتی و، او د کوربه هغه پته چې loopback نه ده پر هیچا اورېدل نه کېږي. له دوی هر یو په تولید کې په خاموشۍ ناکامېږي، او هر یو پورتنی یو کرښیزه کتنه ده.