WSL2 networkingMode 完整配置指南:NAT、bridged、mirrored 三种模式 5 分钟改对
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
在 WSL2 里起了个服务,Windows 浏览器却连不上对应端口?想让局域网里的手机、测试机直连 WSL,又拿不到稳定 IP?这类问题的钥匙都是.wslconfig里的networkingMode。WSL2 提供 NAT(默认)、bridged、mirrored 三种网络模式,它决定了哪些设备能触达 WSL 里的服务端口。本文按"访问方向"给出判定流程、每种模式的最小配置,以及改完后的验收步骤。
WSL2 完全跑在 Windows 内部,网络模式决定"外面谁能摸到里面的端口"
🧭 networkingMode 怎么选:3 个问题定模式
这节解决"到底该选哪个模式"。从上往下问,命中哪条停在哪条:
- 这台 Windows 机器以外的人要用 WSL 里的服务吗?手机、测试机、同事电脑都要直连的话,选 bridged,不用再往下看。
- Windows 侧和 WSL 侧必须"同一张网"吗?前后端联调、本地微服务组合这类场景,Windows 浏览器要直连 WSL 里跑的服务,选 mirrored。
- 公司 PAC 代理下 DNS 或 HTTPS 时好时坏?选 mirrored 并加
dnsTunneling=true,让 DNS 走隧道,绕开代理干扰。 - 以上都不是?保持默认 NAT 即可,日常开发零配置。
用开店的比喻记一下三者的差别:
- NAT:店开在商场内部,客人得先打商场前台(Windows)的电话,由前台转进店里;
- bridged:店开在临街铺面,有自己的门牌号(IP),街上任何人按门牌都能找到;
- mirrored:店和 Windows 共用同一个门面和电话线,Windows 摸到店无需任何转接。
三种模式共用的修改流程
这节解决"配置文件怎么写、新配置怎么生效"。
用记事本打开(没有就新建)%UserProfile%\.wslconfig。注意它是INI 格式,不是 JSON,段名必须写[wsl2]:
[wsl2] networkingMode=mirrored保存后,在 PowerShell 里执行wsl --shutdown,把 WSL 虚拟机彻底重启。只关终端窗口不算重启,配置不会生效。
然后进 WSL 执行:
ip addr show eth0验收标准:输出的 IP 段应该随模式变化——NAT 通常是172.x.x.x,bridged 落在192.168.x.x或10.x.x.x这类局域网网段,mirrored 与 Windows 完全相同。没变化就跳到下面"出问题怎么办"一节排查。
想再挤出一点网络和文件系统性能,可在[wsl2]段追加virtio=true,与任一模式叠加使用。
NAT 模式:零配置默认,怎么验证
这节解决"默认模式的验收标准和最容易踩的坑"。
不写任何配置就是 NAT,也可以显式声明:
[wsl2] networkingMode=NATNAT 模式下多个发行版共用宿主机的网关和 NAT 网络,Windows 侧实现见 NatNetworking.cpp
验收两步:
- WSL 里
curl ifconfig.me返回一个公网 IP,说明出网通畅; - WSL 里某服务监听 8080,Windows 浏览器打开
localhost:8080能看到页面,说明端口转发链路通畅,转发逻辑实现在 localhost.cpp。
两条避坑:
- 绑 80、443 报
Address already in use:这两个端口多半已被 Windows 的 HTTP.sys 或 IIS 抢走。把服务换到 8080 之类的端口,或在 Windows 侧释放占用。 - 改了配置 IP 不变:十有八九是只关了终端窗口,没执行
wsl --shutdown。
bridged 模式:给 WSL 一个局域网正式 IP
这节解决"让局域网里其他设备直连 WSL 服务"的最小配置。
[wsl2] networkingMode=bridged验收:ip addr show eth0看到的应是192.168.x.x或10.x.x.x这类局域网地址(而不是 NAT 常见的172.x);再从另一台设备 ping 或访问这个 IP,能通即成功。实现见 BridgedNetworking.cpp。
两条避坑:
- eth0 拿不到 IP:公司网络做了 MAC 准入或 802.1x 认证,而 WSL 默认随机生成 MAC。用
wsl2.macAddress固定成已准入的 MAC;如果网络要求 802.1x 认证,固定 MAC 也未必管用,稳妥做法是退回 NAT。 - 切之前先确认网络允许:当前网段如果禁止新设备自动拿地址,bridged 会直接哑火,切之前最好先小范围试一下。
mirrored 模式:Windows 浏览器直连 Linux 服务
这节解决"前后端分离联调、本地微服务组合"的直连痛点。
mirrored 让两边共享同一个 IP 和端口空间,localhost在两侧指向同一张网卡:
[wsl2] networkingMode=mirrored dnsTunneling=true验收:WSL 里跑python3 -m http.server 8000(或npm start),Windows 浏览器直接打开http://localhost:8000,页面应该立刻出来。实现见 MirroredNetworking.cpp。该模式需要较新的 WSL 版本,配置不生效时先升级 WSL 再排查。
WSL2 中npm start后,Windows 浏览器访问 localhost:3000 成功——mirrored 模式的典型效果
两条避坑:
- WSL 里绑不上端口:镜像模式下端口是两边全局竞争的,Windows 侧已有程序监听 8000 时 WSL 就会启动失败。用
netstat -ano | findstr :8000查占用,换端口或停掉 Windows 侧那个程序。 - 公司 PAC 代理环境里 DNS、HTTPS 异常:保留
dnsTunneling=true,DNS 查询走隧道,绕开 Windows 代理 PAC 未作用到 Linux 侧造成的问题。
🔍 网络出问题时:按 4 步排查
这节解决"网络不对了从哪儿查起"。别乱翻,按顺序过四步:
第 1 步:查配置文件本身确认文件在%UserProfile%\.wslconfig、段名是[wsl2]、写法是 INI。三者有一个不对,写什么都不会生效。
第 2 步:查虚拟机重启过没有改完配置执行过wsl --shutdown吗?关终端窗口不算数。
第 3 步:确认宿主机有网WSL 里curl外网超时,先验证 Windows 自己能上网。NAT 接口状态偶尔会残留,宿主机确认有网后wsl --shutdown重来。
第 4 步:按现象对症
- Windows 访问端口报"地址被占用":Windows 已有进程监听同端口。
netstat -ano | findstr :8080(换成你的端口)找到占用进程,换端口或释放。 - bridged 下 eth0 无 IP:MAC 准入或 802.1x。
wsl2.macAddress固定 MAC,或退回 NAT。 - mirrored 下公司代理环境 DNS/HTTPS 异常:加
dnsTunneling=true后重启。
验收步骤:改完对照 IP 核对
这节解决"怎么确认模式真的生效了"。改完配置后,只看ip addr show eth0的输出,对着下表核对:
| 模式 | 应该看到的 IP | 附加确认 |
|---|---|---|
| NAT | 172.x.x.x类内网地址 | Windows 侧localhost:<端口>能打开 WSL 服务 |
| bridged | 192.168.x.x/10.x.x.x局域网网段 | 另一台设备能 ping 通、能访问 |
| mirrored | 与 Windows 完全相同 | 两侧localhost互通,浏览器直连成功 |
IP 对上了、外部可达性验证通过了,这次修改才算完成。
没有哪种网络模式客观上更好,只看你的流量"从哪里来、要到哪里去",对着方向选就对了。
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考