ما الذي يبقى حقًا عند استخدام persist-tun و persist-key في OpenVPN
يغطي الخياران إعادة ضبط لطيفة داخل عملية حية. لا يحتفظان بواجهة الشبكة بعد الإيقاف، وليسا سياسة لحجب حركة المرور.
إيقاف الخدمة يزيل واجهة الشبكة حتى مع ضبط persist-tun. هذا هو عمل الخيار كما هو موثق وليس فشلًا. يصف الخيار مسار إعادة تشغيل واحدًا داخل عملية قيد التشغيل، و systemctl stop ليس ذلك المسار.
اقرأ الاسمين معًا يتضح التصميم. أحدهما يحتفظ بوصف للملف والآخر يحتفظ بمواد المفتاح، وكلاهما موجود بسبب ما يحدث بعد إسقاط الامتيازات.
الموردان وإعادة الضبط التي ينتميان إليها
OpenVPN يشير إلى إعادة تشغيله الخاصة في حالتين عاديتين. إشارة SIGUSR1 الصريحة تفعل ذلك، و ping-restart الناتج عن قرين ميت يفعل الشيء نفسه. كلاهما يبقي العملية حية ويعيد تشغيل إعداد الاتصال، وهنا تكسب الخيارات مكانها.
| Event | TUN/TAP device | Key and auth files | Addresses and routes | up/down hooks |
|---|---|---|---|---|
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itself | survives only with persist-tun | survive only with persist-key | survive with the device, otherwise rebuilt | run again only when restart hooks are enabled |
Configuration reload, SIGHUP | recreated | re-read from disk | rebuilt once the device returns | run again |
| Service stop | lost | re-read at the next start | removed | run at the next start |
صف إعادة الضبط اللطيفة وحده هو ما يغيّره هذان الخياران، والعمل الذي يتخطيانه هو الجزء المكلف على رابط مزدحم. إعادة فتح جهاز تهدم العناوين والمسارات المرتبطة به، وإعادة بنائها قد تُسقط حزمًا كانت في الطريق عندما بدأت إعادة الضبط. الإيقاف يدمر نفس الكائنات بدون أي خيار للحفاظ عليها.
لماذا توجد الخيارات أصلًا
خادم OpenVPN المحصّن يبدأ عادةً بصلاحيات الجذر، ويفتح مفاتيحه وجهازه، ثم ينتقل إلى مستخدم غير مميز. بعد هذا الانتقال تصبح بعض العمليات مفقودة ببساطة. قراءة ملف مفتاح بالوضع 0600 أو إنشاء واجهة شبكة أو تغيير المسارات يمكن أن تُرفض كلها.
بدون خيارات persist، فإن قرينًا يصمت مدة تكفي لتحفيز ping-restart سيفرض تلك العمليات بالضبط. ستفشل إعادة الاتصال رغم أن شيئًا في الإعداد لم يتغير. ستبدو العملية كأنها تموت بلا سبب، وسيُظهر السجل خطأ صلاحيات بدلًا من خطأ شبكة.
معها، تعيد إعادة الضبط اللطيفة استخدام ما حصلت عليه المرحلة المميزة بالفعل. لا سحر هنا ولا تنجو العملية من أي شيء. اقتناء الموارد مؤجل فحسب.
اقرأ الخطأ الأول لا الأخير
عندما تفشل إعادة الضبط، اقرأ الخطأ الأول بدلًا من الأخير. مفتاح محمي وملف مصادقة و ioctl واجهة وخطاف خارجي أربعة موارد مختلفة. الاحتفاظ بواحد لا يقول شيئًا عن الوصول إلى الآخرين. الخطاف الذي يستدعي أداة جدار حماية لا يزال يحتاج الامتيازات التي تتطلبها تلك الأداة.
للخطافات مفتاحها الخاص. يقترن دليل OpenVPN خيارات persist بـ up-restart، الذي يقرر ما إذا كانت سكربتات up و down تعمل مجددًا بعد إعادة التشغيل. لذا فواجهة بقيت قائمة لا تخبرك بشيء عن تحديث تكامل المُحلِّل.
# which restart path just happened?
journalctl -u openvpn-client@office --since '10 min ago' | grep -E 'SIGUSR1|ping-restart|Restart pause|NOTE:'
# did the interface survive, and do its routes still exist?
ip -brief link show tun0
ip route show dev tun0
هذان الأمران يفصلان نمطي الفشل في ثوانٍ. واجهة موجودة مع مسارات مفقودة هي مشكلة خطاف أو مسار. الواجهة التي اختفت تعني أن العملية انتهت فعليًا.
الواجهة المحتفظ بها ليست مفتاح إيقاف
إذا كان المطلوب ألا تغادر الحركة النفق أبدًا، فإن الجهاز المحتفظ به لا يحقق ذلك. المسارات لعائلة العنوان الأخرى، ومسار افتراضي ثانٍ، وحالة خروج العملية كليًا تبقى كلها خارج نطاق الخيار.
عالج المطلبين بشكل منفصل. الاحتفاظ بكائن النفق عبر إعادات الاتصال راحة للخادم الخفي. حجب الخروج عندما يكون النفق معطلًا سياسة جدار حماية لها قواعدها واختبارها. الخلط بينهما ينتج إعدادًا يبدو دفاعيًا ويتصرف كإعادة اتصال بأفضل جهد.
سمِّ الحدث قبل تشخيصه. إعادة الضبط اللطيفة ومحاولة الاتصال الفاشلة وإيقاف الخدمة ثلاثة أحداث بثلاثة سلوكيات، والأول فقط هو ما تصفه هذه الخيارات.