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 อาจสําเร็จกับที่อยู่ที่แคชไว้หรือที่อยู่ตรงตัว จากนั้นทําซ้ำหลังตัดและเชื่อมต่อใหม่ เพราะการตั้งค่าที่ทํางานครั้งเดียวและถูกสร้างใหม่เมื่อกลับมาถือว่ายังไม่เคยถูกแก้ บันทึกเนื้อหาเดิมและจดว่าองค์ประกอบใดเป็นเจ้าของพาธบนเครื่องนั้น เพื่อให้การเปลี่ยนแปลงครั้งถัดไปเริ่มจากหลักฐาน