عميل WireGuard لا يستطيع الوصول إلى عميل OpenVPN؟
يرتفع النفقان وتموت ping المتقاطعة. أصلح تغطية الوجهة وملكية المصدر ومسار العودة دون جسر بين البروتوكولين.
يتصل النفقان، ويستطيع كل عميل الوصول إلى البوابة، وفي اللحظة التي يحاول فيها أحدهما عنوان الآخر تختفي الحزم. لا شيء في أي من المصافحتين خطأ، ولا يغيّر ذلك أي قدر من إعادة إصدار المفاتيح. البوابة تحمل حزم IP عادية غير مشفّرة بين اثنين من واجهاتها، لذا لا يلزم أن يفهم البروتوكولان أحدهما الآخر أبدًا؛ ما يلزمهما هو ثلاثة أشياء لا توفّرها أي مصافحة. تغطية الوجهة على العميل المنشئ، وملكية المصدر عند البوابة، ومسار عودة على الطرف البعيد. العَرَض واحد في الحالات الثلاث، ولهذا تُشخَّص معًا.
العَرَض ينقصه جزء واحد في كل مرة
يستخدم هذا التصميم مجموعة WireGuard من 10.71.0.0/24 على wg1 ومجموعة OpenVPN من 10.72.0.0/24 على tun1، وكلتاهما تنتهيان عند بوابة واحدة. الطلب قيد الاختبار يجري من 10.71.0.5 إلى HTTPS على 10.72.0.30. كل خطوة أدناه تتعلق بذلك المسار الواحد. لكل فحص بصمة فشل مختلفة رغم أن المستخدم يعيشها بالطريقة نفسها، وعادةً ما يكون واحد فقط من الثلاثة ناقصًا في كل مرة.
ابدأ بتأكيد أن المجموعتين موجودتان فعلًا على هذه البوابة وأن إعادة التوجيه مفعّلة في النطاق الذي تعيش فيه الأنفاق. البوابة التي تنهي البروتوكولين في نطاقين مختلفين لا تمرّر شيئًا بينهما، ويستحق ذلك استبعاده قبل قراءة أي إعداد للنظير.
وسّع تغطية الوجهة عند الفرع
على عميل WireGuard، يجب أن يختار إدخال النظير القائم البوابة من أجل وجهة OpenVPN، ما يعني أن بادئة الوجهة يجب أن تظهر في قائمة المسموح بها لذلك النظير. إضافتها لا تنشئ نفقًا ثانيًا؛ بل تغيّر النظير الذي يختاره العميل عند البحث عن ذلك العنوان، ومع wg-quick يتبع المسار القائمة تلقائيًا عادةً.
AllowedIPs = 10.71.0.0/24, 10.72.0.0/24
اترك سطري المفتاح والنقطة الطرفية الحقيقيين دون تغيير، وتذكّر أن مديرًا يستخدم Table = off لا يأخذ أي مسار من هذه القائمة إطلاقًا. في تلك الحالة يجب تثبيت البادئة نفسها في جدول مسارات النظام بواسطة الجهة التي تملكها، والمسار الناقص هناك يبدو تمامًا كبادئة مسموح بها ناقصة.
أبقِ ملكية المصدر على البوابة
يجب أن يظل إدخال النظير الخاص بهذا العميل على البوابة مالكًا لعنوان مصدر ذلك العميل بالضبط. تُفحص العناوين المسموح بها في الاتجاهين: فهي تختار نظيرًا لحركة المرور الصادرة وتتحقق من أن مصدر الحزمة الواردة يخص النظير الذي أرسلها. ووضع مجموعة OpenVPN في إدخال الفرع لأن الفرع يريد الوصول إليها هو الخطأ الذي يدفع الحركة نحو مشارك خاطئ.
AllowedIPs = 10.71.0.5/32
اقرأ ذلك الإدخال كبيان ملكية لا كتسهيل توجيه. أي شيء آخر يحتاج العميل للوصول إليه ينتمي إلى قائمة وجهات العميل، لا إلى تصوّر البوابة لما يُسمح لهذا النظير بإرساله.
امنح جانب OpenVPN مسار عودة
يحتاج الهدف الآن إلى مسار عائد إلى مصدر WireGuard، وبالنسبة للعملاء المجمّعين يصل ذلك عادةً كمسار مدفوع من خادم OpenVPN. ادفعه فقط إلى العملاء الذين ينبغي أن يملكوه، وتأكد على العميل من قبوله بدلًا من افتراض تطبيق التوجيه.
push "route 10.71.0.0 255.255.255.0"
توزيع المسارات ليس تخويلًا. عندما تقع الوجهة خلف عميل OpenVPN آخر بدلًا من أن تكون في المجموعة، تنضم ملكية ذلك العميل لشبكته المحلية ومتطلبات إعادة التوجيه لديه إلى التصميم، والمسار المدفوع ليس سوى النصف الأول. أعد صياغة المتطلب كرسم بياني قبل إضافة التوجيهات: أي عقدة تملك أي بادئة، وأي عقدة تمرّر نحوها.
اسمح بالخدمة الواحدة التي قصدت السماح بها
مع تفعيل إعادة التوجيه وقابلية توجيه المجموعتين، يبقى سؤال السياسة. اكتب القاعدة للمسار المحدد لا لزوج الواجهات عمومًا، وعاينها قبل تطبيقها، وأبقِ مسار العودة الحافظ للحالة كي لا تُحجب الردود كاتصالات جديدة. التشغيل التجريبي لا يكلّف شيئًا ويُظهر بالضبط ما سيُضاف.
sudo ufw --dry-run route allow in on wg1 out on tun1 proto tcp from 10.71.0.5 to 10.72.0.30 port 443
هذه قواعد معاد توجيهها، متميزة عن قواعد الاستماع الخاصة بالبوابة لخدمتي VPN. فتح منافذ UDP الخارجية لا يخوّل الطلب الداخلي، وتخويل الطلب الداخلي لا يتطلب SSH غير مقيّد إلى البوابة ولا سماحًا افتراضيًا في إعادة التوجيه. يجب أيضًا أن يتفق جدار الحماية الخاص بالهدف وعنوان استماعه، لأن خدمة مرتبطة بـ loopback ترفض الحزمة الأكثر عناية في التوجيه. السياسة التي تغطي اتجاهًا واحدًا فقط من المحادثة تفشل عادةً بطلب ناجح وردّ صامت، وهو أكثر النتائج الثلاث إرباكًا.
المسارات المتبادلة تعني عادةً أنه لا حاجة إلى ترجمة المصدر، ما يحفظ عنوان WireGuard عند الهدف ويجعل السجلات مقروءة. لا تُضف تمثيلًا شاملًا لأن بروتوكولين معنيان، ولا تحذف قاعدة ترجمة قائمة دون معرفة ما يعتمد عليها. ثم تحقّق من المسار الواحد من طرف إلى طرف، واختبر أيضًا مصدرًا أو منفذًا غير مسموح: مصافحة ناجحة على كل جانب لا تثبت المسار المتقاطع ولا العزل.