如何从本地网络访问WSL(Windows Subsystem for Linux)中运行的Web服务器?
解决WSL HTTP服务器局域网跨设备访问问题
当然能实现跨设备访问!你的问题根源在于WSL默认的NAT网络模式限制了外部设备的访问,加上Windows防火墙的拦截,咱们一步步来解决:
第一步:获取WSL实例的内部IP
在WSL终端里执行命令:ip addr show eth0找到输出里
inet开头的那一行,比如inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0,这里的172.18.0.2就是WSL的内部IP,记下来。第二步:配置Windows端口转发
WSL默认用NAT网络,相当于在Windows主机内部建了个小局域网,所以需要把Windows主机的8000端口转发到WSL的内部IP上:- 以管理员身份打开PowerShell
- 执行下面的命令(把
<WSL_IP>换成你刚才记下的WSL内部IP):netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8000 connectaddress=<WSL_IP> connectport=8000
第三步:允许Windows防火墙通过8000端口
Windows防火墙默认会拦截外部设备对主机端口的访问,需要添加入站规则:- 打开「Windows Defender防火墙」→「高级设置」
- 左侧选择「入站规则」,右侧点击「新建规则」
- 规则类型选「端口」,点击下一步
- 选择「TCP」,输入「特定本地端口」为
8000,点击下一步 - 选择「允许连接」,点击下一步
- 根据你的网络环境勾选对应的网络类型(一般全选即可),点击下一步
- 给规则起个好记的名字,比如「WSL HTTP Server 8000」,完成创建
第四步:检查WSL内部的防火墙(可选)
如果你的Ubuntu开启了ufw防火墙,也需要允许8000端口访问:ufw allow 8000/tcp或者暂时关闭
ufw测试:ufw disable自动更新端口转发(可选)
WSL重启后内部IP会变化,上面的端口转发规则会失效,你可以写个PowerShell脚本自动更新:# 获取WSL内部IP $wslIp = wsl -- ip addr show eth0 | Select-String -Pattern 'inet\s(\d+\.\d+\.\d+\.\d+)/' | ForEach-Object { $_.Matches.Groups[1].Value } # 删除旧的转发规则 netsh interface portproxy delete v4tov4 listenport=8000 listenaddress=0.0.0.0 # 添加新的转发规则 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8000 connectaddress=$wslIp connectport=8000把这段代码保存成
update_wsl_port.ps1,每次启动WSL服务器前用管理员权限运行即可。
完成以上步骤后,局域网内的其他设备就可以通过http://<Windows主机IP>:8000访问你的WSL HTTP服务器了,比如你之前的http://192.168.1.178:8000。
内容的提问来源于stack exchange,提问作者Roman




