mihomo 配置
- tun: enable
- stack: system
- mihomo 代理模式: 非大陆 IP 都走代理
- WSL 网络: NAT
网络故障现象
- 宿主机 Windows 可以正常通过代理访问国外网站
- 宿主机上部署的 WSL2 间歇性无法访问国外网站,国内网站正常访问
抓包日志
- 路由器防火墙内可以看到 WSL2 发出的包一直处于
syn sent状态 - 通过 tcpdump 抓包,可以看到 mihomo 收到了 WSL2 的请求,也通过 tun 转发了 syn ,但是没有 ack 回包
解决方案
和 ChatGPT 沟通后,它建议我将 mihomo 配置中的 stack 由 system 切换到 gvisor ,修改此配置后,WSL2 网络故障恢复正常。
疑问
ChatGPT 告诉我, stack: system 模式下,mihomo 依赖操作系统内核维护 TCP 连接上下文,所以请求来自 WSL2 (经过 Windows 的 NAT )时,在某些情况下,系统内核会丢弃回包,导致 WSL2 无法通过代理上网。
而 gVisor 是用户态协议栈,自己维护连接状态、重发机制、窗口大小、NAT 表等,所以它能正常处理来自 WSL2 的请求。
我的疑问:WSL2 的 NAT 状态是由宿主机 Windows 维护的,对于 mihomo 来说,无论是 WSL2 还是宿主机的请求,来源地址都是宿主机的 IP , 为什么 mihomo 会出现无法正常处理 WSL2 回包的情况?
恳请对这一现象了解的 V 友能够解答一二。