يعمل الضيوف على شبكة libvirt الافتراضية على تحليل الأسماء بشكل مثالي حتى تُرفع واجهة WireGuard، وعندها يتوقف كل بحث عند النقطة نفسها. لا يزال dnsmasq يستمع على 192.168.122.1:53، ولا يزال الضيف يستخدم ذلك العنوان كمُحلّل له، ولا يزال الاستعلام يصل. ما تغيّر هو أن استعلام المضيف الصاعد، أو الردّ عليه، أصبح الآن يُسقط بقاعدة تُقيَّم قبل أي سلسلة تصفية قد تفكر في تعديلها. والمخرج هو علامة تُطبَّق مبكراً بما يكفي، على اتصال يرثه الردّ.

يفقد الضيوف DNS لحظة رفع النفق

تأكد من الشكل قبل تغيير أي شيء. أنزل النفق، وشغّل dig @192.168.122.1 example.com من ضيف، وراقبه يجيب. ارفع النفق، وأعد المحاولة، وراقبه ينتهي مهلته. هذا الزوج من النتائج يستبعد شبكة libvirt معطوبة، وعنوان مُحلّل خاطئاً، وdnsmasq ميتاً في خطوة واحدة.

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

لماذا لا تطلق قاعدة سماح في سلسلة لاحقة أبداً

يقرر جدار VPN القائم على العلامات بالنظر إلى علامة الحزمة أو علامة الاتصال، لا إلى عنوان المصدر. أي شيء يصل على الواجهة الفيزيائية دون العلامة المتوقعة يُرفض، ويحدث ذلك الرفض في مجموعة القواعد التي تملك اختبار العلامة. سطر ip saddr 192.168.122.0/24 accept المضاف إلى سلسلة لاحقة ما لا يُستشار أبداً لتلك الحزمة، ولهذا تبدو القاعدة البديهية صحيحة ولا تغيّر شيئاً.

توسيعها حتى يعمل شيء ما هو الفخ الثاني. قبول كامل شبكة libvirt الفرعية في مسار دخل المضيف يفتح كل خدمة على المضيف للضيوف، بينما الحاجة الفعلية منفذ واحد.

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

ضع علامة على الاستعلام قبل أن تراه جدول VPN

ضع الاستثناء في جدوله الخاص ليجده قارئ لاحق دون تحليل قواعد VPN:

table inet allowedLocal {
  chain guest_dns {
    type filter hook input priority mangle; policy accept;
    ip saddr 192.168.122.0/24 meta l4proto { tcp, udp } \
      th dport 53 ct mark set 0x00000f41
  }
}

priority mangle سالب، وهذا يضع هذه السلسلة قبل سلاسل التصفية العادية التي تثبّتها حزمة VPN عند الأولوية صفر. ترتيب الخطافات هو ما يجعل القاعدة فعّالة؛ والقاعدة نفسها في سلسلة تُرتَّب بعد سلسلة VPN ليست إلا زينة.

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

أبقِ الثقب بعرض المنفذ 53

كما هو مكتوب، يسمح هذا بـ DNS من شبكة libvirt الفرعية إلى المضيف عبر TCP أو UDP على المنفذ 53 ولا شيء غير ذلك. وهو لا يسمح للضيوف بالوصول إلى الإنترنت خارج النفق، ولا يسمح للمضيف بفتح اتصالات نحو الضيوف. وإذا احتاج ضيف إلى خدمة مضيف أخرى لاحقاً، فأضف قاعدة منفصلة تسمّي منفذ الوجهة ذلك بدل إرخاء هذه القاعدة.

كن صريحاً بشأن ما تقايضه. الضيف القادر على الوصول إلى مُحلّل يمكنه أيضاً تمرير بيانات عشوائية عبر استعلامات DNS، وهذا الاستثناء فجوة متعمّدة في حدود VPN وليس تصريحاً بأن الشبكة المحلية موثوقة. وتقييد المصدر بـ 192.168.122.0/24 يبقي الفجوة بعيداً عن كل شبكة فرعية محلية أخرى، وعدّ الاستعلامات ضد ذلك المصدر رخيص إن كان التهديد يهمّك.

اجعلها تصمد أمام إعادة التشغيل وأثبت النصفين

القاعدة المكتوبة في موجه الصدفة تختفي عند الإقلاع التالي، والقاعدة المحمّلة بعد أن تكون واجهة VPN تمرّر الحركة بالفعل تخسر السباق على الاتصال الأول. ضع الجدول في إعداد nftables الدائم للمضيف، أو في وحدة مرتبة قبل خدمة VPN، وافحص الترتيب بدل افتراضه.

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

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

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