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

ثلاثة أجوبة عن سؤال: هل الشبكة الافتراضية تعمل؟

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

SignalAnswersBlind spot
scutil --nc statusIs the service connected?Third-party clients, wrong routes
route -n getWhere would this go?The peer may be down
A request to the far sideDoes it work now?Slow, and it changes state

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

اقرأ المعرّف، لا الاسم المعروض

scutil --nc list
scutil --nc status "Office"

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

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

عميل طرف ثالث يختفي من القائمة

القائمة الفارغة لا تعني عدم وجود VPN. تظهر هنا الإعدادات التي أُنشئت داخل إعدادات الشبكة الخاصة بالنظام؛ أما عميل بائع أو ملف إدارة أو تطبيق طرف ثالث فقد يبقي نفقًا نشطًا لا يراه هذا الأمر أبدًا. أداته الخاصة هي المرجع لخدمته الخاصة. وسؤال scutil عن عميل لم يسجّل معه قط يعيد لا شيء، ولا شيء ليس الجواب نفسه الذي يعنيه «غير متصل».

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

الحالة ليست التوجيه

الخدمة المتصلة تقول إن النفق موجود. ولا تقول إن وجهتك تستخدمه. اقرأ العناوين ثم اسأل النواة مباشرة:

ifconfig | grep -A4 utun
netstat -rn -f inet
route -n get 10.40.0.20

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

التسمية مشكلة منفصلة

لا تستطيع الأجهزة الأخرى بلوغ جهاز Mac بالاسم بينما يعمل عنوانه، ويُبلَّغ عن ذلك كعطل في VPN. الاسم المحلي للمضيف واسم المضيف وسجل DNS ثلاثة أشياء مختلفة. يعرض scutil --get LocalHostName اسم Bonjour؛ ويضبط sudo scutil --set HostName mac-office الاسم الذي يبلّغ عنه النظام.

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

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

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