لماذا لا يستطيع nc -uz إثبات أن خادم OpenVPN جاهز
يفيد فحص netcat عبر UDP بالنجاح حتى عندما لا يستمع شيء، لذا لا يمكنه إثبات أن خادم OpenVPN جاهز. تحقّق من العملية والسجل والمستمع وعميل حقيقي.
تشغيل nc -uz مقابل خادم OpenVPN لا يقيس شيئًا تقريبًا، و دليل OpenBSD يقول ذلك في تحذيراته: فحوص UDP في هذا الوضع تفيد بالنجاح سواء كان هناك شيء يستمع أم لا. تعكس حالة الخروج عملية الإرسال المحلية، لا الحالة البعيدة، لذلك يُبقي المشرف الذي يثق بها خادمًا ميتًا مصنّفًا سليمًا ما دام جدول العمليات يبدو معقولًا. وتبدأ إعادة استبداله بتحديد السؤال الذي ينبغي أن يجيب عنه الفحص، لأن العملية والمستمع والمصادقة وإمكانية الوصول إلى التطبيق أربع ملاحظات مختلفة. الفحص الذي يسمّي واحدة منها مفيد؛ والفحص الذي يوحي بالأربع جميعًا عبء.
ما يمكن لفحص UDP ملاحظته وما لا يمكنه
nc -uz يرسل مخطط بيانات ثم يخرج، والحالة التي يعيدها تصف الإرسال المحلي. قد يجيب المنفذ المغلق برسالة ICMP port unreachable، لكن السلوك الموثّق لوضع الفحص هذا لا يحوّل ذلك إلى فشل، والمنفذ المفلتر لا ينتج أي إجابة على الإطلاق. لذا يعني الصمت والنجاح الشيء نفسه للمتصل.
وهذا يجعل الفحص اختبارًا للحزمة المحلية، لا للخادم. فهو لا يثبت أن المضيف قابل للوصول، ولا أن المنفذ مربوط، ولا أن عملية OpenVPN تعمل، ولا أن عميلًا قد يستطيع المصادقة. اختبار اتصال TCP أقوى لأن المصافحة تعطي إجابة قاطعة، لكن فقط عندما يستمع النشر فعليًا على TCP. تحويل الفحص إلى TCP على المنفذ نفسه يختبر مستمعًا قد لا يكون موجودًا، ومع خادم UDP فقط سيفشل خدمة سليمة.
مطابقة الفحص للنقل المُعدّ تأتي قبل الوثوق بأي من النتيجتين. نشر UDP يحتاج إشارة مختلفة، لا بروتوكولًا مختلفًا.
ثلاثة متصلين، ثلاثة أسئلة مختلفة
تعتمد الجاهزية على من يسأل. مدير الخدمة الذي يعيد تشغيل عملية متعثرة يحتاج أن يعرف أن النسخة بدأت وربطت مستمعها. موازن الحمل يحتاج أن يعرف أن عميلًا يصل الآن سيُقبل. نظام المراقبة يحتاج أن يعرف أن المسار من شبكة حقيقية ما زال يحمل جلسة إلى مورد مسموح.
هذه ليست الفحص نفسه، ولا يمكن لفحص واحد أن يغطي الثلاثة بصدق. اختر المتصل أولًا، ثم اختر الدليل.
ابنِ الفحص من النسخة الحالية
يكتب OpenVPN سطر بدء عندما تنتهي النسخة من التهيئة، وهذا السطر دليل مفيد على البدء المحلي. اقرأه من البدء الحالي لا من ذيل ملف مُلحق، لأن نجاحًا من الأسبوع الماضي يُقرأ تمامًا كنجاح من قبل دقيقة. وقد تنتهي الخادمة من التهيئة قبل أن يتصل أي عميل على الإطلاق، لذا لا يقول السطر شيئًا عن المصادقة.
لفحص البدء، اقرن حالة العملية بدليل السجل الحالي ومستمع يطابق النقل المُعدّ. يجب أن يفشل الفحص عندما تكون العملية قيد التشغيل لكنها لم تنتهِ من التهيئة، وهذا يعني أن استعلام السجل يجب أن يكون محصورًا في هذا الإقلاع وهذه الوحدة.
systemctl is-active openvpn@server
sudo journalctl -u openvpn@server -b --no-pager | grep "Initialization Sequence Completed"
ss -lunp | grep 1194
ثلاثة مخرجات، ثلاثة ادعاءات: الوحدة نشطة، وهذا الإقلاع أنتج سطر التهيئة، وشيء يحتفظ بمنفذ UDP. لا يقول أي منها إن عميلًا يستطيع الاتصال. أبقِها منفصلة في صفحة الحالة حتى لا ينهار حادث في نقطة خضراء واحدة.
اكسره عمدًا وراقب الفحص
لا يكون الفحص موثوقًا إلا بعد أن تراه يفشل. أوقف الخادم، وشغّل الفحص، وأكّد النتيجة التي تتوقعها. ثم شغّله مرة أخرى وأكّد أن الفحص يتعافى دون أي تغيير آخر.
sudo systemctl stop openvpn@server
nc -uz 203.0.113.10 1194; echo "exit=$?"
ss -lunp | grep 1194
sudo systemctl start openvpn@server
ss -lunp | grep 1194
اقرأ الكتلة سطرًا بسطر. يطبع أمر netcat exit=0 بينما لا شيء مربوط، وهذه هي المشكلة كلها في سطر واحد. أول ss لا يطبع شيئًا، والإنعاش ينجح، والثاني ss يُظهر المستمع مرة أخرى. إذا نجح فحصك مع الخادم المتوقف، فهو يقيس الحزمة المحلية ولا شيء غيرها.
الفشل المعاكس يهم أيضًا. الفحص الذي يفشل مع خادم سليم يسبب عمليات إعادة تشغيل لم تكن مطلوبة، وحلقة إعادة التشغيل انقطاع بحد ذاتها. اختبر الاتجاهين قبل أن توصّل الفحص بأي شيء يمكنه التصرف بناءً عليه.
ما ينبغي أن يقوله سطر الحالة
سجّل الحد الذي يغطيه كل فحص: العملية أو المستمع أو المصادقة أو التطبيق. نادرًا ما يغطي فحص واحد أكثر من واحد، وصفحة الحالة التي تضغطها في “up” تخفي الفرق المهم أثناء الحادث. أما مسار الشبكة فاستخدم له عميلًا حقيقيًا بهوية مخصصة، ودعه يكمل المصافحة وعملية واحدة مسموحًا بها وغير ضارة، ثم افصله. هذا يمارس قناة التحكم وسياسة المصادقة والمستمع في خطوة واحدة.
أبقِ تلك الهوية منفصلة عن المستخدمين الحقيقيين وامنحها الحد الأدنى من الأذونات التي يحتاجها الفحص. فحص الجاهزية بوصول واسع هو سطح هجوم جديد يُضاف للراحة. بدّل بيانات اعتماده مثل أي حساب آخر، لأن فحصًا يتوقف عن المصادقة يبدو تمامًا كخادم توقف عن قبول العملاء.
سمِّ الحد في نص التنبيه، ليعرف أول مستجيب ما إذا كان ينظر إلى الوحدة أو المقبس أو الشهادة أو المسار. الفحص الذي لا يستطيع أن يقول ما أثبته سيُوثق به للسبب الخطأ، وهكذا نجا فحص netcat في المقام الأول.