症状

WSL2 里上网/拉包经常卡十几秒:

  • 冷域名解析超时 8~11 秒,github.com 的 AAAA 查询超时 10 秒、getaddrinfo 共 15 秒
  • 但同一时刻下载国内镜像有 5~6 MB/s,说明不是带宽问题

原因

WSL 的 DNS 默认走隧道:/etc/resolv.conf → 10.255.255.254 → Windows DNS Client → Windows 上配置的 DNS。

本机 WLAN 配的 DNS(1.12.12.12、120.53.53.53)在当前网络里明文 UDP/53 被拦截,全部超时;Windows 自己正常是因为它的 DNS Client 启用了 DoH(doh.pub),而 WSL 的隧道转发不走 DoH,所以所有未命中缓存的查询(尤其 AAAA)都要等 8~10 秒超时。

另外 WSL 没有全局 IPv6、没有 v6 默认路由,查到的 AAAA 记录还会引发无效的 IPv6 连接尝试。

解决

给 WSL 直接指定实测可通的 DNS(路由器 192.168.0.1、223.5.5.5):

  1. /etc/wsl.conf 增加:
1
2
[network]
generateResolvConf=false
  1. 替换 /etc/resolv.conf(原本是指向 /mnt/wsl/resolv.conf 的符号链接,先 rm 再新建):
1
2
3
nameserver 192.168.0.1
nameserver 223.5.5.5
options timeout:2 attempts:2
  1. 重启 WSL 生效:wsl --shutdown(会一并停掉 Docker Desktop 的发行版,需重启 Docker Desktop)

效果

项目 修复前 修复后
冷域名解析 8~11s 超时 0.029s
github.com AAAA 10s 超时 0.028s
github getaddrinfo 15.0s 0.025s