在 Windows 上开发时,WSL2 (Windows Subsystem for Linux) 几乎是必装的工具。但是,如果你同时使用了代理软件(尤其是开启了 TUN 模式 接管系统流量),你可能会遇到非常诡异的网络问题。

本文复盘一次典型的 WSL2 网络故障排查过程,分析 DNS 超时与 MTU 黑洞的成因,并介绍 Windows 11 下最完美的解决方案:镜像网络模式 (Mirrored Mode)

1. 故障现象:从 DNS 失败到连接卡死

在排查过程中,网络故障呈现出两个明显的阶段:

阶段一:DNS 解析彻底失效

最初的症状是 WSL2 内部无法解析域名。
配置了静态 DNS (如 8.8.8.8) 后,执行 nslookup 会直接报错:

1
;; communications error to 8.8.8.8#53: timed out

此时,WSL2 的网络请求完全发不出去。

阶段二:DNS 好了,但连接“卡住”了

在调整 DNS 设置(改为自动获取)后,nslookup 终于通了,并且返回了代理软件生成的 Fake-IP(例如 198.18.x.x)。

看似问题解决了,但当我尝试 curlping 实际网址时,终端却一直卡住,直到超时:

1
2
$ curl https://www.google.com
curl: (28) Connection timed out after 30001 milliseconds

这就非常诡异了:域名能解析,但数据包发不出去。

2. 核心原因深度分析

这个问题的根源在于 WSL2 默认的 NAT 网络模式Windows 宿主机上的 TUN 虚拟网卡 之间存在严重的兼容性冲突。

2.1 路由黑洞 (导致 DNS 失败)

Clash 等软件的 TUN 模式会通过修改路由表接管 Windows 的所有流量。
WSL2 在默认的 NAT 模式下,对于宿主机来说,其实是一个“外部”的局域网设备(通过 Hyper-V 虚拟交换机连接)。
当你强制请求 8.8.8.8 时,流量从 WSL2 出来进入 Windows,被 TUN 网卡吸走。由于路由规则或 NAT 转换处理不当,回包找不到回家的路(无法正确路由回 WSL2 的虚拟子网),导致 DNS 超时。

2.2 MTU 不匹配 (导致 Curl 卡死)

这是最隐蔽的坑,也是导致“阶段二”故障的元凶。

  • WSL2 默认网卡 (eth0) 的 MTU (最大传输单元) 通常是 1500
  • 代理软件的 TUN 虚拟网卡 为了处理加密和头部封装,MTU 通常较小(一般在 1300-1400 左右)。

故障流程如下:

  1. DNS 请求:DNS 数据包很小(远小于 1300 字节),所以能顺利通过 TUN 网卡,DNS 解析成功。
  2. HTTP 请求curl 发起 HTTP 请求时,握手后的数据包通常较大。WSL2 按照 1500 的 MTU 发包,但数据包到达 Windows 的 TUN 网卡时,因为超过了 TUN 的 MTU 限制且无法分片(或分片处理失败),直接被丢弃。

这就是为什么你看着终端“卡住”了:小包能过,大包全丢。

3. 终极解决方案:开启镜像网络 (Mirrored Mode)

在以前,我们可能需要手动修改 WSL2 的 MTU 或者编写复杂的防火墙脚本。但在 Windows 11 (22H2 及以上版本) 中,微软推出了一个杀手级功能:镜像网络模式

它废弃了 WSL2 独立的 NAT 虚拟网卡,让 WSL2 直接“复用” Windows 的物理/虚拟网卡。

操作步骤

  1. 在 Windows 用户主目录 (C:\Users\<你的用户名>\) 下,创建或编辑 .wslconfig 文件。
  2. 写入以下配置:
1
2
3
4
5
6
7
8
[wsl2]
# 开启镜像网络模式
networkingMode=mirrored

# (可选) 开启以下功能以获得更好的体验
dnsTunneling=true
firewall=true
autoProxy=true
  1. 保存文件后,在 PowerShell 中重启 WSL:
1
wsl --shutdown
  1. 重新进入 WSL 即可生效。

为什么这是最佳方案?

开启镜像网络后:

  • IP 地址共享:WSL2 不再有独立的局域网 IP,它直接共享 Windows 的 IP(包括代理软件的 TUN 网卡 IP,如 198.18.0.1)。
  • DNS 共享:WSL2 自动使用宿主机的 DNS 设置,无缝接入代理。
  • MTU 同步:WSL2 会自动适配 Windows 网卡的 MTU 设置,彻底解决了大包被丢弃的问题。
  • 互通性:Windows 访问 WSL 服务直接用 localhost,不再需要查虚拟 IP。

总结

如果你在使用 WSL2 + TUN 模式时遇到网络奇奇怪怪的问题,不要去折腾 /etc/resolv.conf 或者手动改 MTU 了。直接升级到 Windows 11 并开启 Mirrored Mode,这是目前最现代、最一劳永逸的解决方案。