WSL服务器无法访问故障排查指南
2025-01-16 04:35:28
WSL 服务器无法从 Windows 或外部设备访问的故障排查
使用 Windows Subsystem for Linux (WSL) 进行开发时,一个常见的问题是,在 WSL 中运行的服务器无法从 Windows 主机或外部网络设备访问。尽管 WSL 内部可以正常访问,通过 Windows 主机的 IP 地址连接却会失败。这个问题比较棘手,排查和解决起来都需要仔细检查各个环节。下面是一些通用的排查方法。
网络配置检查
网络配置是许多连接问题的根本原因。需要确保 WSL 网络设置和 Windows 主机网络配置相互协调。
-
验证 WSL 网络模式: 默认 WSL2 使用网络地址转换(NAT),这种模式下 WSL 使用虚拟网络适配器,并有一个独立的 IP 地址,所以可能导致Windows无法直接访问WSL。要查看当前WSL网络模式可以使用以下命令:
wsl --list --verbose
检查结果中对应WSL发行版的STATE 列,如果处于“Running”状态则继续往下排查,处于“Stopped”状态需要先启动发行版。还要查看VERSOIN 列,如果为2,表示是WSL2。
-
检查IP 地址: WSL 内的 IP 地址不应该与 Windows 主机的 IP 地址完全一致。 使用以下命令在WSL中查看它的IP:
ip addr
观察eth0/ens或者其他的网卡上的inet地址。同时需要查看Windows主机的IP地址,可以使用ipconfig
命令在Windows的命令提示符中进行查询。确认两个IP属于不同的网段是比较正常的,这也说明NAT工作模式下它们是在两个网络中。如果两边IP一样,则可能是网络配置错误,可以考虑重启网络或WSL实例。
-
端口转发检查: 当使用NAT模式, Windows需要配置端口转发才能访问WSL的服务,检查转发规则是否正确配置非常重要。 可以使用如下命令查看已配置的端口转发规则:
netsh interface portproxy show v4tov4
确认是否有转发规则,如不存在或有误需要手动配置。如果存在,核对一下是否是正确的监听地址、监听端口、连接地址、连接端口,以及协议类型(v4tov4)。可以使用下面命令手动配置:
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=<WSL-IP-Address>
<WSL-IP-Address>
请替换为之前查看到的WSL虚拟网卡的IP地址。0.0.0.0
表示监听所有地址的8080端口,也可以设置为某个指定的本地IP。
为了确保防火墙规则不会阻止端口转发,可以使用以下命令关闭Windows防火墙:
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
测试连接成功后再使用以下命令开启:
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True
建议为测试的端口添加防火墙允许规则。
注意:
端口转发配置一次通常会保持生效。但系统或网络配置变更可能会导致规则失效。重新检查并根据需要重新配置非常重要。
WSL 和 Windows 防火墙
Windows 防火墙的规则可能会阻止传入的连接,即便是正确设置了端口转发也是如此。要检查Windows防火墙是否阻止连接:
- 临时禁用 Windows 防火墙: 作为初步的故障排查步骤,可以临时禁用 Windows 防火墙。但这仅仅用于测试,后续需要重新开启。
- 检查Windows 防火墙规则: 可以添加允许特定端口通过的防火墙入站规则。在 Windows 设置中搜索 "Windows Defender 防火墙",选择“高级设置”,选择“入站规则”,新建规则,选择"端口",然后选择 "TCP" 或 "UDP" ,填入需要访问的端口号,选择"允许连接"。
其他因素
-
服务器配置: 检查WSL内部服务器的配置,确认监听地址为 0.0.0.0 或特定的 WSL IP 地址。确保服务器没有只监听 localhost 或 127.0.0.1 ,这将限制它只在WSL内部被访问。
-
WSL服务稳定性: 检查WSL服务是否存在问题, 可能导致部分转发失效, 可以通过如下命令停止并重启WSL来重置相关组件
wsl --shutdown
wsl
-
端口冲突: 确保没有任何其他应用程序使用服务器需要监听的端口。使用
netstat -ano
在 Windows 的命令提示符中查看正在使用的端口列表,并且使用lsof -i:<port>
在WSL中查看指定端口的使用情况。 -
外部设备: 从外部设备进行测试时,确保这些设备和Windows主机位于同一网络上,同时网络路由器或其他防火墙没有阻止对 Windows 主机端口的访问。检查网络防火墙的相关规则。
解决 WSL 服务器不可访问的问题往往需要检查多个方面,并耐心排查,逐步解决。以上措施可以帮助开发人员识别和纠正 WSL 服务器的访问问题。如有其他特殊的网络环境,需要做特殊处理。