resolv.conf في WSL 2: يتوقف DNS عند اتصال VPN
يعيد WSL توليد resolv.conf من محوّلات Windows التي يراها، لذا قد لا يصل مُحلّل VPN أبدًا. أوقف التوليد، ثم اختبر اسمًا مؤسسيًا.
التصفّح داخل التوزيعة يعمل، وأول اسم مضيف داخلي يفشل في لحظة صعود النفق. الغريزة هي إضافة مُحلّل عام، وهو ما يعيد الإنترنت ويجعل الاسم المؤسسي غير قابل للوصول لبقية اليوم. في WSL 2، /etc/resolv.conf مخرَج مولَّد لا إعداد، وهذا هو المبدأ الجدير بالفهم. الإصلاح ليس مُحلّلًا أفضل، بل ملكية الملف.
الملف مولَّد، لا مُهيَّأ
يكتب WSL 2 الملف عند بدء التشغيل انطلاقًا من محوّلات Windows التي يراها في تلك اللحظة، ويطبع تعليقًا في أعلاه يقول ذلك. وعندما يضيف عميل VPN محوّلًا أو يعيد كتابته بعد ذلك، لا تعيد التوزيعة توليد أي شيء بالضرورة، ويبقى الملف يصف شبكة لم تعد موجودة.
هناك نمط فشل ثانٍ أهدأ: قد ينسخ WSL الخوادم من بعض المحوّلات فقط. إذا كان المحوّل الفيزيائي يملك أصلًا مُحلّل IPv6، فقد تُسقَط خوادم IPv4 التي يوفّرها محوّل VPN بدل إضافتها، ويبدو الملف كاملًا بينما يغفل تحديدًا الخادم الذي يجيب عن الأسماء الداخلية.
قارن عرض Windows بعرض Linux
اقرأ الجانبين قبل التحرير. داخل التوزيعة، انظر في محتوى الملف وما إذا كان ملفًا عاديًا أم رابطًا. على Windows، اسرد المُحلّل لكل محوّل، بما في ذلك المحوّل الذي أنشأه VPN:
ls -l /etc/resolv.conf
cat /etc/resolv.conf
Get-DnsClientServerAddress -AddressFamily IPv4
Get-NetAdapter | Where-Object Status -eq 'Up'
عندما يُظهر محوّل VPN خوادم الشركة ويُظهر Linux شيئًا آخر، فالاختلاف في التوليد لا في إمكانية الوصول. قارن قائمة المحوّلات إضافة إلى العناوين، لأن محوّلًا مفقودًا يفسّر خادمًا مفقودًا. هذا التمييز يحدّد ما إذا كنت تصلح WSL أم تصلح جدارًا ناريًا، ولا شيء مشترك بين الاثنين.
عطّل التوليد واكتب ملفك بنفسك
هناك إعداد موثّق واحد يمنع WSL من إعادة كتابة الملف، وهو موجود في /etc/wsl.conf. أضف قسم شبكة إلى ذلك الملف:
[network]
generateResolvConf = false
ثم أنهِ التوزيعة من Windows باستخدام wsl --shutdown وابدأها من جديد. إذا كان المسار رابطًا رمزيًا لا ملفًا عاديًا، فاحذف الرابط قبل كتابة محتواك، لأن الكتابة عبر الرابط قد تعيد إنشاء الهدف المولَّد عند التشغيل التالي. من تلك اللحظة الملف ملكك ولا شيء يعيد كتابته.
nameserver 172.28.4.10
nameserver 172.28.4.11
search site.corp.example
options timeout:1 attempts:2 rotate
بدون نطاق بحث، يُكمَل اسم المضيف غير المؤهَّل بالجذر العام ويعود بنتيجة عدم وجود نطاق كهذا. يمنع timeout خادمًا أول ميتًا من تعطيل كل بحث، ويحدّ attempts من عدد المحاولات التي ينفقها البحث، ويوزّع rotate إعادات المحاولة بدل البدء من الأعلى دائمًا. المقايضة أن الملف لم يعد يتبع VPN يتغيّر عنوان مُحلّله بين الجلسات.
تعامل مع مُحلّل يتغيّر، ثم تحقّق
بعض العملاء يمنحون مُحلّلًا خاصًا بالجلسة، لذا ينكسر ملف ثابت عند الاتصال التالي. مقاربتان مقبولتان. اكتب الملف من سكربت صغير كلما تغيّر العنوان، أو أبقِ التوليد مفعّلًا وتأكد من أن المحوّل الذي ينسخ منه WSL يحمل خادم الشركة. الثاني لا يحتاج خطافًا ويفشل كلما تخطّى التوليد محوّل VPN؛ وكلاهما لا يزال يتطلب حلّ تعارض IPv6 أولًا.
يطبّق Windows أيضًا سياسات أسماء خاصة به، مثل قائمة بحث لاحقات أو سياسة تحليل لنطاقات محددة، ونسخ عناوين المحوّلات لا يستنسخ تلك القواعد. إذا حُلّ اسم على Windows ولم يُحلّ في التوزيعة بالخادم نفسه، فقارن معالجة اللاحقات قبل لوم النفق.
اختبر باسم لا بحزمة: getent hosts sensor-access0.corp.example يمر عبر مكدّس المُحلّل، بينما قد ينجح ping تجاه عنوان مخزَّن أو حرفي. ثم كرّر بعد قطع الاتصال وإعادة الوصل، لأن إعدادًا يعمل مرة واحدة ويُعاد توليده عند الاستئناف لم يُصلَح قط. احفظ المحتوى السابق ولاحظ أي مكوّن يملك المسار على ذلك الجهاز، كي يبدأ التغيير التالي بدليل.