لماذا لا تُعدّ بوابة جدار الحماية المرتبطة بحالة VPN قاعدة تسمح بـping عبر النفق وحده
القاعدة التي ترد على ping فقط أثناء اتصال VPN مسمّى هي سياسة للعنوان العام مرتبطة بحالة غير ذات صلة، وليست سماحًا يقتصر على النفق.
تخيّل قاعدة جدار حماية تُشغّل ICMP echo على العنوان العام للخادم كلما اتصل ملف تعريف VPN مسمّى. تبدو وكأنها تقول «ping عبر النفق فقط»، وهذا الفهم خاطئ على نحو مهم. القاعدة لا تحدّ ممّن قد يصل إلى المضيف؛ بل تغيّر ما تجيب عنه الواجهة العامة بينما يكون اتصال آخر قائمًا. هاتان سياستان مختلفتان، وإحداهما توسّع التعرّض بهدوء.
القاعدة التي تظن أنك كتبتها
المتطلّب المقصود ضيّق عادة: أن يتمكّن نظام المراقبة، أو المسؤول الوحيد على الـVPN، من التأكد من أن الخادم حيّ. حين يُكتب كجملة، يبدو كتحكّم في الوصول إلى النفق. وحين يُكتب ككائن جدار حماية، يتحوّل إلى شرط على ملف التعريف العام، لأن طلب الـecho يصل هناك.
بمجرد أن يصبح الشرط حالة اتصال بدلًا من عنوان مصدر، لم تعد مجموعة المرسلين المسموح لهم هي مجموعة أقران الـVPN. أي شخص يستطيع الوصول إلى العنوان العام يمكنه إرسال طلب echo ما دامت البوابة مفتوحة. لم يصبح النفق المسار؛ بل أصبح النفق المفتاح.
من يروّجون لهذه الفكرة لا يكذبون عادة بشأن الأثر الذي أرادوه. كانوا يحتاجون إلى فحص لا يجيب إلا حين يكون الرابط سليمًا، وكان أسهل رصد لسلامة الرابط عبر الـVPN. الخطأ هو التعامل مع إشارة توفّر كقرار وصول، ثم أتمتة ذلك.
ما تتحكّم به البوابة فعليًا
هذا التصميم يدمج أمرين مستقلّين، وفصلهما هو معظم الإصلاح. الأول هو النطاق: أي عنوان محلي، وأي عناوين بعيدة، وأي بروتوكول، وأي نوع ICMP. الثاني هو الشرط: هل كائن القاعدة مُفعّل في هذه اللحظة. النطاق هو ما يقيّمه جدار الحماية لكل حزمة؛ والشرط هو ما يكتبه نص برمجي في مخزن السياسة، والاثنان يُوفّقان بساعتين مختلفتين تمامًا.
إذا كان المتطلّب هو أقران الـVPN فقط، فالنطاق يجيب عنه دون أي منطق لحالة الاتصال: اربط القاعدة بواجهة النفق أو بنطاق عناوين النفق، واقصر العناوين البعيدة على مجموعة العملاء، وحدّد نوع echo بدلًا من «ICMP». تبقى تلك القاعدة صحيحة حين لا يكون أي VPN قائمًا، ولا يمكن أن يفتحها ملف تعريف غير ذي صلة.
إذا كان المتطلّب بوابة عامة بحق، فقل ذلك في نص السياسة، لأن معايير القبول تتغيّر. على البوابة العامة أن تسمّي ملف التعريف بدقة، وتعرّف معنى «متصل»، وتنصّ على أن المرسلين العامين داخل النطاق بحكم التصميم. معظم الالتباس يزول في اللحظة التي يُجبر فيها أحدهم على كتابة تلك الجملة.
ابنِ الكائن مرة واحدة ثم بدّل حالته
جهّز قاعدة واحدة مسبقًا بهوية مستقرة، وهي معطّلة، ودع المتحكّم يغيّر حالة تفعيلها فقط. إنشاء القواعد باسم العرض في كل تشغيل هو الطريق الذي ينتهي به مخزن السياسة إلى خمسة كائنات متشابهة تقريبًا ودون وسيلة موثوقة لإزالتها.
New-NetFirewallRule -Name "VpnGateEchoV4" -DisplayName "Public echo gated on VPN state" -Direction Inbound -Action Allow -Protocol ICMPv4 -IcmpType 8 -LocalAddress 203.0.113.10 -RemoteAddress Any -Enabled False
Set-NetFirewallRule -Name "VpnGateEchoV4" -Enabled True
الاسم هو المعرّف الدائم؛ واسم العرض توثيق يجوز للإنسان تعديله. طابِق على -Name فيتوقف النص البرمجي عن إنتاج نسخ مكرّرة. الشكل نفسه للأمر يغطّي حالة IPv6 مع -Protocol ICMPv6 -IcmpType 128، وهي قاعدة منفصلة لأن أرقام نوع echo تختلف بين العائلتين.
أبقِ عائلة العنوان ونوع ICMP صريحين لسبب ثانٍ: -Protocol ICMPv4 دون نوع يسمح بكل رسالة ICMPv4 تتيحها السياسة، بما فيها ما لم تقصد قبوله قط. وتسمية النوع 8 تضيّق القاعدة على طلب echo، وهو الشيء الوحيد الذي يرسله فحص الوصول.
حيث تناقض الأتمتة النيّة
لا يمكن لاستقصاء ملف تعريف العميل كل بضع دقائق أن ينتج حدًّا فوريًّا. بين سقوط الاتصال والاستقصاء التالي تظل القاعدة تجيب على العنوان العام؛ وبين نهوض الاتصال والاستقصاء التالي لا تجيب. الإقرار بهذا التأخير صادق، أما الادّعاء بأن التصميم يفرض شرطًا صارمًا فليس كذلك.
هناك فخّ في نطاق فحص الحالة نفسه. يبلّغ Get-VpnConnection عن ملفات تعريف العميل المهيّأة على الجهاز، للمستخدم الحالي افتراضيًا ولجميع المستخدمين مع -AllUserConnection. وهو لا يبلّغ عن المستخدمين البعيدين المتصلين حاليًا بخادم RRAS؛ فتلك ملاحظة مختلفة بأمر مختلف. والبوابة المبنية على الأمر الخاطئ غير متصلة بشيء.
ثم غطِّ الحالات التي لا يبرمجها أحد: التشغيل مع قاعدة مفعّلة أصلًا من تشغيل سابق، وتعطّل المتحكّم والبوابة مفتوحة، وحذف ملف تعريف مع بقاء قاعدته حيّة. كل حالة تحتاج افتراضيًا محدّدًا، والافتراضي الآمن لسماح عام هو التعطيل. وإن كان المتطلّب لا يحتمل فترة الاستقصاء فعلًا، فالقاعدة المرتبطة بالحالة أداة خاطئة، والإنفاذ مكانه النفق لا الواجهة العامة.
أخيرًا، اختبر الطلب العام مرتين، مرة والاتصال المختار قائم ومرة وهو متوقف، من مضيف غير موجود على الـVPN. نجاح ping من داخل النفق لا يثبت شيئًا عن هذه السياسة، وذلك هو القياس الذي تتخطّاه معظم عمليات النشر.