WSL 镜像网络模式配置


在使用 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌────────────────────────────────────────────────────────┐
│ Windows 主机 │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ WSL 2 虚拟机 (镜像) │ │
│ │ │ │
│ │ eth0: 与宿主机共享相同局域网 IP │ │
│ │ 直接暴露在 Windows 防火墙中 │ │
│ └──────────────────────────────────────────────────┘ │
│ │ │
│ │ (网络接口直接同步) │
│ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 物理网络 / Internet │ │
│ └──────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────┘

镜像模式的优势如下:

  • 与宿主机共享相同的局域网 IP 地址
  • 原生支持 IPv6
  • VPN 兼容性显著提升,不再出现 DNS 丢包问题
  • 局域网内其他设备可以直接发现和访问 WSL 中的服务
  • Windows 防火墙规则直接作用于 WSL 中的应用
  • 无需手动配置端口转发

配置 .wslconfig

镜像模式属于全局配置,需要在 Windows 用户目录下编辑 .wslconfig 文件。

第一步:打开文件资源管理器,导航到 Windows 用户目录:

1
C:\Users\<您的用户名>\

第二步:在该目录下查找名为 .wslconfig 的文件。如果文件不存在,手动创建一个(注意文件名前面的点号不能漏掉)。

第三步:用记事本或任意文本编辑器打开 .wslconfig,写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[wsl2]
# 启用镜像网络模式 - 这是最重要的配置
networkingMode=mirrored
# 启用 DNS 隧道,防止 VPN 环境下域名解析失效
dnsTunneling=true
# 强制 WSL 使用 Windows 的 HTTP 代理设置
autoProxy=true
# 启用集成防火墙支持
firewall=true

[experimental]
# 自动回收闲置内存,优化性能
autoMemoryReclaim=gradual
# 支持主机回环地址访问
hostAddressLoopback=true

各项配置的含义如下:

  • 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
2
3
4
5
6
7
8
# 查看网络接口信息
ip addr show

# 查看路由表
ip route show

# 测试与局域网网关的连通性
ping 192.168.1.1

如果配置成功,ip addr show 的输出中应该能看到 WSL 与 Windows 使用了相同的局域网 IP 地址段。

防火墙配置

切换到镜像模式后,WSL 中的应用会直接暴露在 Windows 防火墙规则之下。如果需要在局域网内访问 WSL 中运行的服务(例如端口 18789),就需要为对应的端口添加防火墙放行规则。

标准防火墙命令(推荐)

对于镜像模式,最简单的方式是使用标准的 Windows 防火墙命令。以管理员身份打开 PowerShell,执行以下命令:

1
2
3
4
5
# 创建入站规则,允许指定端口的 TCP 流量
New-NetFirewallRule -DisplayName "OpenClaw-Service" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 18789

# 验证规则是否创建成功
Get-NetFirewallRule -DisplayName "OpenClaw-Service" | Format-Table

如果需要删除已经创建的规则:

1
Remove-NetFirewallRule -DisplayName "OpenClaw-Service"

Hyper-V 防火墙命令

如果需要更细粒度地管理 WSL 2 的网络流量,可以使用 Hyper-V 防火墙命令。不过在此之前,需要先获取当前系统的 VMCreatorId:

1
2
# 查看当前系统所有已注册的 VM 创建者
Get-NetFirewallHyperVVMCreator

需要注意的是,输出中的 GUID(例如 {40E0AC32-46A5-438A-A0B2-2B479E8F2E90})因系统而异,不能直接照搬网上的示例。获取到正确的 VMCreatorId 后,可以执行:

1
2
3
4
5
6
7
# 配置默认入站策略
Get-NetFirewallHyperVVMCreator | ForEach-Object {
Set-NetFirewallHyperVVMSetting -Name $_.Name -DefaultInboundAction Allow
}

# 创建细粒度的端口规则
New-NetFirewallHyperVRule -DisplayName "OpenClaw-Service" -Direction Inbound -Action Allow -Protocol TCP -LocalPorts 18789

验证端口连通性

无论使用哪种方法配置防火墙,都可以通过以下命令验证端口是否已经正常开放:

1
2
# 使用 Test-NetConnection 测试端口
Test-NetConnection -ComputerName localhost -Port 18789

如果 TcpTestSucceeded 返回 True,说明端口已经可以正常访问。

小结

镜像网络模式几乎在所有方面都优于默认的 NAT 模式。配置过程也很简单,只需要编辑一个 .wslconfig 文件,然后重启 WSL 即可生效。切换后如果需要在局域网内访问 WSL 中的服务,再配合 Windows 防火墙添加对应的端口放行规则就可以了。