在Windows上安装Linux子系统(WSL)后,很多人会在里面跑Nginx、MySQL或者自己写的接口服务,但很快发现本机浏览器能开,同事的电脑却连不上。这是因为WSL2默认采用NAT网络,子系统处在虚拟交换机后面,外部网络无法直接访问其内部IP。要想让WSL对外提供服务,需要从端口映射、防火墙和系统网络模式几个方面入手。

一、确认WSL版本与IP
先弄清楚自己用的是WSL1还是WSL2,两者网络行为不同。在PowerShell执行:
wsl -l -v # 查看分发版名称与版本,STATE为Running表示正在运行
在WSL内部查看当前分配的IP:
ip addr show eth0 | grep inet # 通常能看到类似 172.x.x.x 的地址,这就是子系统在NAT下的内网IP
二、使用端口转发暴露服务
最通用的做法是在Windows侧做端口转发,把宿主机的某个端口转到WSL的IP和端口。假设WSL里跑着8080端口的Web服务:
# 获取WSL当前IP并写入变量(PowerShell) $wsl_ip = (wsl hostname -I).Trim() # 添加端口代理,将本机8080转到WSL的8080 netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=$wsl_ip
这样局域网内其他机器访问宿主机IP的8080即可到达WSL服务。注意WSL重启后IP会变,需要重新执行转发或写脚本自动更新。
防火墙放行
Windows Defender防火墙默认会拦外部请求,需添加入站规则:
New-NetFirewallRule -DisplayName "WSL_8080" -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow </p> <h2>三、使用镜像网络模式简化配置</h2> <p>WSL2支持<code>mirrored</code>网络模式,开启后子系统直接使用宿主机IP,无需端口转发。在用户目录的<code>.wslconfig</code>中写入:</p> <pre class=brush:ini;toolbar:false> [wsl2] networkingMode=mirrored
重启WSL后,WSL内监听的服务可直接通过宿主机IP被外部访问,但需注意端口冲突问题。
四、用systemd保活服务
如果希望WSL启动时自动拉起服务,可启用systemd。在/etc/wsl.conf添加:
[boot] systemd=true
之后用systemctl enable nginx之类命令设置开机自启,避免每次手动运行。
五、方法对比
| 方案 | 复杂度 | 适用场景 |
|---|---|---|
| 端口转发 | 中 | 临时调试、固定端口暴露 |
| 镜像网络 | 低 | Win11新版本、长期开发 |
| WSL1 | 低 | 无IP隔离需求的老项目 |
综合来看,日常开发推荐镜像网络加防火墙放行,最省心;若系统不支持,则用脚本维护端口转发也很稳定。