[Bug] Direct出站指定ipv4-prefer时建立tcp连接但不发送数据
验证步骤
- [x] 我已经阅读了 文档,了解所有我编写的配置文件项的含义,而不是大量堆砌看似有用的选项或默认值。
- [x] 我仔细看过 文档 并未解决问题
- [x] 我已在 Issue Tracker 中寻找过我要提出的问题,并且没有找到
- [x] 我是中文用户,而非其他语言用户
- [x] 我已经使用最新的 Alpha 分支版本测试过,问题依旧存在
- [x] 我提供了可以在本地重现该问题的服务器、客户端配置文件与流程,而不是一个脱敏的复杂客户端配置文件。
- [x] 我提供了可用于重现我报告的错误的最简配置,而不是依赖远程服务器或者堆砌大量对于复现无用的配置等。
- [x] 我提供了完整的日志,而不是出于对自身智力的自信而仅提供了部分认为有用的部分。
- [x] 我直接使用 Mihomo 命令行程序重现了错误,而不是使用其他工具或脚本。
操作系统
Linux
系统版本
Debian12
Mihomo 版本
Mihomo Meta alpha-7c8fba33 linux amd64 with go1.24.0 2025年 03月 04日 星期二 06:35:57 UTC Use tags: with_gvisor
配置文件
mode: rule
ipv6: true
dns:
enable: true
ipv6: true
use-system-hosts: true
use-hosts: true
enhanced-mode: fakeip
nameserver:
- system
- dhcp://system
proxies:
- { name: preferv4direct, type: direct, ip-version: ipv4-prefer }
rules:
- MATCH,preferv4direct
描述
ip-version 的值为 ipv4, ipv6, ipv6-prefer 时均正常, 仅在 ipv4-prefer 且传输 tcp 流量时有问题
重现方式
代理服务器按照上述配置运行
要连接的目标地址使用 iperf3 / nc 监听均可复现:
iperf3 -s -p 5201
nc -l -p 1111 -6 # -6 监听 *:1111, 而不指定 -6 或指定 -4 则会监听 0.0.0.0:1111
连接方法:
iperf3 -c 域名(域名解析包括一个IPv4和一个IPv6, 这样才能测试是否IPv4优先) -p 5201 -R
nc 域名 1111
现象:
web-ui 里能看到连接, 连接建立后不传输数据, 过很久以后连接自动断开
通过在目标地址输入命令 ss -ltp | grep iperf3, 发现
LISTEN 0 4096 *:5201 *:* users:(("iperf3",pid=255019,fd=3)) # 如果目标服务器的软件监听*:*, 这样会出现BUG, 只建立连接不传输数据
LISTEN 0 4096 0.0.0.0:5201 0.0.0.0:* users:(("iperf3",pid=259193,fd=3)) # 如果软件监听0.0.0.0则是正常的, 连接建立后能正常传输数据
日志
3月 04 14:52:22 cl mihomo[259803]: time="2025-03-04T14:52:22.245177141+08:00" level=debug msg="[DNS] cache hit 目标域名 --> [目标域名解析的IPv6] AAAA, expire at 2025-03-04 14:55:05"
3月 04 14:52:22 cl mihomo[259803]: time="2025-03-04T14:52:22.245206908+08:00" level=debug msg="[DNS] cache hit 目标域名 --> [目标域名解析的IPv4] A, expire at 2025-03-04 14:55:05"
3月 04 14:52:22 cl mihomo[259803]: time="2025-03-04T14:52:22.245226394+08:00" level=debug msg="[DNS] 目标域名 --> 目标域名解析的IPv4"
3月 04 14:52:22 cl mihomo[259803]: time="2025-03-04T14:52:22.245298992+08:00" level=debug msg="[DNS] cache hit 目标域名 --> [目标域名解析的IPv6] AAAA, expire at 2025-03-04 14:55:05"
3月 04 14:52:22 cl mihomo[259803]: time="2025-03-04T14:52:22.245325255+08:00" level=debug msg="[DNS] cache hit 目标域名 --> [目标域名解析的IPv4] A, expire at 2025-03-04 14:55:05"
3月 04 14:52:22 cl mihomo[259803]: time="2025-03-04T14:52:22.248349130+08:00" level=info msg="[TCP] 来源IP:56710 --> 目标域名:5201 match Match using preferv4direct"
这似乎不是bug 是特性
ipv4 perfer 是并发连接ipv4和ipv6, 然后iperf3只允许一条tcp连接测速就会测不了