يتصل العملاء ويُصادَق عليهم، ثم تغادر حركتهم عبر الوصلة الخطأ، لأن المسار الافتراضي الوحيد على الجهاز يخصّ البوابة نفسها. استبدال ذلك المسار الافتراضي سيكسر تحديثات الجهاز ووصول الإدارة إليه، لذا يجب أن يكون الانتقاء أضيق من «كل الحركة». الشكل القابل للعمل هو قاعدة سياسة مبنية على عنوان المصدر الداخلي لمجموعة العملاء، تشير إلى جدول توجيه ثانٍ يملك الـ WAN البديل. من هناك تصبح قائمة التحقق عن الاكتمال وسلوك الفشل، لا عن القاعدة نفسها.

تأكّد من بقاء عنوان المصدر حتى قرار التوجيه

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

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

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

ابنِ جدول اختيار مكتملاً

الجدول ليس مساراً افتراضياً مع صديق. يحتاج إلى مسارات كافية بحيث يُحلّ كل بحث داخله، بما في ذلك المسار المتصل لشبكة الـ WAN الفرعية كي تكون القفزة التالية قابلة للوصول. لمجموعة 10.77.0.0/24 على tun1، وعنوان WAN هو 203.0.113.20/24 مع قفزة تالية 203.0.113.1، وجدول 600:

ip -4 route replace 203.0.113.0/24 dev usb0 src 203.0.113.20 table 600
ip -4 route replace 10.77.0.0/24 dev tun1 table 600
ip -4 route replace default via 203.0.113.1 dev usb0 table 600
ip -4 rule add priority 1500 from 10.77.0.0/24 lookup 600

تقع القاعدة بأولوية أدنى من أي قاعدة شاملة موجودة، فيصل العملاء المطابقون إلى الجدول 600 أولاً ويمرّ كل شيء آخر إلى الجدول الرئيسي. يصف مرجع ip-rule نموذج البحث المرتّب وصياغة المحدِّد بالكامل.

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

أبقِ حركة المستمع نفسها خارج السياسة

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

يستحق ترشيح المسار العكسي نظرة للسبب نفسه. عندما تغادر الردود إلى العملاء عبر usb0 بينما وصل الطلب عبر رابط آخر، قد يُسقط إعداد rp_filter الصارم حزماً تعتبرها سياسة التوجيه صالحة. افحص قيم sysctl الفعلية على الواجهتين قبل أن تستنتج أن القاعدة فشلت.

الترتيب مهم أيضاً بالنسبة لأي شيء آخر على الجهاز. جسور Docker، وVPN ثانٍ، وأي قواعد موجودة مسبقاً من صورة مزوّد، كلها تضيف أولويات، لذا اقرأ قائمة القواعد كاملة بدل افتراض أن الأولوية 100 وحدها.

اجعل التمرير والترجمة يتفقان مع المسار

التوجيه يختار وصلة؛ ولا يمنح إذناً بالتمرير. يجب أن يكون تمرير IPv4 مُفعَّلاً في النواة، وأن تقبل الجدار الناري اتجاه العميل إلى الـ WAN وحركة العودة. جدول صحيح مع سلسلة FORWARD تُسقط التدفّق يُنتج العَرَض نفسه الذي ينتجه مسار مفقود، ولهذا يُفحص الاثنان في الممرّ نفسه.

إن لم يكن الـ WAN الثاني سيعيد توجيه مجموعة خاصة إليك، فترجم المصدر على ذلك الخروج. لواجهة ذات عنوان ديناميكي، القاعدة الضيقة من نوع masquerade المحصورة في المجموعة والواجهة هي الخيار المعتاد:

iptables -t nat -A POSTROUTING -s 10.77.0.0/24 -o usb0 -j MASQUERADE

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

تحتاج أعباء النفق إلى انتباه أيضاً بمجرد أن تختلف المسارات. إذا تفاوض العملاء على MSS كبير لـ TCP وكان للـ WAN البديل MTU أقل أو نفق داخله، تتوقف المقاطع الكبيرة بينما تعمل الصغيرة. تقييد MSS على مسار التمرير يحوّل ذلك إلى سلوك متوقّع بدل تعليق متقطّع.

قرّر ما يحدث عندما يختفي usb0

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

حيث يكون هذا الرجوع غير مقبول، أضف مساراً نهائياً صريحاً في الجدول 600، مثل مسار افتراضي من نوع blackhole، أو أسقط المجموعة في الجدار الناري ما دامت الواجهة معطّلة. أي من الخيارين قرار يمكنك تدوينه؛ أما الصمت فليس كذلك.

الاستمرارية هي البند الأخير. من يملك كلا الرابطين، سواء كان مدير الشبكة أو سكربت موزّع أو دورة حياة الاتصال، عليه إعادة إنشاء المسارات والقاعدة عند كل إعادة اتصال دون إلحاق نسخ مكررة. تحقّق بطلب من عميل حقيقي وطلب منفصل من البوابة، وأكّد الخروج الملاحَظ في الحالتين، ثم اسحب الـ WAN الثاني وراقب أي النتيجتين التي صمّمتها تحدث فعلاً. يحتاج IPv6 إلى جدوله وقاعدته وترجمته الخاصة؛ قاعدة IPv4 أعلاه لا تقول شيئاً عنه.

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