返回

WSL服务器无法访问故障排查指南

windows

WSL 服务器无法从 Windows 或外部设备访问的故障排查

使用 Windows Subsystem for Linux (WSL) 进行开发时,一个常见的问题是,在 WSL 中运行的服务器无法从 Windows 主机或外部网络设备访问。尽管 WSL 内部可以正常访问,通过 Windows 主机的 IP 地址连接却会失败。这个问题比较棘手,排查和解决起来都需要仔细检查各个环节。下面是一些通用的排查方法。

网络配置检查

网络配置是许多连接问题的根本原因。需要确保 WSL 网络设置和 Windows 主机网络配置相互协调。

  1. 验证 WSL 网络模式: 默认 WSL2 使用网络地址转换(NAT),这种模式下 WSL 使用虚拟网络适配器,并有一个独立的 IP 地址,所以可能导致Windows无法直接访问WSL。要查看当前WSL网络模式可以使用以下命令:

    wsl --list --verbose
    

    检查结果中对应WSL发行版的STATE 列,如果处于“Running”状态则继续往下排查,处于“Stopped”状态需要先启动发行版。还要查看VERSOIN 列,如果为2,表示是WSL2。

  2. 检查IP 地址: WSL 内的 IP 地址不应该与 Windows 主机的 IP 地址完全一致。 使用以下命令在WSL中查看它的IP:

 ip addr

观察eth0/ens或者其他的网卡上的inet地址。同时需要查看Windows主机的IP地址,可以使用ipconfig命令在Windows的命令提示符中进行查询。确认两个IP属于不同的网段是比较正常的,这也说明NAT工作模式下它们是在两个网络中。如果两边IP一样,则可能是网络配置错误,可以考虑重启网络或WSL实例。

  1. 端口转发检查: 当使用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防火墙是否阻止连接:

  1. 临时禁用 Windows 防火墙: 作为初步的故障排查步骤,可以临时禁用 Windows 防火墙。但这仅仅用于测试,后续需要重新开启。
  2. 检查Windows 防火墙规则: 可以添加允许特定端口通过的防火墙入站规则。在 Windows 设置中搜索 "Windows Defender 防火墙",选择“高级设置”,选择“入站规则”,新建规则,选择"端口",然后选择 "TCP" 或 "UDP" ,填入需要访问的端口号,选择"允许连接"。

其他因素

  1. 服务器配置: 检查WSL内部服务器的配置,确认监听地址为 0.0.0.0 或特定的 WSL IP 地址。确保服务器没有只监听 localhost 或 127.0.0.1 ,这将限制它只在WSL内部被访问。

  2. WSL服务稳定性: 检查WSL服务是否存在问题, 可能导致部分转发失效, 可以通过如下命令停止并重启WSL来重置相关组件

 wsl --shutdown
 wsl 
  1. 端口冲突: 确保没有任何其他应用程序使用服务器需要监听的端口。使用 netstat -ano 在 Windows 的命令提示符中查看正在使用的端口列表,并且使用 lsof -i:<port>在WSL中查看指定端口的使用情况。

  2. 外部设备: 从外部设备进行测试时,确保这些设备和Windows主机位于同一网络上,同时网络路由器或其他防火墙没有阻止对 Windows 主机端口的访问。检查网络防火墙的相关规则。

解决 WSL 服务器不可访问的问题往往需要检查多个方面,并耐心排查,逐步解决。以上措施可以帮助开发人员识别和纠正 WSL 服务器的访问问题。如有其他特殊的网络环境,需要做特殊处理。