ملف تعريف vpnc واحد يعيد الاتصال بنظافة بعد التجوال؛ وثلاثة منها تتبادل كسر مقابس بعضها ومساراتها وحالة المُحلِّل. سكربت إعادة الاتصال المرفق مكتوب لنفق واحد، لذا يعيد تشغيل كل ملف تعريف كلما كان أي منها معطلاً. وإصلاح ذلك يحتاج ثلاثة أشياء: منافذ محلية منفصلة، وفحص يختبر خدمة حقيقية لكل ملف تعريف، وسلسلة واحدة مرتبة لا تشغّل اتصالين في الوقت نفسه.

امنح كل ملف تعريف منفذه المحلي الخاص

ملف تعريف vpnc المتروك على المنفذ المحلي الافتراضي يتنافس مع ملف التعريف العامل بالفعل. يفشل الاتصال الثاني بينما يحتفظ الأول بالمنفذ، ويبدو سطر السجل كمشكلة في البوابة لا كتعارض محلي. ضع سطراً واحداً لكل ملف تعريف بدلاً من ذلك:

Local Port 0

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

ملفات التعريف تحمل بيانات اعتماد، لذا فإن الأذونات جزء من التصميم لا من أعمال الصيانة. ملف مقروء للجميع تحت /etc/vpnc يسلّم سر المجموعة لكل مستخدم محلي. أبقِ الوضع على 0600 مع الجذر مالكاً، ودع السكربتات تقرأ الملف بصلاحيات الجذر بدلاً من نسخ الأسرار إلى الوسائط. ولهذا السبب أيضاً يجب ألا يطبع سكربت الفحص محتوى الملف في السجل أبداً.

افحص خدمة واحدة لكل ملف تعريف، لا عنوان النفق

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

افحص خدمة واحدة لكل ملف تعريف بمهلة TCP قصيرة، وأعد توصيل ملف التعريف الذي فشل فحسه فقط. ثانيتان تفصلان مساراً ميتاً عن مسار بطيء، وفحص TCP لا يعتمد على السماح بـ ICMP في أي نقطة على الطريق. غيّر الهدف واسم الإعداد فقط بين ملفات التعريف:

#!/bin/bash
set -eu
if ! nc -z -w 2 10.63.7.20 8443; then
  /usr/sbin/vpnc-connect ops.conf
fi

احفظ ذلك باسم /usr/local/bin/ensure-vpn-ops.sh، واجعله قابلاً للتنفيذ، وكرّر لكل ملف تعريف مع تغيير هدف الفحص واسم الإعداد فقط. الفحص الذي يجيب عن سؤال بروتوكولي يصمد أمام بوابات تُسقط الصدى بينما تواصل تمرير الخدمات التي يهم المستخدمين أمرها.

اربط الفحوص في سلسلة كي لا تتسابق أبداً

يمكن لسكربت إعادة الاتصال المرفق أن يستدعي فحوصك بالتتابع، والتتابع هو المقصود كله. استدعاءان من vpnc-connect يعملان معاً يعيدان كتابة جدول التوجيه بترتيب لا يتحكم فيه أحد، وهكذا يفقد ملف تعريف سليم مساره.

أبقِ الاستدعاءات في المقدمة، وأضف مهلة استقرار قصيرة للواجهة الأساسية، وجدول السلسلة من جدول cron الخاص بالجذر، لأن الجذر وحده يمكنه إعادة كتابة مسارات النفق:

#!/bin/bash
sleep 20
/usr/local/bin/ensure-vpn-ops.sh
/usr/local/bin/ensure-vpn-lab.sh

أبقِ الترتيب متطابقاً بين سكربت الإقلاع ومدخل cron، لأن سلسلة تعمل بترتيب مختلف عند الإقلاع هي في الواقع برنامج مختلف. وعندما يعتمد ملف تعريف على مسارات ملف آخر، ضع التابع أولاً ودع الفحص اللاحق يفشل بلا ضرر بينما لا يزال النفق السابق قيد الصعود.

راقب السجل، ثم اكسر نفقاً عن قصد

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

ثم اكسر نفقاً عمداً وراقب ما يحدث. أوقف ملف تعريف واحداً وتأكد من العمليات والمسارات التي لا تزال موجودة:

pgrep -a vpnc
ip -4 route show | grep -E '10[.]63|10[.]90'
tail -n 5 /var/log/ensure-vpn.log

يجب ألا يُعاد توصيل سوى ملف التعريف الموقوف، وأن تحتفظ الجلسات الأخرى بعملياتها ومساراتها معاً. وإذا أُعيد تشغيل ملفَي تعريف، فسلسلتك تعمل بالتوازي في مكان لم تتوقعه.

ما يجب ألا يفعله المراقب

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

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

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