كيف تكتشف نفق VPN نشطًا من الشيفرة على أي منصة
هل النفق موجود، وهل تمر هذه الوجهة عبره، أم أن الطرف البعيد هو من يجيب؟ هذه ثلاثة فحوص مختلفة وثلاث إشارات مختلفة.
«هل الـ VPN قائم؟» في الحقيقة ثلاثة أسئلة في جملة واحدة. أيها تحتاج شيفرتك هو القرار الأول، وهو القرار الذي تتخطاه معظم التطبيقات. هل يوجد نفق على هذا الجهاز، وهل تغادر الحركة إلى هذه الوجهة عبره، أم يجيب الطرف البعيد بالهوية التي تتوقعها. اختر الخاصية، ثم اختر الإشارة التي تقيسها، ثم قل في السجل أيها قست فعلًا.
ثلاث خصائص، ثلاث إشارات
مضغوطة في سطر واحد لكل منها، للأسئلة الثلاثة ثلاثة أجوبة مختلفة. الجدول أدناه هو القرار نفسه، لا ملخص له.
| Property | Signal that answers it | What it still leaves open |
|---|---|---|
| Existence | The platform's own connection state: RAS on Windows, NetworkManager on D-Bus on Linux, scutil on macOS | Tunnels of a type the platform does not manage, which includes most third-party clients |
| Path | A route lookup for the one destination, or a scoped proxy or interface key that names the tunnel | Whether the far end is the peer you trust |
| Identity | An authenticated response from the far end, or a source-address policy applied on the server | Which local interface carried the packets |
اقرأ الصف الأخير ببطء. المضيف الخاص الذي يجيب يثبت أن شيئًا ما أجاب، لا أن الجواب جاء عبر النفق، ولا يقول شيئًا عن هوية الطرف الآخر. إن كانت الخاصية التي تحتاجها هي المسار، فقِس المسار.
الوجود: حالة المنصة نفسها
يجيب Windows عن هذا للملفات الشخصية الأصلية عبر واجهة Remote Access Service API. يسرد RasEnumConnections ما هو متصل، ويبلغ RasGetConnectStatus عن حالة مدخل واحد، ويضيف RasGetLinkStatistics السرعة وعدادات البايتات وعمر الاتصال. الحدود هي المقصودة: OpenVPN وWireGuard وعملاء البائعين لا يسجلون اتصال RAS أبدًا، لذلك يظهر نفق سليم من ذلك النوع قائمة فارغة ويبلغ عنه الكود الساذج بأنه معطل.
تعرض أسطح مكتب Linux الخاصية نفسها عبر NetworkManager على D-Bus، حيث يحول PropertiesChanged على كائن اتصال VPN الفحص إلى حدث، ويبلغ خاصية State عندما يبلغ الرابط حالة الاتصال. من صدفة، يقرأ nmcli connection show --active المعلومات نفسها، وهو ما تريده أثناء التنقيح. يحتفظ macOS بتلك القائمة في إطار System Configuration، مع scutil كعرضه من سطر الأوامر. تصف الثلاثة اتصالًا تديره المنصة، وتصمت الثلاثة عن نفق لا تديره.
المسار: إلى أين تذهب الحزمة فعلًا
مطابقة الأسماء هي الطريق المختصر الذي يلجأ إليه الجميع أولًا: عدّد الواجهات، واختبر السلسلة مقابل tun وtap وppp أو ipsec، واعتبر أي تطابق دليلًا. إنه استدلال تقريبي، ويمكن أن تبدو مجموعة الواجهات نفسها سواء كان شيء يمر عبرها أم لا. أجابت إصدارات iOS الأقدم بهذه الطريقة وتوقفت الأحدث، لأن الواجهات المرئية لم تعد تميز بين الحالتين.
ما حل محله هناك هو قاموس الوكيل النظامي. أثناء اتصال VPN يعيد استدعاء إعدادات الوكيل مفاتيح مرتبطة بالواجهات المتصلة بالنفق، وعند عدم وجود اتصال يعود القاموس فارغًا. هذا ادعاء أضعف مما يبدو، لأنه يسجل اعتقاد النظام بوجود نفق لا الوجهة التي تستخدمه.
لأندرويد نسخته الخاصة من الفخ: يصل بث vpn.connectivity إلى مستقبلات معلنة في البيان في بعض الإصدارات وإلى مستقبلات مسجلة وقت التشغيل في أخرى. تعامل معه على أنه أفضل جهد، وأبقِ مسبارًا مباشرًا خلفه.
حين تكون الوجهة هي المهمة، اسأل جدول التوجيه بدلًا من قائمة المحولات. تتعطل استدلالات البوابة الافتراضية على الأجهزة متعددة الشبكات وعلى الأنفاق التي تثبت بوابة خاصة بها.
الهوية: افحص الطرف البعيد
حلقة ترسل نبضات ICMP إلى الطرف البعيد كل بضع ثوانٍ هي أرخص فحص من هذا النوع، وهي تفشل في اتجاه مفيد. وجّهها إلى عنوان لا يوجد إلا داخل الشبكة الخاصة، لأن العنوان العام يجيب عبر أي وصلة صاعدة عاملة ولا يثبت شيئًا. وحيث يُرشَّح ICMP، يؤدي اتصال TCP قصير بمنفذ الخدمة المهمة نفسها.
يتوفر لفحص جهة الخادم إشارة واحدة فقط: عنوان المصدر على الاتصال. الحفاظ على جرد النطاقات عمل صيانة، وهو لا يستطيع فصل نفق عن أي شبكة أخرى تصادف أنها تستخدم الكتلة نفسها.
يمكن للسياسة الخشنة أن تتعايش مع ذلك. الهوية لا تستطيع، لذا وثّق العميل بدلًا من الثقة بمصدر حزمه الظاهري.
سجّل الفئة، لا الحكم
أبقِ فئات الفشل منفصلة في السجل: لا واجهة على الإطلاق، واجهة موجودة لكن الوجهة غير قابلة للوصول، ووجهة قابلة للوصول لكن المصادقة مرفوضة. هؤلاء ثلاثة مالكين مختلفين، وكل واحد يفتح تحقيقًا مختلفًا.
دمجها في «VPN معطل» واحد يرسل التقرير إلى فريق لا يستطيع إصلاحه. الفئة هي الناتج المفيد؛ والحكم هو ما يجعله خاطئًا.