为什么路由器上 mihomo 配置为 stack: system 时, WSL2 间歇性无法通过代理上网?

84 天前
 Danswerme

mihomo 配置

网络故障现象

抓包日志

解决方案

ChatGPT 沟通后,它建议我将 mihomo 配置中的 stacksystem 切换到 gvisor ,修改此配置后,WSL2 网络故障恢复正常。

疑问

ChatGPT 告诉我, stack: system 模式下,mihomo 依赖操作系统内核维护 TCP 连接上下文,所以请求来自 WSL2 (经过 Windows 的 NAT )时,在某些情况下,系统内核会丢弃回包,导致 WSL2 无法通过代理上网。

gVisor 是用户态协议栈,自己维护连接状态、重发机制、窗口大小、NAT 表等,所以它能正常处理来自 WSL2 的请求。

我的疑问:WSL2 的 NAT 状态是由宿主机 Windows 维护的,对于 mihomo 来说,无论是 WSL2 还是宿主机的请求,来源地址都是宿主机的 IP , 为什么 mihomo 会出现无法正常处理 WSL2 回包的情况?

恳请对这一现象了解的 V 友能够解答一二。

1809 次点击
所在节点    宽带症候群
9 条回复
Thymolblue
84 天前
同样的问题,前几个月在内核更新到 0.46.110 后解决了。感觉 OpenClash 并不会完全执行配置文件的内容,有一些自动的 override 导致配置异常。另外我通过 Android 手机开启 Clash Meta For Android ,再通过热点做透明代理,即使使用旧内核 WSL 也不会有网络问题。
fengyaochen
84 天前
openclash 越更新越烂,现在还不如 passwall 好用
Danswerme
84 天前
@Thymolblue
@fengyaochen 我没使用 openclash ,用的 mihomo 裸核 + webUI ,我待会更新下 mihomo 内核版本试试。
anbabubabiluya
83 天前
其实就是兼容性问题吧,非 gvisor 堆栈 ipv6 还有问题呢,官方文档默认也是 gvisor
Danswerme
83 天前
@anbabubabiluya 那我就继续使用 gvisor 吧,虽然有人说 gvisor 性能略低,但是在 x86 力大砖飞的情况下也不成问题。
MYDB
83 天前
@fengyaochen 哪里烂?有问题要么提 issue ,要么提 pr ,不会根据自己需求配置,纯伸手当然烂了
fengyaochen
83 天前
@MYDB 老版本能用就行了,等不能用了再说
daisyfloor
83 天前
这个问题折腾了我几个月,你遇到的问题大概和我一样,我做个总结吧。

最不折腾的是终极解决办法是:

Clash 的 TUN 模式+wsl2 的镜像网络模式 networkingMode=mirrored ,并且还要进行 2 个设置:
- Clash 的 TUN 配置中,mtu 要设置,数值<=1500,否则会出现网络缓慢或者时好时坏不能用的状况;
- Clash 的 TUN 配置中,启用严格路由:strict-route: true ,避免 DNS 泄露

这样配置后,在可靠的 TUN 网络下,wsl2 自己(如 apt update 或者 curl )和 docker 引擎(如镜像拉取,容器网络请求)都可以正常无感知使用代理。
daisyfloor
83 天前
@daisyfloor 补充下 8#的回复,我的 tun 用的是 stack: mixed

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1143369

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX