当前位置: 首页 > news >正文

记录一次 Windows + WSL2 网络异常:WSL 无法访问局域网节点的排查与修复

一、问题背景我的服务部署结构大致是Windows 主机 ├─ WSL2运行管理平台 / 调度服务 / worker / 数据库 ├─ Windows 本机运行一个计算节点端口 NODE_PORT ├─ 局域网其他机器也运行计算节点端口 NODE_PORT └─ WEB_PORT管理平台端口通过 Windows portproxy 暴露出去正常情况下WSL2 里的主服务需要访问Windows 本机节点HOST_LAN_IP:NODE_PORT 局域网其他节点PEER_LAN_IP:NODE_PORT之前这些访问都是正常的。二、问题现象某次 Windows 重启以及执行过网络相关命令后出现了异常。Windows 本机访问局域网节点正常ping PEER_LAN_IP curl.exe -v http://PEER_LAN_IP:NODE_PORT/但 WSL2 访问同一个节点超时wsl -d YOUR_DISTRO -- bash -lc curl --noproxy * -v --connect-timeout 5 http://PEER_LAN_IP:NODE_PORT/表现为Windows - PEER_LAN_IP:NODE_PORT 正常 WSL2 - PEER_LAN_IP:NODE_PORT 超时同时WSL2 访问 Windows 本机节点时使用HOST_LAN_IP:NODE_PORT也不稳定。三、关键排查1. 查看 WSL2 当前 IP 和路由wsl -d YOUR_DISTRO -- bash -lc hostname -I wsl -d YOUR_DISTRO -- bash -lc ip routeNAT 模式下通常会看到类似WSL_IP default via WSL_GATEWAY dev eth0 WSL_SUBNET dev eth0 scope link src WSL_IP例如WSL_IP 172.20.10.5 WSL_GATEWAY 172.20.0.1 WSL_SUBNET 172.20.0.0/20这时WSL2 访问 Windows 宿主机服务应该优先使用http://WSL_GATEWAY:NODE_PORT而不是http://HOST_LAN_IP:NODE_PORT2. 验证 WSL2 到 Windows 本机节点wsl -d YOUR_DISTRO -- bash -lc curl --noproxy * -v --connect-timeout 5 http://WSL_GATEWAY:NODE_PORT/如果返回404或其他应用层响应说明网络已经通了只是访问的路径不是有效接口。3. 检查 Windows 到 WSL2 的端口转发如果要让局域网或外部访问 WSL2 里的管理平台需要 Windows 端做 portproxynetsh interface portproxy show all重建转发示例netsh interface portproxy delete v4tov4 listenaddress0.0.0.0 listenportWEB_PORT netsh interface portproxy add v4tov4 listenaddress0.0.0.0 listenportWEB_PORT connectaddressWSL_IP connectportWEB_PORT放行防火墙New-NetFirewallRule -DisplayName MyApp-WEB_PORT -Direction Inbound -Protocol TCP -LocalPort WEB_PORT -Action Allow四、中间踩过的坑1. WSL2 mirrored 模式曾尝试过配置[wsl2] networkingModemirrored dnsTunnelingtrue autoProxytrue firewalltruemirrored 模式会让 WSL2 更接近 Windows 主机网络有时可以改善局域网访问问题。但它也会改变 WSL2 访问宿主机服务的行为并可能引入代理变量例如HTTP_PROXYhttp://127.0.0.1:PROXY_PORT如果服务端或 worker 继承了这些代理变量内部请求可能被代理污染。最终为了恢复原有稳定状态我删除了.wslconfig让 WSL2 回到默认 NAT 模式Remove-Item $env:USERPROFILE\.wslconfig -Force wsl --shutdown2. TUN / 虚拟网卡模式Clash / Mihomo / Verge 这类工具开启 TUN 模式后会接管系统路由、DNS 或默认出口。这可能影响客户端 - 域名:WEB_PORT - Windows - portproxy - WSL2 WSL2 - Windows - 局域网其他节点所以如果 Windows 主机本身是客户访问入口不建议在这台机器上开启全局 TUN。如果必须开启需要给管理平台域名、内网网段、WSL 网段配置直连规则。五、真正原因最终定位到的核心原因是WSL2 出站 SNAT / Masquerade 状态丢失正常情况下WSL2 访问局域网其他节点时目标节点看到的来源 IP 应该是HOST_LAN_IP也就是 Windows 宿主机的局域网 IP。异常时目标节点看到的来源 IP 变成了WSL_IP也就是 WSL2 自己的 NAT 网段 IP。这会导致目标节点无法正确回包因为它通常不知道如何返回到WSL_SUBNET最终表现就是 WSL2 访问局域网节点超时。六、解决方法方案一在目标节点加回程路由在局域网目标节点上添加回程路由route -p add WSL_SUBNET mask WSL_SUBNET_MASK HOST_LAN_IP示例route -p add 172.20.0.0 mask 255.255.240.0 10.10.10.5含义是如果要回到 WSL2 网段就走 Windows 宿主机 IP。这个方法适合目标节点数量较少的情况。方案二在 Windows 主机恢复 WSL2 SNAT更接近原始状态的修复方式是在 Windows 主机上恢复 WSL2 出站 SNATNew-NetNat -Name WSL-SNAT -InternalIPInterfaceAddressPrefix WSL_SUBNET_CIDR示例New-NetNat -Name WSL-SNAT -InternalIPInterfaceAddressPrefix 172.20.0.0/20查看Get-NetNat如果同名规则已经存在需要先删除Remove-NetNat -Name WSL-SNAT -Confirm:$false然后再重新创建。恢复后WSL2 访问局域网节点时对方看到的来源 IP 会重新变成 Windows 宿主机 IPHOST_LAN_IP这就是之前的正常状态。七、最终稳定结构最终稳定后的访问关系如下客户端/局域网 - Windows:WEB_PORT - portproxy - WSL2:WEB_PORT WSL2 - Windows 本机节点 - WSL_GATEWAY:NODE_PORT WSL2 - 局域网其他节点 - PEER_LAN_IP:NODE_PORT - 通过 Windows SNAT对外表现为 HOST_LAN_IP八、建议保留的运维命令查看 WSL 状态wsl -d YOUR_DISTRO -- bash -lc hostname -I; ip route查看 SNATGet-NetNat查看 portproxynetsh interface portproxy show all重建 WEB_PORT 转发netsh interface portproxy delete v4tov4 listenaddress0.0.0.0 listenportWEB_PORT netsh interface portproxy add v4tov4 listenaddress0.0.0.0 listenportWEB_PORT connectaddressWSL_IP connectportWEB_PORT恢复 WSL2 SNATNew-NetNat -Name WSL-SNAT -InternalIPInterfaceAddressPrefix WSL_SUBNET_CIDR九、总结这次问题不是应用服务损坏而是 Windows、WSL2、WinNAT、portproxy、TUN 之间的网络状态被打乱。核心原因是WSL2 出站 SNAT/Masquerade 状态丢失导致 WSL2 访问局域网节点时来源 IP 从HOST_LAN_IP变成了WSL_IP目标节点无法回包所以连接超时。最终通过恢复 Windows 上的 WSL2 SNATNew-NetNat -Name WSL-SNAT -InternalIPInterfaceAddressPrefix WSL_SUBNET_CIDR成功恢复到之前的网络状态。
http://www.rkmt.cn/news/1383094.html

相关文章:

  • 如何高效获取Qobuz无损音乐:终极Hi-Res音乐下载工具指南
  • ClickHouse 性能优化完全指南:从数据模型到生产调优
  • CORS 入门笔记(前后端跨域)
  • 基于树莓派与Snapcast构建全屋高保真无线音频系统
  • 京东自动购物神器:3步配置,轻松实现商品补货监控与智能下单
  • 真空定型系统在 PP 蜂窝板生产中的关键参数与调试方法
  • 别再为FLEXPART编译头疼了!手把手教你用Ubuntu 22.04搞定依赖库和WRF模式编译
  • Zyxel防火墙CVE-2022-30525漏洞复现与实战利用
  • SSH公钥认证失败原因与精准修复方案
  • Rust 属性语法
  • 专业的芙蓉区全房定制厂家
  • 测试环境的“熵增定律”:为什么环境总会越来越乱?
  • 【日常开发】 VSCode Remote SSH 在 Ubuntu 18.04 (GLIBC 2.27) 上的解决方案
  • 猫抓高效使用指南:5步专业掌握网页资源嗅探
  • 机器学习在射电天文数据分类中的应用:以MIGHTEE巡天SFG/AGN分类为例
  • 浩卡联盟怎么开一级代理权限?官方手把手教你注册一级0抽成(官方邀请码16888) - 流量卡代理招商
  • 0 基础跨行斩获万元薪资,真正拉开差距的是破局思维
  • 我因为不会汇报,错过了3次晋升机会,希望你别重蹈覆辙
  • 高速时间交织型模数转换器设计【附方案】
  • ATtiny TPI编程实战:USBasp/AVRISP MKII烧录ATtiny4/5/9/10全攻略
  • 重载工业机械臂数据逻辑攻击及检测【附仿真】
  • AI当代,怎么利用好AI工具管理好项目沟通及沟通计划?
  • 利用Taotoken实现Agent工作流中多模型灵活调度
  • Color-X卡乐瓷砖核心介绍(品牌理念+产品体系+品牌供应链与渠道布局+产品核心优势+荣誉资质+市场定位) - 寻茫精选
  • 意大利品牌Color-X卡乐瓷砖介绍:从美学优势到场景适配的深度解析 - 寻茫精选
  • 多级缓存
  • 人工智能怎么做Excel数据分析?2026年最值得入手的AI做表工具盘点
  • 找工厂客户的数据怎么选?通用名录平台和垂直工厂数据平台的区别
  • 嵌入式研究工程师全覆盖技能清单|从入门到资深的完整技术树
  • 免费音乐解锁终极指南:如何在浏览器中轻松解密QQ音乐、网易云音乐等加密格式