wsl2中ipv6速度慢
症状
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):
/etc/wsl.conf增加:
1 | [network] |
- 替换
/etc/resolv.conf(原本是指向/mnt/wsl/resolv.conf的符号链接,先rm再新建):
1 | nameserver 192.168.0.1 |
- 重启 WSL 生效:
wsl --shutdown(会一并停掉 Docker Desktop 的发行版,需重启 Docker Desktop)
效果
| 项目 | 修复前 | 修复后 |
|---|---|---|
| 冷域名解析 | 8~11s 超时 | 0.029s |
| github.com AAAA | 10s 超时 | 0.028s |
| github getaddrinfo | 15.0s | 0.025s |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Dev!