شغّل مهام ما بعد VPN من الموزّع لا من if-up
خطّاف واجهة قديم لن يرى اتصال VPN. طابِق vpn-up على UUID الملف الشخصي، واجعل المهمة قابلة للتكرار، وخطّط لانقطاع لا يُطلق أبدًا.
يحتاج السكربت الذي يجب أن يعمل بعد صعود VPN إلى حدث من المكوّن الذي يملك الاتصال. والملف الذي يُوضع في مجلد خطّاف شبكة قديم ليس استدعاءً راجعًا لكل VPN قد ينشئه NetworkManager أو pppd أو عملية OpenVPN مستقلة. كل واحد من هؤلاء المالكين يبلّغ بحدث مختلف وببيئة مختلفة، لذا يجب تحديد المالك قبل اختيار الخطّاف. وإلا فإن السكربت صحيح لكنه لا يعمل أبدًا.
بالنسبة إلى VPN يديره NetworkManager، فإن الموزّع هو المكان الصحيح، والإجراء الصحيح هو vpn-up.
استخدم vpn-up لا حدث الواجهة
يميّز الموزّع up من vpn-up. الأول يبلّغ عن واجهة مُنشّطة؛ والثاني يبلّغ عن اتصال VPN مُنشّط. صعود Wi-Fi يعني فقط أن الوصلة الأساسية موجودة؛ فقد يكون النفق ما زال يتفاوض، أو قد لا ينجح في المصادقة أبدًا.
يستقبل السكربت الواجهة والإجراء، بينما تصل تفاصيل الاتصال عبر البيئة، بما في ذلك UUID الملف الشخصي وواجهة IP الخاصة بـ VPN. اقرأ تلك المتغيرات بدلًا من استنتاج الهوية من أسماء الأجهزة.
احصر المطابقة في اتصال واحد
طابِق على UUID الاتصال، أو أي هوية أخرى يوفّرها الموزّع، بدلًا من بادئة tun أو ppp0. أسماء الواجهات ليست مستقرة، يمكن أن يوجد أكثر من نفق في الوقت نفسه، ويمكن أن يحمل ملفان شخصيان الاسم الظاهر ذاته. ومطابقة بادئة tun تعني أن السكربت سيُطلق في النهاية لاتصال لم يقصد أحد لمسه. وقد يُطلق أيضًا مرتين لملف شخصي واحد عندما تعيد إعادة الاتصال بناء الجهاز.
اجعل المهمة عديمة الأثر عند إعادة التنفيذ. فالاستدعاء الراجع الذي يضيف مسارًا في كل استدعاء يملأ الجدول في النهاية بتكرارات، والنسخة الثانية هي التي تكسر التوجيه.
اعرف ما لا يثبته التنشيط
vpn-pre-up يعمل قبل أن يبلّغ NetworkManager عن تنشيط VPN بالكامل، والمدير ينتظر تلك السكربتات. استخدم مرحلة حاجزة فقط عندما تنتمي المهمة إلى هناك فعلًا، لأن فحصًا بطيئًا يؤخّر التنشيط الذي ينتظره كل مكوّن آخر ليراه.
وجود المسارات لا يثبت أن تطبيقًا يستمع، أو أن اسمًا خاصًا يُحلّ، أو أن جلسة مستخدم موجودة. افحص ذلك على حدة بمهلة محدودة، وأبلغ عن الطبقة التي فشلت بدلًا من إعادة محاولة السلسلة بأكملها.
احترم السياق الذي يعمل فيه السكربت
تعمل سكربتات الموزّع بصلاحية root، خارج أي جلسة مستخدم. لا تفترض أن بيئة المستخدم المسجّل أو جلسته الرسومية أو سلسلة مفاتيحه غير المقفلة متاحة. ولا ينبغي لأحد أن يستجيب لغياب سياق سطح المكتب بجعل كل بيانات اعتماد قابلة للقراءة من كل عملية. أبقِ عمل جلسة المستخدم في خدمة مستخدم أو مساعد جلسة يستطيع الاستدعاء الراجع إشارته دون انتحال شخصية المستخدم.
ملكية السكربت وأذوناته مهمة أيضًا. فالملف الذي يُنفّذ بصلاحية root ويستطيع أي مستخدم استبداله هو مسار لتصعيد الامتيازات، وهو نتيجة مستقلة عن صحة منطق VPN.
خطّط للانقطاع الذي لا يُطلق أبدًا
يوثّق NetworkManager أن vpn-pre-down لا يُصدر عند الانقطاعات القسرية مثل إنهاء غير متوقع أو فقدان الاتصال. لذا فإن التنظيف المبني فقط حول pre-down السلس ناقص بحكم التصميم. وأي حالة مشتركة يغيّرها السكربت تحتاج إلى مالك آخر يستطيع استعادتها بعد انهيار، ويجب اختبار مسار الاستعادة هذا لا افتراضه.
اختبر الخطّاف باتصال عادي، وإعادة اتصال، وانقطاع متعمّد، وكابل مسحوب. سجّل UUID والإجراء والواجهة التي أُطلقت، دون تسجيل أسرار. هذا السجل هو الدليل الموثوق الوحيد على أن الخطّاف عمل للاتصال الذي قصدته، وهو ما يجعل التغيير التالي آمنًا.