Problem entry · machine-readable · 编码代理与终端

WSL 里报 Temporary failure in name resolution / 连不上网,VPN 一连上 WSL 就断网

本页嵌入 #trove-entity JSON(本条目全量结构化数据);全库数据见 /agent/trove.json。

元数据

idwsl-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)