يستمر DNS في العودة إلى حالته السابقة، وتُعيد إعادة اتصال VPN إلغاء إصلاحك، ثم يقترح أحدهم في الفريق في النهاية قفل الملف. ذلك التسلسل عَرَضٌ لا حل: مكوّنان كلاهما يعتقد أنه يملك /etc/resolv.conf، والفائز هو مَن يكتب أخيرًا. قفل الملف لا يحل تعارض الملكية، بل يخفيه فقط بينما يعطّل المكوّن الذي أردته فعلًا. نفّذ الفحوص الأربعة أدناه بالترتيب، وأصلح الترتيب على المستوى الذي يملكه لا عند الملف.

الفحص 1: هل هو رابط رمزي، وإلى ماذا

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

ls -l /etc/resolv.conf
readlink -f /etc/resolv.conf
cat /etc/resolv.conf

الرابط إلى مسار stub الخاص بـ systemd-resolved يعني أن محتويات الملف تُولَّد، وأن التحرير اليدوي سيُستبدَل عند الحدث التالي. أما الملف العادي الذي يحتوي أسطر nameserver فيكتبه عادةً أي عميل أو خطاف DHCP يعمل عند الاتصال. كلاهما مشروع؛ المهم أن تعرف أيّهما لديك قبل أن تغيّر أي شيء.

الفحص 2: أي برنامج خادم يعمل

اكتشف ما هو نشط فعليًا لا ما هو مثبّت. قد توجد عدة أدوات لحل الأسماء على توزيعة حديثة، والتي تحتفظ بالمنفذ 53 على واجهة loopback هي التي تُجيب:

systemctl status systemd-resolved --no-pager
resolvectl status
ss -lunp | grep ':53'

تذكر خوادم DNS لكل وصلة ونطاقات التوجيه في مخرجات الحالة، وهي الخريطة التي تحتاجها لـ split DNS. إذا وجب أن تذهب الأسماء الداخلية إلى خادم داخلي وكل شيء آخر إلى خادم عام، فإن تلك السياسة تعيش في نطاقات كل وصلة، وتسطيحها في قائمة nameserver ثابتة داخل الملف يُفقد التمييز بصمت.

إعداد NetworkManager نفسه يحدد أي هذه الخلفيات يستخدم. تحدد خانة dns= في ملف الإعداد الرئيسي الاختيار بين أداة الحل الداخلية وdnsmasq وsystemd-resolved وnone، وقد تكون التوزيعة اختارت نيابةً عنك. اقرأ ذلك الإعداد قبل أن تقرر ما يعنيه “إصلاح DNS” على هذا المضيف.

الفحص 3: ما يُسمح لعميل VPN بكتابته

هنا يعيش التعارض عادةً. عميل VPN يعيد كتابة ملف الحل مباشرة سيعارك أي خدمة تحتفظ به أيضًا، والخاسر هو مَن يعمل أولًا. يمكن لإصدارات OpenVPN الحديثة أن تسلّم إعدادات DNS إلى systemd-resolved بدل إعادة كتابة الملف، وهو السلوك التعاوني الذي تريده؛ أما السكربتات الأقدم والخطافات المكتوبة يدويًا فغالبًا تستدعي أداة مساعدة قديمة أو تكتب فوق الملف ببساطة.

حالة WireGuard مشابهة في الشكل: إعداد الواجهة نفسه لا يدير DNS، بل تديره الأدوات المحيطة به عبر أداة مساعدة للحل أو تكامل resolved. وإذا ثُبّتت أداتان مساعدتان كهاتان، فستحاول كلتاهما تطبيق رؤيتها للعالم عند الاتصال.

اقرأ خطافات التشغيل والإيقاف للعميل بدل التخمين. بضعة أسطر من الصدفة في /etc/openvpn/up.sh أو دليل مكافئ تشرح سلوكًا يبدو عشوائيًا بغير ذلك، وهي أيضًا المكان الذي تجعل فيه العميل يتعاون بدل أن يتنافس.

الفحص 4: أصلحه عند المالك، لا عند الملف

بعد أن تعرف المالك، اضبط DNS عبر الواجهة المدعومة لذلك المالك. بالنسبة إلى systemd-resolved يعني ذلك إعدادات لكل وصلة ونطاقات توجيه بدل ملف ثابت؛ وبالنسبة إلى NetworkManager يعني إعدادات DNS في ملف تعريف الاتصال والخلفية المختارة؛ وبالنسبة إلى توزيعة تستخدم تكامل resolvconf يعني الكتابة عبر تلك الأداة المساعدة.

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

حيث يجب أن يتعايش مكوّنان حقًا، أعطهما وظيفتين مختلفتين. دع مدير الشبكة يملك إعداد مستوى الواجهة، ودع عميل VPN يساهم بـ DNS والنطاقات لكل وصلة عبر التكامل نفسه، وأزل السكربت الثالث الذي يكتب الملف مباشرة. توضح وثائق systemd-resolved الأوضاع التي يدعمها وما يعرضه كل منها في /etc/resolv.conf. اختر الوضع الذي يناسب قدر السياسة التي تحتاج إلى الاحتفاظ بها. إذا كان split DNS مهمًا، فإن ترتيب stub مع نطاقات لكل وصلة يحافظ عليه، بينما الوضع الذي ينسخ خوادم المنبع إلى الملف يمحوه بصمت.

تحقّق بعد إعادة الاتصال، لا بعد التحرير

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

resolvectl query build.corp.example
resolvectl query example.com
resolvectl status | head -40

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

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

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