OpenVPN خلف stunnel: وجّه الغلاف لا المنفذ 1194
مستمعان وثلاثة منافذ. تحقّق من أين تصل إعادة التوجيه، وأين يرتبط الغلاف، وأين يتصل، وما تجاوزه اختبار محلي، ومن الهويتين.
ضع غلاف TLS أمام OpenVPN فتصبح للنشر مستمع ثانٍ، لا ينبغي أن يواجه الإنترنت إلا واحد منهما. عندما يعمل النفق من الجهاز نفسه ويفشل من الخارج، تكون إعادة التوجيه عادةً موجَّهة إلى المنفذ الخطأ من الاثنين. ما يجب أن يصطف هو سلسلة: القاعدة العامة تصل إلى الغلاف، واتصال الغلاف الخلفي الخاص به يصل إلى مقبس VPN الحقيقي. أربع قفزات تحمل تلك السلسلة، وأي منها يمكن أن ينهي التحقيق مبكرًا.
مقبسان، ومالكان، وأحدهما عام
ينهي الغلاف TLS للاتصال الخارجي ويمرر تدفق البايتات المفكوك إلى مستمع OpenVPN TCP عادي. هذان مقبسان منفصلان بملفات تكوين منفصلة، لذا فإن تعديل أحدهما يترك الآخر دون مساس ويبدو سليمًا. ويعني ذلك أيضًا أن الاثنين قد ينحرفان عن بعضهما كلما غُيّر أحدهما دون الآخر.
العمل من الجهاز نفسه لا يثبت إلا القليل عن المسار العام. الاتصال المباشر بالمنفذ الأصلي يتخطى الغلاف، والاتصال بالغلاف على عنوان LAN الخاص به يتخطى الترجمة، والترتيب الكامل من جهة العميل وحده هو الذي يمارس ما يفعله المستخدم الخارجي. كذلك يجب قراءة الأسماء بعناية، لأن localhost يعني المضيف الذي يشغّل ذلك المكوّن بعينه، لا المضيف الذي تكتب عليه صدفةً. احتفظ بهذا التمييز في ملاحظاتك، لأن اختبارًا مسجَّلًا دون القفزة التي غطّاها يدعو إلى مقارنة بين شيئين مختلفين.
أين تصل إعادة التوجيه فعليًا
السلسلة أسهل في الإمساك كأربع قفزات منها كثلاثة أرقام منافذ، لأن الرقم نفسه قد يعني أشياء مختلفة في كل طرف. اقرأ الجدول صفًا صفًا: كل صف هو مقبس واحد عليه أن يقبل اتصالًا ثم يفتح التالي. عندما يُوجَّه صف إلى النظير الخطأ، تكون العَرَض في العمود الأخير هو ما يبلّغ عنه المستخدم.
| Hop | Listens on | Must reach | Symptom when it points elsewhere |
|---|---|---|---|
| Client machine | A local plaintext port | The wrapper's public TLS address | Plain text offered to a TLS endpoint |
| Router forward | Public TCP 443 | The wrapper host on its translated port | Wrapper records no connection at all |
| Wrapper, server mode | Its accepted port, 8443 here | The native VPN socket on loopback | Handshake completes, then silence |
| Native VPN listener | Loopback TCP port | Its peer, over TCP only | A UDP socket behind a byte-stream relay |
القاعدة التي تستهدف منفذ VPN الأصلي بدلًا من الغلاف تتخطى إنهاء TLS كليًا، وهذا هو الشائع من هذا الخطأ: يفتح العميل مصافحة مع مستمع يتوقع تأطير OpenVPN، فقد يُفتح الاتصال ثم يتوقف. تحقّق من المنفذ المُترجَم مقابل ملف تكوين الغلاف لا مقابل الذاكرة، لأن الشخص التالي الذي يعدّل ذلك الملف ربما اختار رقمًا مختلفًا. الأمران أدناه يعرضان طرفي تلك المسألة في وقت واحد.
grep -nE '^[[:space:]]*(accept|connect)' /etc/stunnel/stunnel.conf
ss -lntp | grep -E ':443|:8443|:1194'
عنوان الارتباط الذي يرفضك
سطر accept المرتبط بـ 127.0.0.1 لا يجيب إلا المضيف نفسه، لذا لا تستطيع إعادة توجيه تصل على عنوان LAN الاتصال، ويرى العميل رفضًا يبدو وكأنه مشكلة في مرشح الحزم. انظر إلى المقبس قبل لمس جدار الحماية، لأن المقبس هو الجواب الأرخص. إما أن تربط الغلاف بالواجهة التي تستهدفها إعادة التوجيه، أو تُبقيه على loopback وتجعل إعادة التوجيه تصل إلى loopback عبر شيء يعمل حقًا. هذان تصميمان، وكل واحد منهما يحتاج إلى قاعدته الخاصة.
خلط الاثنين هو كيف ينتهي غلاف عامل غير قابل للوصول من الخارج بينما تبدو كل ملف صحيحة. الفحص أدناه أمر واحد، ويجيب عن سؤال لا تستطيع مراجعة قواعد جدار الحماية الإجابة عنه. إذا أظهر الخرج عنوان loopback بينما تستهدف إعادة التوجيه عنوان LAN، فالإصلاح مكانه سطر accept لا مرشح الحزم.
ss -lntp '( sport = :8443 )'
ما أثبته الاختبار المحلي فعليًا
النجاح المسجَّل دون القفزة التي غطّاها ليس دليلًا على القفزات الأخرى. لاحظ أي عنوان استخدمه الاختبار وأي عملية أجابت عنه. ثم أعد المحاولة من خارج الشبكة لا من هاتف على شبكة Wi-Fi نفسها، لأن سلوك الانعكاس يختلف بين الموجهات، والاتصال الذي لم يغادر LAN قط يمكن أن يرضي عميلًا دون أن تكون إعادة التوجيه معنية أصلًا. المحاولة الثانية وحدها هي التي تمارس المسار الذي يسلكه الغريب.
عندما تفشل المحاولة، تتبّع اتصالًا واحدًا عبر السجلين: أسطر القبول والاتصال في الغلاف، ثم سجل الجلسة الخاص ببرنامج VPN الخفي. أول حدود لا تسجل شيئًا هي حيث ينتمي التغيير التالي. وبعد أن يبدأ OpenVPN بمقارنة خيارات النظير، احكم على تلك الرسائل بقواعد ذلك التطبيق. تحذير تضارب link-mtu ليس قاتلًا تلقائيًا، وتثبيت link-mtu عند 1500 لا يثبت توقف التجزئة، وتفاوض التشفير ينتمي إلى تكوين OpenVPN الداخلي لا إلى إعادة توجيه الموجّه.
nc -vz 127.0.0.1 1194
journalctl -u stunnel -n 50 --no-pager
تغطي تلك المجسّات مقبس الخلفية وسجل الغلاف، مما يفصل خلفية مرفوضة عن مصافحة مرفوضة. شغّلها أثناء محاولة واحدة جارية لا بعدها. الطوابع الزمنية من محاولة واحدة هي ما يجعل المقارنة موثوقة.
هويتان، وترتيبان للفشل
الشهادة الخارجية تخص الغلاف والهوية الداخلية تخص OpenVPN، وقد تأتيان من سلطتين مختلفتين. تعطيل أي من الفحصين لجعل المسار يبدو سليمًا يقايض حماية حقيقية بنتيجة شكلية. أبقِ التحققين ورتّب تصحيحهما، لأن تتابع الرسائل يسمّي الطبقة: مشكلة شهادة الغلاف تظهر قبل تفاوض أي خيار VPN، بينما فشل الهوية الداخلية لا يظهر إلا بعد إنشاء التدفق.
إن دليل stunnel يحدّد accept وconnect ووضع العميل بدقة، وتلك الأقسام تجيب عن سؤال المقبس أسرع من التخمين. عندما لا تزال لا تستطيع تحديد أي طبقة أجابت، اقرأ الشهادة التي يعرضها المنفذ العام بالأمر أدناه. وجود شهادة الغلاف في الخرج يعني أن إعادة التوجيه وصلت إلى الغلاف، والصمت أو خطأ بروتوكول يعني أنها لم تصل. هذا التمييز الواحد يوفر وقتًا أكثر من أي فحص آخر هنا.
openssl s_client -connect vpn.example:443 -servername vpn.example </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer