شبكة WireGuard المتشابكة: القفزة الوسطى لا تستطيع الرد على منفذها
عندما تُرسل القفزة الوسطى كل شيء إلى نفق واحد، تخرج الردود على خدمتها الواردة عبر المسار الخطأ. قاعدة منفذ المصدر عند الواجهة تصلح ذلك.
ثلاث قفزات WireGuard تصل إلى شبكة لا تملك عنوانًا عامًا، وبعد ذلك تتوقف الآلة الوسطى عن الرد على المنفذ الذي كان يُفترض أن تستمع عليه. النفق إلى الأمام لا يزال يعمل، والمضيف البعيد لا يزال يستجيب، والخادم الأوسط وحده هو الذي صمت من الخارج. هذا المزيج مربك تحديدًا لأنه ناتج عن نفسه: القفزة الوسطى تطيع جدول التوجيه الخاص بها، والجدول يرسل ردودها في الاتجاه الخطأ.
سلسلة تعمل حتى تتحدث إلى الصندوق الأوسط
خذ سلسلة توضيحية: العميل A يصل إلى الخادم B على UDP 500، و B يصل إلى الأمام إلى الخادم C على UDP 500. يقبل C حركة المرور فقط من عنوان نظيره الوحيد، ما يجعله ورقة ويُبقي سلوكه بسيطًا. B ليس ورقة، وكل ما هو مثير للاهتمام في هذا العطل يحدث هناك.
التمييز مهم لأن دوري الورقة والوسط يسحبان في اتجاهين متعاكسين. يمكن للورقة أن ترسل كل شيء إلى نفق واحد دون تبعات، لأنه لا شيء آخر يعتمد عليها. القفزة الوسطى هي في الوقت نفسه نقطة نهاية للعملاء وعميل نحو الجانب البعيد، وتلك الوظيفتان تريدان توجيهًا مختلفًا.
لماذا يخرج الرد عبر النفق
على B، تحمل الواجهة المتجهة إلى C AllowedIPs = 0.0.0.0/0 إلى جانب المسار الافتراضي المطابق. لذلك تدخل كل حزمة ينشئها B إلى ذلك النفق ما لم يكن هناك شيء أكثر تحديدًا له الأسبقية.
تصل حزمة من A موجهة إلى B ويُقبل بها، لأن B هو المقصد ويحدث التسليم المحلي أولًا. الرد حزمة جديدة كليًا وُلِّدت محليًا وموجهة إلى عنوان A العام، وذلك المقصد يطابق المسار الافتراضي داخل النفق. يستقبلها C، ولا يملك ذلك العنوان، فيُسقطها.
تبدو الأعراض كمشكلة جدار حماية أو عدم تطابق في المفتاح، ولا شيء من ذلك صحيح هنا. التقاط على النفق المتجه إلى C يُظهر الردود تسير في الاتجاه الخطأ. هذه الملاحظة الواحدة توفر وقتًا أكثر من أي قدر من قراءة الإعدادات، فاكتبها قبل أن تبدأ تغيير المفاتيح. أي شخص لم يرَ الالتقاط سيفترض أن النفق نفسه معطوب.
الإصلاح الضيق: قواعد سياسة تطابق منفذ المصدر
تخرج الردود من مقبس الاستماع في B بمنفذ مصدر 500. يمكن لقاعدة سياسة أن تطابق ذلك وتعيد توجيه تلك الحزم إلى الجدول العادي:
ip rule add sport 500 table main priority 100
ip rule add sport 8080 table main priority 101
تُستشار قواعد السياسة بترتيب الأولوية، والجدول الرئيسي يقع عند 32766، لذا تُسأل قاعدة عند 100 قبل أن يحق للمسار الافتراضي للنفق أن يقول كلمته. أضف إدخالًا واحدًا لكل منفذ يجب أن يبقى قابلًا للوصول من الخارج ولا شيء أكثر، حتى تبقى حركة المرور المُمرَّرة تستخدم النفق الذي بُنيت من أجله.
اعرف حدود هذه الحيلة. محدد sport يطابق الحزم المولدة محليًا، وهو يغطي بالضبط حالة الرد ولا يغطي عمدًا حركة المرور التي يمررها B لمصلحة شخص آخر. الخدمة المستضافة خلف B لا تزال بحاجة إلى ردها الخاص، والتظاهر بغير ذلك ينتج إصلاحًا يعمل للخدمة الأولى ويفشل للثانية.
امنح القاعدة مالكًا
القاعدة المكتوبة في سطر الأوامر تختفي في المرة القادمة التي تُعاد فيها بناء الواجهة. في إعداد WireGuard، ضعها حيث تُنشأ الواجهة وتُزال:
PostUp = ip rule add sport 500 table main priority 100
PostDown = ip rule del sport 500 table main priority 100
إذا كان NetworkManager أو خطاف توزيعة أو نقطة إدخال حاوية يملك الواجهة، فإن الزوج ينتمي إلى ذلك المالك بدلًا من ملف يُحرَّر يدويًا. تحقق من القواعد الفعالة بعد إعادة الاتصال، لا بعد التشغيل الأول فقط، لأن التشغيل الأول هو الحالة التي تعمل دائمًا.
قارن البدائل بصدق
قاعدة منفذ المصدر واحدة من أربعة مخارج، وهي أضيقها. لها ميزة أنها لا تمس سياسة النفق إطلاقًا، ولهذا تميل إلى البقاء بعد التغييرات اللاحقة. الإصلاحات الضيقة تفشل أيضًا بصوت عالٍ عندما تتوقف عن الانطباق، بينما يستمر الاستثناء الواسع في العمل بهدوء بعد وقت طويل من اختفاء السبب. ذلك الفرق يهم أكثر من الأناقة عندما يملك شخص آخر الصندوق بعد سنتين.
| Approach | What it costs | Where it breaks |
|---|---|---|
| Source-port policy rule | One rule per exposed port | Anything B forwards rather than originates |
| Destination exception route | A route pinned to specific client addresses | Clients whose address changes |
| Stop full-tunnelling on B | Loses the catch-all path toward C | Designs that depend on it |
| Split into two tunnels | More interfaces and more policy | Nothing, at the cost of complexity |
تحقق من الطرفين بعد أن تختار. من A، ابدأ اتصالًا بمنفذ B وأبقه مشغولًا لفترة. على B، اجعل النواة تبرر مسار الرد بشيء مثل ip route get <address-of-A> sport 500، وأكد أنه يذكر واجهة WAN بدلًا من النفق. بعد ذلك، تحقق من أن شيئًا خلف C لا يزال يرد عبر السلسلة، مما يثبت أن الاستثناء بقي ضيقًا بدلًا من أن يتحول إلى تجاوز. أخيرًا، سجّل المنافذ في ملاحظات التصميم، وإلا سيكتشف المشغل التالي هذا في خدمة مختلفة.