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

كلاهما أفضل من نوم ثابت، فهو لا ينتظر شيئًا ولا يبلّغ عمّا كان ينتظره.

ما يتطلبه خيار local فعليًا

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

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

الانتظار بحثًا عن العنوان مقابل إعادة محاولة الربط

الانتظار يعني ExecStartPre يستقصي حتى يظهر العنوان، بعدد محاولات محدود وخروج غير صفري عند انتهاء الوقت. أما إعادة المحاولة فتعني ترك العملية الرئيسية تفشل وطلب إعادة تشغيلها من مدير الخدمة، مثل Restart=on-failure مع RestartSec=5. الأول يبلّغ عن شرط مسبق مفقود كوحدة فاشلة، والثاني يبلّغ عنه كسلسلة إعادات تشغيل تتوقف في النهاية، وهي أكثر ضجيجًا في السجل لكنها تصمد أمام عنوان يصل متأخرًا لأسباب لا يمكنك التنبؤ بها.

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

لماذا لا يكفي network-online.target

network-online.target يَعِد بما يعنيه التنفيذ الشبكي النشط بكلمة متصل، ولا شيء بعد ذلك. مع systemd-networkd يقرر systemd-networkd-wait-online متى يتحقق ذلك الهدف، ويمكن تلبية مفهومه الافتراضي للاتصال قبل أن يوجد عنوانك المحدد. وتحت NetworkManager تطبّق خدمة wait-online قواعدها الخاصة. والترتيب بعد الهدف أساس سليم، لا ضمان بأن عنوانًا واحدًا أو إجابة DNS أو نظيرًا بعيدًا جاهز.

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

افحص الربط بعد إقلاع بارد

تحقّق بإقلاع بارد حقيقي لا بإعادة تشغيل الخدمة، لأن إعادة التشغيل ترث عنوانًا كان على تسلسل الإقلاع إنشاؤه. بعد الإقلاع يعرض ss -lntp أو ss -lunp العنوان المحلي الذي ربطه كل مستمع فعلاً، ويعرض journalctl -b -u openvpn-server@server ما إذا فشلت المحاولة الأولى. قارن العنوان المربوط بالعنوان الموجود في الملف الشخصي، ثم كرر المقارنة بعد إعادة اتصال الشبكة.

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

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

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