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

الطبقة 1: سطر أوامر المورّد

تقدّم معظم عملاء سطح المكتب سطر أوامر يقبل اسم ملف تعريف، وكثيرًا جدًا كلمة مرور. كان عميل Cisco القديم يقبل فعل connect مع وسيطي المستخدم وكلمة المرور؛ ويعرض macOS الخدمة المدمجة عبر networksetup؛ ويستجيب NetworkManager لـ nmcli. تعود هذه الاستدعاءات عند انتهاء الأمر، وهو ليس اللحظة نفسها التي يصبح فيها النفق قابلًا للاستخدام. اقرأ وثائق المورّد للإصدار الذي تنشره، لأن هذه الواجهات تتغير وبعضها يُزال بالكامل.

nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"

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

الطبقة 2: خدمة نظام التشغيل نفسها

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

rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus

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

Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection

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

بيانات الاعتماد تتسرب في كل طبقة، فاختر القناة

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

openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret

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

انتظر الحالة، ثم راقب مالكًا واحدًا

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

ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null

لقطع الاتصال المشكلة نفسها بالعكس: قد تخرج العملية قبل أن تختفي المسارات. استخدم خطافات العميل حيث توجد، مثل سكريبتَي up وdown الخاصين بـ OpenVPN أو ExecStartPost لوحدة systemd، لأنها تعمل عند النقطة التي تهمك فعلًا. تعمل الخطافات بامتيازات ما استدعاها، لذا يحتاج الخطاف الذي يعيد تشغيل الشبكة إلى قاعدة صريحة بدلًا من افتراض. أبقِ مالكًا واحدًا فقط طوال عمر الاتصال.

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

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