د یو Linux کوربه په سر دوه OpenVPN کلاینټونه د fwmark سره ونښلوئ
دواړه کلاینټونه ډیفالټ لار غواړي. دننی سرور په کوربه لار ټینګ کړئ، دویم کلاینټ له جدولونو بیا لیکلو منع کړئ، بیا د fwmark سره بهیرونه سمول کړئ.
په یو Linux کوربه د دویم OpenVPN کلاینټ زېرمه کول په دوو له یوې ځای کې ناکامېږي. یا دننی کلاینټ خپل سرور ته نه شي رسېدلی ځکه بهرني تونل هغه لېږد نیولی دی، یا دویم کلاینټ د لارو جدول بیا لیکي او لومړی تونل له کاره لوېږي. دواړه ستونزې په لارښوونه کې دي، نه په کوډ کې، او دواړه مخکې له دې حل کېږي چې نوی تونل کومه غوښتنلیک ترافیک وړي. دلته پتې بېلګې دي: tun0 بهرنی تونل دی، 203.0.113.9 دننی سرور دی، او TCP 9999 هغه بهیر دی چې باید دننۍ لار وکاروي.
دوه د ناکامۍ بڼې، یو د لارو جدول
دننی کلاینټ خپل سرور ته UDP ساکټ پرانیزي، او هغه ساکټ لکه هر بل د اوسني لارو جدول پیروي کوي. که بهرنی تونل لا دمخه ډیفالټ لري، د لاس ورکولو کڅوړې بهرني تونل ته ځي. دا یوازې هغه وخت کار کوي چې بهرنی سرور دنني سرور ته ورسیږي او بل لوري د بهیر وړلو ته ومني؛ که نه، لاس ورکول بندېږي او کلاینټ بیا هڅه کوي.
دویمه ناکامي د سرور له push څخه راځي. معمول push د redirect-gateway def1 دی، چې د ډیفالټ لار د بدلولو پر ځای 0.0.0.0/1 او 128.0.0.0/1 نصبوي. نو هغه دوه کلاینټونه چې هر یو خپله /1 جوړه نصبوي یو بل ته ورټکرېږي، او نوې جوړه تقریباً هر منزل لپاره ګټي. کله چې دویم وروسته تونل مړ شي، په جدول کې هغه دوه مختګونه وګورئ، ځکه کېدای شي ډیفالټ لار پخپله هېڅکله نه وي بدله شوې.
بهیر په نښه کړئ او هغه ته جدول ورکړئ
ټاکل شوی ترافیک د mangle جدول کې په نښه کولو او په پالیسي قاعده کې د هغې نښې سره سمون کولو له لارې سمول کړئ. قاعده هغه ځانګړي جدول ته اشاره کوي چې ډیفالټ لار یې دننی وسیله ده، نو یوازې نښه شوې کڅوړې دننۍ لار اخلي.
iptables -t mangle -A PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999
ip rule add fwmark 0x9999 table 200 pref 1000
ip route add default dev tun1 table 200په دې قاعده ټولګه کې ډېری ناکامۍ له دوو تېروتنو راځي. د firewall ټاکل شوې نښې ارزښت او هغه ارزښت چې قاعده سره سمون کوي باید یو شان وي، ځکه توپیر نه تېروتنه او نه اغېزه ورکوي. او PREROUTING یوازې له بېخي راغلې کڅوړې ویني، نو په دې کوربه پیل شوې اړیکه مخکې له نښه کېدو د همدې سمون OUTPUT قاعدې ته اړتیا لري.
د لارو مالکیت له دویم کلاینټ څخه واخلئ
دوه انتخابونه دویم کلاینټ له جدول سمولو منع کوي، او دواړه په بېلو ټکو کار کوي. route-nopull push شوې د لارې انتخابونه نه ګوري، نو هېڅ نه نصبېږي. route-noexec push شوې انتخابونه د کلاینټ چاپېریال ته مني خو د جدول بدلون hook ته پرېږدي، او دا هغه څه دي چې تاسو یې غواړئ کله چې باید وګورئ سرور څه وړاندې کړل.
Hook د push شوو ارزښتونو سره په خپل چاپېریال کې ځي، او باید یوازې هغه ننوتنې اضافه کړي چې تاسو منلې دي. دا idempotent کړئ: مخکې له بیا جوړولو هغه جدول چې د هغه ملکیت دی تش کړئ، او مه فکر کوئ چې پخواني چلېدنه پاک حالت پرېښی دی. بیا نښلېدنه hook بیا غواړي، او هغه hook چې پرته له پاکولو اضافه کوي تکراري لارې غونډوي.
یو مالک وټاکئ او ولیکئ یې. هغه پروفایل چې دواړه انتخابونه ټاکي، یا hook چې له لاسي سکریپټ سره سیالي کوي، داسې جدول جوړوي چې وروسته یې هیڅوک نه شي تشریح کولی.
دواړه سرور پتې ټینګې کړئ
مخکې له دې چې دننی کلاینټ ونښلي، دنني سرور ته د بهرنۍ وسیلې له لارې کوربه لار ته اړتیا ده. همدا ننوتنه دننی لېږد په بهرني تونل کې ساتي پرځای د دې چې ډیفالټ ته یې پرېږدي.
ip route add 203.0.113.9/32 dev tun0
ip route get 203.0.113.9په اصلي جدول کې د بهرني سرور لپاره هم سمون کوربه لار اضافه کړئ، که نه بیا نښلېدنه کولای شي د بهرني کلاینټ خپل لېږد خپل تونل ته ورواړوي. ترتیب اختیاري نه دی: دا ننوتنې وروسته له دې اضافه کړئ چې اړوند انټرفیس شته، یعنې هغه hook یا سکریپټ چې له نښلېدو وروسته ځي. هغه لار چې بندې وسیلې ته اشاره کوي لرې کېږي یا نه ګڼل کېږي، نو هغه ننوتنه چې د پیل پر مهال لیکل شوې تاسو هغه ترتیب نه شي زغملای چې فکر یې کوئ.
د ټول جدول لوستلو پرځای پلټنه وګورئ. د لارې پلټنې پایله هغه وسیله او سرچینه پته نوموي چې kernel به یې کاروي، او دا هغه څه دي چې کلاینټ یې د خپل ساکټ پرانیستلو پر مهال ترلاسه کوي.
زنځیر وآزموئ او ناکامي ښکاره کړئ
کله چې دننی کلاینټ نښلي، په بهرني انټرفیس کې نیول وکړئ. دننی لاس ورکول باید په بهرني تونل کې د کوډ شوي بار په توګه ښکاره شي؛ که د 203.0.113.9 ته ساده UDP په توګه ښکاره شي، کوربه لار نشته او زنځیر هېڅکله نه دی جوړ شوی.
هغه زنځیر چې په غاړه فزیکي uplink ته بېرته وګرځي ترټولو بد پایله ده، ځکه د انټرفیس حالت هېڅ نه اعلانوي او دننی ترافیک له غلطې سرچینې پتې وځي. که بهرنی تونل لوېدو پر مهال دویم کلاینټ کولای شي مستقیم بیا ونښلي، هغه لار بنده کړئ یا یې بهرني انټرفیس ته وتړئ چې ناکامي ښکاره شي.
له دوو بهیرونو او یوې قاعدې ډمپ سره پای ته ورسئ: نښه شوې او نه نښه شوې اړیکې باید بېلې لارې واخلي، او ip rule show باید هغه لومړیتوب ولیکي چې تاسو یې غوښتلی و. که دواړه بهیرونه یوه لار واخلي، نښه هغه ځای نه تطبیقېږي چې تاسو فکر کوئ.