在使用 WSL 2 的过程中,网络问题往往是最让人头疼的部分。无论是局域网内的其他设备想要访问 WSL 中运行的服务,还是在 VPN 环境下遇到了 DNS 解析失败,这些问题都可以通过切换到镜像网络模式来解决。
什么是镜像模式
WSL 2 本质上是一个运行在 Hyper-V 上的轻量级虚拟机,默认采用 NAT 网络模式,拥有独立的虚拟子网 IP(172.x.x.x),与宿主机网络隔离。这导致外部设备无法直接访问 WSL 中的服务,VPN 环境下还经常出现 DNS 解析失败的问题。
镜像模式(Mirrored Networking)是微软在 Windows 11 中引入的网络模式。它的核心思路是直接将 Windows 宿主机的网络接口状态同步到 Linux 内核中,彻底消除虚拟子网带来的隔离问题:
1 | ┌────────────────────────────────────────────────────────┐ |
镜像模式的优势如下:
- 与宿主机共享相同的局域网 IP 地址
- 原生支持 IPv6
- VPN 兼容性显著提升,不再出现 DNS 丢包问题
- 局域网内其他设备可以直接发现和访问 WSL 中的服务
- Windows 防火墙规则直接作用于 WSL 中的应用
- 无需手动配置端口转发
配置 .wslconfig
镜像模式属于全局配置,需要在 Windows 用户目录下编辑 .wslconfig 文件。
第一步:打开文件资源管理器,导航到 Windows 用户目录:
1 | C:\Users\<您的用户名>\ |
第二步:在该目录下查找名为 .wslconfig 的文件。如果文件不存在,手动创建一个(注意文件名前面的点号不能漏掉)。
第三步:用记事本或任意文本编辑器打开 .wslconfig,写入以下内容:
1 | [wsl2] |
各项配置的含义如下:
networkingMode=mirrored:启用镜像网络模式,这是整份配置中最关键的一行dnsTunneling=true:通过 DNS 隧道技术解决 VPN 环境下的域名解析问题autoProxy=true:让 WSL 自动继承 Windows 系统的 HTTP 代理设置firewall=true:启用 Windows 防火墙对 WSL 流量的集成管理autoMemoryReclaim=gradual:实验性功能,允许系统逐步回收 WSL 占用的闲置内存hostAddressLoopback=true:实验性功能,支持通过主机回环地址访问 WSL 服务
第四步:保存文件后,在 Windows 终端中执行以下命令以应用配置:
1 | wsl --shutdown |
第五步:等待大约 8 秒,确保虚拟机彻底关闭,然后重新启动 WSL。
验证配置是否生效
进入 WSL 后,执行以下命令来验证网络模式是否已经切换为镜像模式:
1 | # 查看网络接口信息 |
如果配置成功,ip addr show 的输出中应该能看到 WSL 与 Windows 使用了相同的局域网 IP 地址段。
防火墙配置
切换到镜像模式后,WSL 中的应用会直接暴露在 Windows 防火墙规则之下。如果需要在局域网内访问 WSL 中运行的服务(例如端口 18789),就需要为对应的端口添加防火墙放行规则。
标准防火墙命令(推荐)
对于镜像模式,最简单的方式是使用标准的 Windows 防火墙命令。以管理员身份打开 PowerShell,执行以下命令:
1 | # 创建入站规则,允许指定端口的 TCP 流量 |
如果需要删除已经创建的规则:
1 | Remove-NetFirewallRule -DisplayName "OpenClaw-Service" |
Hyper-V 防火墙命令
如果需要更细粒度地管理 WSL 2 的网络流量,可以使用 Hyper-V 防火墙命令。不过在此之前,需要先获取当前系统的 VMCreatorId:
1 | # 查看当前系统所有已注册的 VM 创建者 |
需要注意的是,输出中的 GUID(例如 {40E0AC32-46A5-438A-A0B2-2B479E8F2E90})因系统而异,不能直接照搬网上的示例。获取到正确的 VMCreatorId 后,可以执行:
1 | # 配置默认入站策略 |
验证端口连通性
无论使用哪种方法配置防火墙,都可以通过以下命令验证端口是否已经正常开放:
1 | # 使用 Test-NetConnection 测试端口 |
如果 TcpTestSucceeded 返回 True,说明端口已经可以正常访问。
小结
镜像网络模式几乎在所有方面都优于默认的 NAT 模式。配置过程也很简单,只需要编辑一个 .wslconfig 文件,然后重启 WSL 即可生效。切换后如果需要在局域网内访问 WSL 中的服务,再配合 Windows 防火墙添加对应的端口放行规则就可以了。