ستاسو د تونل کانټینر کار کوي، docker compose exec vpn curl -s https://ifconfig.me د چمتو کونکي پتې سره ځواب ورکوي، خو ستاسو د ډیسکټاپ براوزر لا هم ستاسو د ISP له لارې وتل کوي. دا توپیر تمه کېدونکی دی. هغه کانټینر چې VPN کلاینټ چلوي د شبکې نومونه فضا، لارې او د تونل انټرفیس لري، او هغه څه نه لري چې HTTP یا SOCKS وایي؛ پر هغه د پورټ خپرول هغه اورېدونکی نشي جوړولی چې هېڅکله نه و.

کلاینټ چېرې چلیږي هغه ډیزاین ټاکي. ګاونډی کانټینر کولای شي د تونل نومونه فضا ته لاړ شي، ډیسکټاپ اپلیکیشن نشي کولای، او روټر ته لارې غواړي نه د پروکسي ساحه. که نقشه غلطه وي، نښه هماغه ده: اړیکه رد شوه، یا هغه ټرافیک چې په خاموشۍ زړه لار نیسي.

ترتیبات د کلاینټ د چلېدو له ځایه سره سم کړئ

د Compose له سمون مخکې یوه پوښتنه وکړئ: ایا کلاینټ د VPN کانټینر د شبکې نومونه فضا په داخل کې پیل کېدای شي؟ هر هغه څه چې دمخه د Linux کانټینر په توګه چلیږي کولای شي. ستاسو پر مېز براوزر، IDE یا CLI نشي کولای، ځکه د هغه پروکسي تنظیم د پروتوکول خدمت تمه کوي، نه نومونه فضا.

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

دا درې نه ګډېږي. د کانټینر د پل پتې ته اشاره کوونکې 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 نه ده پر هیچا اورېدل نه کېږي. له دوی هر یو په تولید کې په خاموشۍ ناکامېږي، او هر یو پورتنی یو کرښیزه کتنه ده.

اړوندې مقالې