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

บทความที่เกี่ยวข้อง