元数据
| id | wsl-dns-resolution-failure | 收录 | 2026-08-31 |
|---|---|---|---|
| 问题域 | 编码代理与终端 | 主题分组 | 容器与 WSL |
| 适用工具 | wsl · 外部工具 | ||
症状
```
$ curl -I https://github.com
curl: (6) Could not resolve host: github.com
$ apt update
Temporary failure resolving 'archive.ubuntu.com'
$ getent hosts github.com
(无输出,exit=2)
```
特征:Windows 侧上网正常;`ping 8.8.8.8` 通但域名全解析失败;VPN 一连上就断;重启 WSL 后复发(被覆盖)。
原因
WSL2 NAT 模式下 DNS 由 Windows 侧下发:`generateResolvConf=true` 每次启动重写 `/etc/resolv.conf`;systemd 发行版走 stub(127.0.0.53)再转发上游;VPN 的 DNS 在隧道内不可达 → 转发失败 → `Temporary failure in name resolution`。三个断点:resolv.conf 被写错/覆盖、stub 上游不可达、NAT 通道被 VPN 破坏。
解法
1. 定位:`ping 223.5.5.5`(路由)vs `getent hosts github.com`(DNS);2. systemd 发行版:`/etc/systemd/resolved.conf` 设 `DNS=223.5.5.5 119.29.29.29` + `systemctl restart systemd-resolved`;3. 防覆盖:`/etc/wsl.conf` `generateResolvConf=false`;4. VPN 场景:`.wslconfig` `dnsTunneling=true` 或 `networkingMode=mirrored`;5. 验证:`getent hosts github.com` + `curl -I`,重启 WSL 后仍通。
验证证据
- 本机实测(2026-08-31,定制预构建版 WSL,DNS 机制与 WSL 版本无关):实测复现日志(2026-08-31)
- 基线:resolv.conf=stub(127.0.0.53)、resolved.conf 上游=223.5.5.5/119.29.29.29、`getent hosts github.com` → 20.205.243.166;
- 复现:resolv.conf 指向不可达地址(203.0.113.1)→ `getaddrinfo` 报 `[Errno -3] Temporary failure in name resolution`、`getent` exit=2;UDP 探测 127.0.0.53 正常应答 / 203.0.113.1 超时;
- 恢复:还原 resolv.conf 后解析恢复正常(trap 兜底 + 显式恢复,无残留);
- 治本配置与本文推荐一致:wsl.conf `generateResolvConf=false` + resolved.conf 公共上游。
- 未实测(如实标注):VPN 场景(本机无 VPN)、dnsTunneling/mirrored 切换(会动网络栈)。
来源与证据
素材来源:https://learn.microsoft.com/windows/wsl/troubleshooting
验证证据:Evidence details kept locally (2026-08-31)