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

البادئة تحتاج مالكًا، لا لحظة

ابدأ بكتابة المطلب جملةً ذات فاعل: الوصول إلى 10.77.0.0/24 عبر VPN المكتب ما دام ذلك الاتصال قائمًا. تسمّي هذه الجملة البادئة والاتصال والشرط، وتستبعد فورًا بديلين شائعين: خطّاف تسجيل الدخول واسم واجهة مثل ppp0 أو utun2.

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

استخدم مصدرًا مدعومًا لنيّة التوجيه

البوابة أو ملف تعريف مُدار أو آلية التوجيه الموثقة لدى العميل المالك هي المكان الصحيح لذلك، متى استطاعت تلك الآلية التعبير عن المطلب. أيّها ينطبق يعتمد على البروتوكول والمزوّد، والمفاتيح لا تنتقل بينها، فقيمة تضبط ملف تعريف OpenVPN لا تقول شيئًا عن عميل L2TP أو IKEv2 الأصلي.

MechanismCan carry extra prefixesWho owns the lifetime
Gateway-pushed routesOften, if the gateway is configured for itThe connection
Managed profile settingsDepends on the client and profile formatThe profile
Provider tunnel settingsYes, as included and excluded routesThe provider process
Manual commandYes, onceNobody

لمطوّري أنفاق الحزم، تكشف إعدادات نفق IPv4 لدى Apple عن المسارات المشمولة والمستثناة صراحةً، ولـ IPv6 نظيرها. هذه واجهات برمجة يستخدمها المزوّد، وليست دليلًا على أن كل لوحة VPN أصلية تتيح للمسؤول قائمة مسارات حرة. إذا لم تستطع التوليفة الحالية التعبير عن البادئات التي تحتاجها، فالخطوة التالية مسار إعداد مدعوم من المشغّل، لا تطبيق آخر يُثبَّت أملًا في أن يتصرف أفضل.

العمر يشمل التنظيف

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

هذا الشرط الأخير هو المؤلم. المساعد الذي يحذف كل مسار يطابق بادئة المكتب سيحذف عاجلًا أو آجلاً مسارًا لم يضفه. تُلقى مسؤولية الانقطاع الناتج على عميل VPN، لأن العميل هو الجزء الذي يراه المستخدم. تحديد ما يملكه المساعد قبل كتابته أرخص من شرح لاحقًا لماذا توقفت شبكة فرعية محلية عن الاستجابة.

سباق إعادة الاتصال

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

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

ما يجب اختباره، وما لا يستطيع المسار فعله

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

route -n get 10.77.0.5
netstat -rn -f inet

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

النتيجة التي تريدها بادئة تتبع مالك اتصالها المدعوم عبر كل انتقال، لا أمر نجح مرة واحدة صدفةً على الجهاز الذي كُتب عليه.

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