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

حماية إعادة الربط موجودة لإيقاف حيلة واحدة محددة. الاسم الخاص المنشور عن عمد يبدو مشابهًا بما يكفي كي تنطلق الحماية.

اقرأ الإجابة قبل أن تقرأ السياسة

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

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

ما الذي توقفه الحماية فعليًا

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

يوثّق dnsmasq هذا السلوك بالضبط، إلى جانب استثناءات لكل نطاق. تصف صفحة الدليل التابعة له rebind-domain-ok كطريقة لتسمية النطاقات التي يجوز لها إرجاع مثل هذه العناوين. اقرأ ذلك كإشارة إلى أن الإصلاح المقصود سماح محدود النطاق، لا مفتاح عام.

حدّد الاستثناء على مستوى نطاق الأسماء

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

# ask the resolver the VPN pushed, and show the full answer
dig +noall +answer db.corp.example @10.40.0.1
dig +short db.corp.example @10.40.0.1

# dnsmasq: what does the running configuration already allow?
grep -R 'rebind' /etc/dnsmasq.d /etc/dnsmasq.conf

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

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

أعد اختبار المورد والحماية

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

# the internal name and the public control should behave differently
dig +short db.corp.example @10.40.0.1
dig +short www.example.com @10.40.0.1

# and the service itself, with the certificate it presents
curl -sS -o /dev/null -w '%{http_code}\n' https://db.corp.example/health

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

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

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