يفشل تركيب عميل OpenVPN ثانٍ على مضيف Linux واحد في أحد موضعين. إما ألا يستطيع العميل الداخلي الوصول إلى خادمه لأن النفق الخارجي استحوذ على ذلك النقل، وإما أن يعيد العميل الثاني كتابة جدول المسارات فيتوقف النفق الأول عن العمل. المشكلتان كلتاهما في التوجيه لا في التشفير، وكلتاهما تُحلَّان قبل أن يحمل النفق الجديد أي حركة تطبيقات. العناوين هنا توضيحية: tun0 هو النفق الخارجي، و203.0.113.9 هو الخادم الداخلي، وTCP 9999 هو التدفق الذي يجب أن يستخدم المسار الداخلي.

نمطا فشل، وجدول توجيه واحد

يفتح العميل الداخلي مقبس UDP إلى خادمه، وذلك المقبس يتبع جدول المسارات الحالي كأي مقبس آخر. إذا كان النفق الخارجي يملك المسار الافتراضي بالفعل، فإن حزم المصافحة تدخل النفق الخارجي. ولا ينجح ذلك إلا عندما يستطيع الخادم الخارجي الوصول إلى الخادم الداخلي ويوافق الطرف الآخر على حمل التدفق؛ وإلا تتوقف المصافحة ويعيد العميل المحاولة.

يأتي الفشل الثاني من دفع الخادم. الدفع المعتاد هو 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

معظم الإخفاقات في هذه المجموعة من القواعد تأتي من خطأين. قيمة العلامة التي يضعها جدار الحماية والقيمة التي تطابقها القاعدة يجب أن تكونا متطابقتين، لأن عدم التطابق لا ينتج خطأ ولا أثرًا. كذلك لا يرى PREROUTING إلا الحزم القادمة من الخارج، لذلك يحتاج اتصال يبدأ على هذا المضيف إلى قاعدة OUTPUT بالمطابقة نفسها قبل أن يُعلَّم أصلًا.

انزع ملكية المسارات من العميل الثاني

هناك خياران يمنعان العميل الثاني من تعديل الجدول، وهما يعملان في نقطتين مختلفتين. يتجاهل route-nopull خيارات المسار المدفوعة، فلا يُثبَّت شيء. أما route-noexec فيقبل الخيارات المدفوعة في بيئة العميل لكنه يترك تغيير الجدول لخطاف، وهو ما تريده عندما تحتاج إلى رؤية ما عرضه الخادم.

يعمل الخطاف بالقيم المدفوعة في بيئته، وينبغي ألا يضيف إلا المدخلات التي وافقت عليها. اجعله عديم الأثر عند التكرار: أفرغ الجدول الذي يملكه قبل إعادة البناء، ولا تفترض أن التشغيل السابق ترك حالة نظيفة. إعادة الاتصال تستدعي الخطاف مرة أخرى، والخطاف الذي يضيف دون مسح سيجمّع مسارات مكررة.

اختر مالكًا واحدًا واكتبه. الملف الشخصي الذي يضبط الخيارين، أو الخطاف الذي ينافس نصًا يدويًا، ينتج جدولًا لا يستطيع أحد شرحه لاحقًا.

ثبّت عنوانَي الخادمين

يحتاج الخادم الداخلي إلى مسار مضيف عبر الجهاز الخارجي قبل أن يتصل العميل الداخلي. ذلك المدخل هو ما يبقي النقل الداخلي داخل النفق الخارجي بدل أن يتركه يتبع الافتراضي.

ip route add 203.0.113.9/32 dev tun0
ip route get 203.0.113.9

أضف مسار مضيف مطابقًا للخادم الخارجي في الجدول الرئيسي أيضًا، وإلا فقد توجّه إعادة الاتصال نقل العميل الخارجي نفسه إلى نفقها الخاص. الترتيب ليس اختياريًا: أضف هذه المدخلات بعد وجود الواجهة المعنية، أي عبر خطاف أو نص يعمل بعد الاتصال. المسار الذي يشير إلى جهاز متوقف يُزال أو يُتجاهل، لذا لا ينجو مدخل يُكتب عند الإقلاع من التسلسل الذي افترضته.

افحص البحث بدل قراءة الجدول كله. يُسمّي ناتج بحث المسار الجهاز وعنوان المصدر الذي سيستخدمه النواة، وهو بالضبط ما يحصل عليه العميل عندما يفتح مقبسه.

اختبر السلسلة واجعل الفشل مرئيًا

التقط على الواجهة الخارجية بينما يتصل العميل الداخلي. ينبغي أن تظهر المصافحة الداخلية كحمولة مشفرة داخل النفق الخارجي؛ فإذا ظهرت كـ UDP عادي إلى 203.0.113.9، فمسار المضيف مفقود والسلسلة لم تُبنَ أصلًا.

السلسلة التي ترتد بصمت إلى الوصلة الفيزيائية هي أسوأ نتيجة، لأن حالة الواجهة لا تعلن شيئًا والحركة الداخلية تخرج من عنوان مصدر خاطئ. إذا كان بإمكان العميل الثاني إعادة الاتصال مباشرة عند سقوط النفق الخارجي، فعطّل ذلك المسار أو اربطه بالواجهة الخارجية حتى يصبح الفشل مرئيًا.

أنهِ بتدفقين وتفريغ واحد للقواعد: اتصال معلّم وآخر غير معلّم ينبغي أن يسلكا مسارين مختلفين، وينبغي أن يعرض ip rule show الأولوية التي قصدتها. إذا سلك التدفقان المسار نفسه، فالعلامة لا تُطبَّق حيث تظن.

مقالات ذات صلة