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

الحلقة التي تخفي الخطأ الأول

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

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

قبل أن تغيّر أي شيء، سجّل دورة كاملة واحدة. دوّن العنوان البعيد ومرحلة TLS المذكورة في الخطأ وما إذا كانت العملية تخرج أصلًا.

آلية إعادة المحاولة وراء الحلقة

إعادة المحاولة هي الافتراضي لأن عدة مهل غير مترابطة تتشارك الآلية نفسها. يضبط connect-retry الفاصل بين محاولات الاتصال، ويمكن لـ connect-retry-max أن يحدّ من عدد مرات تجربة كل مدخل بعيد، ويتحكم resolv-retry في عمليات البحث المتكررة عن الأسماء. يصل فشل تفاوض TLS إلى تلك الآلية كحدث نقل، فيجدول العميل محاولة أخرى بدل أن يبلّغ. الافتراضي مفيد لوصلة غير مستقرة وضار لعيب لا يمكن أن يشفى.

لا يغيّر الخيار --tls-exit إلا حالة التفاوض. يصفه الدليل بالخروج عند فشل تفاوض TLS، وهو أضيق من الخروج عند كل خطأ. تحتفظ المهل وأعطال المحلّل ورفض المصادقة بسلوكها الخاص.

اجعل العميل يخرج عند فشل TLS

ضع tls-exit في الملف الشخصي الذي يحمّله العميل فعلًا، أو مرّر --tls-exit عند تشغيله، ثم شغّله مرة واحدة في المقدمة. اقرأ حالة الخروج وكذلك آخر سطر في السجل، لأن الحالة هي ما يتصرف بناءً عليه المشرف. الخروج بقيمة غير صفرية بعد فشل التفاوض هو النتيجة المقصودة. وإذا استمرت العملية في إعادة المحاولة بدل أن تنتهي، فالخيار ليس في الملف الشخصي الذي حمّله العميل فعلًا.

المشرف هو من يقرر ما إذا كان ذلك الخروج مرئيًا. وحدة systemd تحمل Restart=always أو Restart=on-failure تعيد تشغيل العميل، فتستمر الحلقة ويبدو الخيار كأنه لا يفعل شيئًا. افحص السياسة قبل أن تلوم العميل:

systemctl show -p Restart -p RestartSec openvpn-client@office
journalctl -u openvpn-client@office -n 40 --no-pager

يتيح Restart=no بقاء العملية متوقفة، ولا يزال Restart=on-failure يعيد التشغيل بعد حالة غير صفرية. إذا أردت أن يكون الفشل مرئيًا وأن تتعافى الخدمة من أعطال غير ذات صلة، فاضبط Restart=on-failure واستخدم StartLimitBurst وكذلك StartLimitIntervalSec لإيقاف عاصفة إعادة التشغيل. ثم اقرأ حالة الوحدة لتأكيد آخر رمز خروج: يبلّغ عنه systemctl status، ويحتفظ السجل بالخطأ الأول فوق عمليات إعادة التشغيل.

اكتب القرار في الوحدة أو في ملاحظات الملف الشخصي. الملف الشخصي الذي يخرج عند فشل TLS يبدو كحادث لمن يأتي بعده ما لم يُسجَّل السبب. حدّد أي الأعطال يجب أن توقف العملية وأيها يجب أن يُعاد.

أثبته بنقطة نهاية مؤقتة

لترى السلوك قبل أن تثق به، انسخ الملف الشخصي ووجّه النسخة إلى نقطة نهاية تقبل اتصال TCP لكنها لا تتكلم OpenVPN أبدًا. يكفي مستمع يجيب ثم يبقى صامتًا. مع tls-exit يجب أن ينتهي العميل عندما تفشل المصافحة؛ وبدونه يجب أن يستمر الملف نفسه في الدوران. استخدم النسخة، لا الملف العامل أبدًا.

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

أزل ملف الاختبار عند الانتهاء. النسخة التي تحمل نقطة نهاية خاطئة عمدًا فخّ لكل من يشغّل لاحقًا كل ملفات التعريف في المجلد.

مراحل لا يصل إليها هذا الخيار

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

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

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

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