څنګه یوازې د Docker کانټینرونو ترافیک د OpenVPN له لارې رېوټ کړو
کوربه په خپل عادي اپلینک کې پرېږدئ او یو کانټینر فرعي شبکه په تونل کې کېږدئ: د NAT ترتیب، د سرچینې قواعد، OpenVPN iroute او د MSS ګوتنې.
د کانټینر بسته هیڅکله tun0 ته نه رسیږي او په کانټینر باندې اضافي وړتیاوې دا نه بدلوي۔ د میلمه او تونل ترمنځ دوه د لارې لټونونه دي: یو د میلمه د شبکې د نومونو په فضا کې، یو په کوربه باندې وروسته له هغې چې چوکاټ پر پله کښېني، او دویم له بل جدول څخه چې بېلې سمون قواعد لري پوښتنه کوي۔ زما مرجع ترتیب یو Linux کوربه دی چې پرې OpenVPN کلاینټ چلیږي، هغه 10.8.0.10 په tun0 باندې ساتي، 172.18.0.0/16 کې Docker پله، او یو شخصي پته چې یوازې د تونل خوا ورته رسیږي۔ هدف تنګ پاتې کیږي: هغه میلمه فرعي شبکه له تونل څخه وځي، کوربه خپل عادي اپلینک ساتي۔
د VPN کلاینټ په کانټینر کې چلول بېل ډیزاین دی، لنډه لار نه۔ بیا کانټینر خپل تونل او خپل اسناد لري، او کار له iptables څخه Dockerfile ته ځي۔
لېږدول د منزل له مخې لاره ټاکي، بیا NAT سرچینه بیا لیکي
کله چې net.ipv4.ip_forward=1 ټاکل شوی وي، لېږدول شوې بسته په اصلي جدول کې یوازې د منزل له مخې رېوټ کیږي۔ سرچینه په دې پرېکړه کې هېڅ رول نه لري۔ یوازې وروسته له دې چې لاره وټاکل شي، کرنل POSTROUTING چلیږي، او هم هلته د Docker خپله قاعده ده: -s 172.18.0.0/16 ! -o br-appnet -j MASQUERADE۔ هر څه چې پله پرېږدي او بل انټرفېس ته ځي ژباړل کیږي، او هغه پته چې جوړیږي په هغه انټرفېس پورې اړه لري چې لاره یې هلته لېږلې وه۔
دا قاعده زما څخه پوښتل شوې ډېری نښې تشریح کوي۔ که اصلي جدول کې د شخصي منزل لپاره لاره نه وي، بسته د کوربه فزیکي پتې سره اپلینک ته وځي۔ ستاسو چمتوکوونکی منزل غورځوي، یا لرې سایټ هغه RFC 1918 سرچینه غورځوي چې هېڅکله یې تمه نه درلوده، او تونل پورته او روغ پاتې کېدو سره کانټینر وخت تېریږي۔ tun0 باندې نیول هېڅ نه ښیي، او دا هغه نښه ده۔ که لاره رښتیا tun0 ته اشاره وکړي، MASQUERADE سرچینه 10.8.0.10 ته بیا لیکي، او هماغه کانټینر پرته له دې چې تاسو څه ونیسئ کار کوي۔
هغه لټون وغواړئ چې د میلمه سرچینه نوموي۔ پرته له from او iif کوربه د خپل ساکټ لپاره ځواب ورکوي او هغه لار راپور کوي چې لېږدول شوې بسته به هېڅکله ونه نیسي:
ip route get 192.168.11.222 from 172.18.0.5 iif br-appnetکه هغه ځواب اپلینک ونوموي، تونل په انځور کې نه دی او د تونل خوا هېڅ ترتیب مرسته نه کوي۔
میلمه د تونل خپلې پتې ته یوسئ
تر ټولو کوچنی کار کوونکی بدلون په وتلو کې روښانه سرچینه بیالیکنه ده۔ هغه دننه کړئ نه چې پای ته یې ضمیمه کړئ: Docker لا دمخه د POSTROUTING په سر کې ناست دی، نو هغه قاعده چې د -A سره ورزیاتېږي د Docker له قاعدې وروسته ارزول کیږي او هېڅکله نه چلیږي۔
iptables -t nat -I POSTROUTING 1 -s 172.18.0.0/16 -o tun0 -j SNAT --to-source 10.8.0.10دوه شرطونه پرېکړه کوي چې دا به ويښ وي که نه۔ پته باید هغه وي چې کلاینټ یې رښتیا لري، نو د هر کلاینټ لپاره د ifconfig-push 10.8.0.10 255.255.255.0 لرونکې ننوتنې سره یې ټینګ کړئ؛ هغه قاعده چې هغه پته ونوموي چې هېڅکله نه ده وټاکل شوې، غلطي نه بلکې غلې ډوبېدل جوړوي۔ او لرې خوا باید هغه سرچینه ومني او ځوابونه بېرته ورلېږي، ځکه چې هلته د اجازې لیست د میلمه فرعي شبکې نه بلکې د تونل پتې نوم اخلي۔ کله چې د کلاینټ پته متحرک وي، -j MASQUERADE سره -o tun0 هغه څه تعقیبوي چې انټرفېس یې لري، خو د لرې پالیسۍ په بیه چې پر ضد یې ثابته ارزښت نه شئ لیکلی۔
فلټرول بل نیم دی۔ Docker FORWARD پالیسي drop ته ټاکي او د هر ډیمون بیا پیل په وخت کې خپلې زنځیرې تشوي، نو سیمه ییزه پالیسي DOCKER-USER کې کېږدئ، کومه چې ژوندی پاتې کیږي:
iptables -I DOCKER-USER -i br-appnet -o tun0 -j ACCEPT
iptables -I DOCKER-USER -i tun0 -o br-appnet -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTد بېرته راتلو قاعده مهمه ده: tun0 ته رسېدونکی ځواب د پل له لارې پرانیستل شوې اړیکې لپاره یوازې ځکه نه منل کیږي چې د وتلو لوری ومنل شوی و۔
کوربه د سرچینې قاعدې سره مستقیم وساتئ
کله چې ټول پل باید تونل وکاروي خو په کوربه باندې بل څه نه، NAT پرېږدئ او هغه سرچینې ته خپل جدول ورکړئ۔ میلمه پتې بیا له سره تر پایه ښکاره وي۔
echo "200 vpnbox" >> /etc/iproute2/rt_tables
ip rule add from 172.18.0.0/16 lookup vpnbox pref 1000
ip route add default dev tun0 table vpnboxقواعد د اصلي جدول څخه دمخه کتل کیږي، او from له سرچینې سره سمون خوري۔ د تونل خپل بهرني بستې د کوربه فزیکي سرچینه وړي، نو هغوی هېڅکله from 172.18.0.0/16 سره سمون نه خوري او تونل نه شي کولی ځان بېرته خپل ځان ته رېوټ کړي۔ همدا ځان-ایستل ترتیب ثابتوي۔
د بېرته راتلو لاره اوس مرستې ته اړتیا لري۔ لرې خوا نه ژباړل شوې 172.18.0.x ویني او هېڅ دلیل نه لري چې پوه شي چېرته اوسیږي۔ په سرور باندې د هر کلاینټ فایل iroute 172.18.0.0 255.255.0.0 ته اړتیا لري تر څو د سرور داخلي جدول هغه پریفکس دې کلاینټ ته ورکړي، او تېل شوی route 172.18.0.0 255.255.0.0 ته اړتیا لري تر څو نور کلاینټان پوه شي چې شتون لري۔
له باور دمخه دوه ګوتنې۔ وچلوئ ip route show default : د redirect-gateway def1 سره جدول 0.0.0.0/1 او 128.0.0.0/1 لري tun0 له لارې، او کوربه هېڅ مستقیم نه دی، ځکه چې هغه نیم-ډیفالټونه default پرته له بدلولو ګټي۔ ip rule add سره ورزیات شوي قواعد هم د بیا پیل په وخت کې ورکېږي، نو هغوی په up سکریپټ کې وړئ۔
د بستې اندازه دویمه ناکامي ده چې تاسو ورسره مخامخ کیږئ
د 1500 بایټ پل انټرفېس تونل ته له خپل ظرفیت ډېر ورکوي کله چې بهرني UDP او IP سرلیکونه ورزیات شي۔ کوچني تبادلې تېریږي، نو DNS حل کیږي او TLS لاس ورکول بشپړیږي، بیا لوی اپلوډ پرته له هېڅ غلطي چېرته هم ځړیږي۔ لېږونکی هماغه د برخې اندازه تکراروي، ځکه چې د ICMP د ټوټه کېدو اړتیا پیغام، چې وبه ویل چې کوچنی شې، هېڅکله نه رسیږي۔
د انټرفېس، MSS یا دواړو په کچه یې سم کړئ۔ کلپ کول د میلمه له خوا هېڅ همکاري نه غواړي:
ip link set dev tun0 mtu 1400
iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtuکلپ یوازې TCP بیا لیکي۔ UDP، QUIC په ګډون، پرځای یې د میلمه ټیټ انټرفېس ته اړتیا لري، د --opt com.docker.network.driver.mtu=1400 سره د شبکې جوړولو په وخت یا د سمون compose کیلي سره۔
DNS او هغه ګوتنې چې د تکرار وړ دي
د نومونو حل هماغه لاره تعقیبوي۔ د Docker دننه ریزالور 127.0.0.11 کې د کوربه ترتیب شوو سرورونو ته لېږدوي، نو کانټینر هغه څه میراث اخلي چې کوربه یې کاروي۔ کله چې شخصي زون یوازې هغه ریزالور ځوابوي چې د تونل له لارې ورته رسیږي، میلمه هغې پتې ته وګرځوئ، او د getent hosts سره د کانټینر په دننه کې وازموئ، نه په کوربه باندې۔
- ناکامه غوښتنه د میلمه په دننه کې وچلوئ؛ د کوربه خوا ازموینه بله سرچینه پته کاروي او ستونزه پټوي۔
- هغه شمارونکي ولولئ چې تاسو ورزیات کړي NAT او فلټر قواعد یې لري۔ د صفر سمون قاعده د رېوټینګ غلطي ده، د پالیسۍ نه۔
- تایید کړئ چې ستاسو د SNAT قاعدې کې د تونل پته هغه ده چې کلاینټ یې رښتیا لري۔
- د بندېدو لپاره سرور ملامت کولو دمخه د میلمه MTU کموئ یا MSS کلپ کړئ۔
لیست ته ښکته لاړ شئ او په لومړنۍ ناکامۍ ودرېږئ۔ هماغه پوړ باید سم شي؛ هر څه چې لاندې ورزیات شي یوازې هغه پوله پټوي چې ماتیږي۔