วิกิภายในโหลดใน Edge แต่ git clone ในดิสทริบิวชันหมดเวลา การสังเกตเดียวนี้มักถูกอ่านว่า «VPN กำลังบล็อก WSL2» และชั่วโมงถัดมาหมดไปกับการแก้ไข /etc/resolv.conf การอ่านที่มีประโยชน์กว่าคือ WSL2 ไม่เคยมีเส้นทางเครือข่ายของโฮสต์ตั้งแต่แรก มันทำงานใน VM ช่วยที่มีอะแดปเตอร์ของตัวเอง มีเส้นทางของตัวเอง และมีไฟล์ resolver ที่ Windows สร้างให้ ทุกอย่างที่ตามมาขึ้นอยู่กับว่าสิ่งใดในสามอย่างนั้นที่คุณขาดจริง ๆ

VM มีสแตก เมตริก และ resolver ของตัวเอง

ในโหมด NAT เริ่มต้น ดิสทริบิวชันอยู่หลังสวิตช์เสมือนและเข้าถึงอินเทอร์เน็ตผ่านโฮสต์ แต่ไม่เห็นอะแดปเตอร์ของโฮสต์ ip addr แสดงอินเทอร์เฟซหนึ่งอันที่มีที่อยู่ส่วนตัว ip route แสดงเส้นทางเริ่มต้นผ่านสวิตช์นั้น และ /etc/resolv.conf เป็นไฟล์ที่สร้างขึ้นซึ่งชี้ไปยัง stub resolver ที่ Windows เลือก ไม่มีสิ่งใดเปลี่ยนแปลงเพราะไคลเอนต์ VPN เริ่มทำงานฝั่ง Windows

นั่นคือเหตุผลที่ «เบราว์เซอร์ใช้งานได้» พิสูจน์ได้น้อยมาก เบราว์เซอร์ใช้สแตกของโฮสต์ อุโมงค์ และนโยบาย resolver ของโฮสต์ เชลล์ของคุณใช้สแตกอื่นซึ่งบังเอิญใช้การ์ดเครือข่ายทางกายภาพร่วมกัน พวกมันตรงกันในกรณีที่ดีและแตกต่างกันตรงจุดที่ VPN ติดตั้งฟิลเตอร์ เขียนรายการ DNS ใหม่ หรือเพิ่มเส้นทางสำหรับซับเน็ตของสวิตช์เสมือน

การทดสอบสองอย่างตัดสินว่าคุณอยู่ในโลกไหน และต้องรันภายในดิสทริบิวชัน:

getent hosts example.com
curl -sS -m 8 -o /dev/null -w "%{http_code}\n" 1.1.1.1
ip route
cat /etc/resolv.conf

ชื่อล้มเหลวในขณะที่ที่อยู่ตามตัวอักษรตอบกลับคือปัญหา resolver ชื่อและที่อยู่ล้มเหลวพร้อมกันคือปัญหาเส้นทาง และการแก้ไข resolver จะไม่แตะต้องมัน ต่อไปคือหลักฐานฝั่ง Windows: Get-NetAdapter | Get-DnsClientServerAddress และ route print -4 แสดงว่าอุโมงค์ยึดซับเน็ตที่ VM ของคุณอาศัยอยู่หรือไม่

ความเชื่อผิดที่หนึ่ง: เซิร์ฟเวอร์ DNS ขององค์กรแก้ให้

การแก้ไขไฟล์ resolver เป็นคำแนะนำคลาสสิกและถูกต้องประมาณครึ่งหนึ่ง เมื่อถูกต้องก็ด้วยเหตุผลเฉพาะ: ไฟล์ที่สร้างขึ้นชี้ไปยัง resolver ที่รู้จักเฉพาะชื่อสาธารณะ คำถามสำหรับ intranet.example.internal จึงกลับมาเป็นไม่มีอยู่แม้เส้นทางจะดี

การปักหมุดเซิร์ฟเวอร์ของ VPN หมายถึง การหยุด Windows ไม่ให้สร้างไฟล์ใหม่ เพราะไฟล์ใดก็ตามที่คุณเขียนด้วยมือจะถูกแทนที่เมื่อเริ่มครั้งถัดไป:

[network]
generateResolvConf = false

บันทึกสิ่งนั้นเป็น /etc/wsl.conf รัน wsl --shutdown จาก Windows จากนั้นเริ่มดิสทริบิวชันและเขียน /etc/resolv.conf โดยให้เซิร์ฟเวอร์ของอุโมงค์มาก่อนและใช้ resolver สาธารณะเป็นเพียงสำรอง นี่คือการเปลี่ยนแปลงถาวรที่มีค่าใช้จ่ายในการดูแล: ไฟล์ไม่ตามโฮสต์อีกต่อไป เมื่อที่อยู่ DNS ขององค์กรเปลี่ยน ดิสทริบิวชันยังคงถามที่อยู่เก่า ต้องมีคนเป็นเจ้าของไฟล์นั้น

มันไม่ทำอะไรเช่นกันเมื่อความล้มเหลวกว้างกว่า หาก curl ไปยัง 1.1.1.1 หมดเวลา ไคลเอนต์อุโมงค์กำลังกรองสวิตช์เสมือนหรือกำหนดเส้นทางซับเน็ตของ VM เข้าสู่อุโมงค์ และ resolver ที่ถูกต้องก็ให้เพียงชื่อที่ยังเข้าถึงไม่ได้

ความเชื่อผิดที่สอง: การเปลี่ยนเมตริกอยู่ได้

เมื่อชื่อแก้ได้แต่ทราฟฟิกออกผ่านอะแดปเตอร์ทางกายภาพ เมตริกอินเทอร์เฟซคือคันโยก ให้อะแดปเตอร์ VPN ต้นทุนสูงและสวิตช์ WSL ต้นทุนต่ำ:

Get-NetAdapter | Where-Object InterfaceDescription -Match "AnyConnect" | Set-NetIPInterface -InterfaceMetric 4000
Get-NetIPInterface -InterfaceAlias "vEthernet (WSL)" | Set-NetIPInterface -InterfaceMetric 1

จากนั้นจำไว้ว่าในหลายบิลด์ของไคลเอนต์ อะแดปเตอร์อุโมงค์ถูกสร้างใหม่ทุกการเชื่อมต่อและเมตริกกลับไปเป็นค่าเริ่มต้น คำสั่งครั้งเดียวคือการซ่อมที่หมดอายุอย่างเงียบ ๆ มักเกิดขึ้นในช่วงสุดสัปดาห์ และตั๋วกลับมาพร้อม «สัปดาห์ที่แล้วมันทำงานได้» งานตามกำหนดที่เริ่มจากเหตุการณ์ VPN หรือสคริปต์ที่ผู้ใช้รันหลังเชื่อมต่อ คือเวอร์ชันที่ซื่อสัตย์ของการซ่อมนี้

วันหมดอายุเดียวกันใช้กับเส้นทางโฮสต์ที่เพิ่มสำหรับคำนำหน้าหัวแข็งหนึ่งรายการ มันมีค่าในฐานะการวินิจฉัย เพราะบอกว่าปัญหาคือปลายทางเดียวหรือทั้งเส้นทาง แต่ไม่ใช่สถาปัตยกรรม

ความเชื่อผิดที่สาม: การซ่อมครั้งเดียวครอบคลุมทุกบิลด์ของ Windows

ApproachWhat it actually does
Resolver pinFixes private names only; no effect on path failures
Sidecar distributionForwards traffic over a socket to a helper VM, so the switch's filter no longer matters
Mirrored networkingGives the distribution the host's interface set; also enables DNS tunnelling

wsl-vpnkit คือรูปแบบ sidecar: ดิสทริบิวชันเล็กเป็นเจ้าของเส้นทางฝั่งโฮสต์และส่งต่อให้ดิสทริบิวชันอื่นผ่านซ็อกเก็ตเสมือน ทราฟฟิกแอปจึงหยุดพึ่งพาสวิตช์ที่ถูกกรอง ต้องให้เส้นทางมาตรฐานทำงาน ซึ่งหมายถึงลบการเขียนทับ networkingMode และ dnsTunneling ออกจาก %UserProfile%\.wslconfig คืนค่า generateResolvConf = true ในทุกดิสทริบิวชันที่ทำงาน และเริ่มบริการเมื่อเข้าสู่ระบบ

โหมดกระจกเป็นทางเลือกในตัวบน Windows 11 22H2 และใหม่กว่า และเป็นเพียงการตั้งค่าหนึ่งบวกการปิดหนึ่งครั้ง:

[wsl2]
networkingMode=mirrored

ภายในดิสทริบิวชัน ip addr จะแสดงอะแดปเตอร์ของโฮสต์ อุโมงค์อาจปรากฏในหมู่พวกมัน และ อุโมงค์ DNS ส่งต่อการค้นหาผ่าน resolver ของ Windows แม้ไคลเอนต์จะเขียนรายการ DNS ใหม่ มันไม่ใช่สากล: ไดรเวอร์ฟิลเตอร์บางตัวยังคงทิ้งเส้นทางกระจก และกฎไฟร์วอลล์ของ Hyper-V อาจต้องอนุญาตอย่างชัดเจน คู่มือเครือข่าย WSL ของ Microsoft คือหน้าที่ควรเทียบกับบิลด์ของคุณก่อนใช้สูตรที่เขียนสำหรับรุ่นใหม่กว่า

ทดสอบสามอย่างหลังทุกการเปลี่ยนแปลง

เลือกกลไกหนึ่งต่อเครื่องและจดไว้ เพราะทั้งสองรวมกันได้ไม่ดี sidecar บนโหมดกระจกเพิ่มการส่งต่อเป็นสองเท่า และโฮสต์กระจกที่มีรายการ sidecar ล้าสมัยใน .wslconfig มักล้มเหลวหลังการอัปเกรด ไม่ใช่ก่อนหน้า

ไม่ว่าคุณเลือกอะไร การทดสอบการยอมรับคือคำขอสามอย่างเดิมภายในดิสทริบิวชัน: ชื่อภายใน ชื่อสาธารณะ และที่อยู่ดิบ จากนั้นทำซ้ำหลังตัดและเชื่อมต่ออุโมงค์ใหม่ และหลัง wsl --shutdown หากเฉพาะชื่อภายในล้มเหลวคือ นโยบาย resolver; หากชื่อภายในและชื่อสาธารณะล้มเหลวพร้อมกันในขณะที่ที่อยู่ทำงาน ก็ยังเป็นนโยบาย resolver; หากทุกอย่างล้มเหลวคือเส้นทาง

หากโฮสต์ภายในตัวเดียวล้มเหลวในขณะที่ที่เหลือทำงาน ให้หยุดดู resolver และหาเส้นทางที่ขาดหายสำหรับคำนำหน้านั้น หากทุกอย่างทำงานจนถึงการเชื่อมต่อใหม่ครั้งถัดไป คุณพบการซ่อมที่ขึ้นกับสถานะขณะรัน และต้องนำไปใช้ซ้ำโดยอัตโนมัติหรือแทนที่ด้วยกลไกใดกลไกหนึ่งข้างต้น

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