[Bug] Url-test 当前节点不可用时无法切换到可用节点
验证步骤
- [X] 我已经阅读了 文档,了解所有我编写的配置文件项的含义,而不是大量堆砌看似有用的选项或默认值。
- [X] 我仔细看过 文档 并未解决问题
- [X] 我已在 Issue Tracker 中寻找过我要提出的问题,并且没有找到
- [X] 我是中文用户,而非其他语言用户
- [X] 我已经使用最新的 Alpha 分支版本测试过,问题依旧存在
- [X] 我提供了可以在本地重现该问题的服务器、客户端配置文件与流程,而不是一个脱敏的复杂客户端配置文件。
- [X] 我提供了可用于重现我报告的错误的最简配置,而不是依赖远程服务器或者堆砌大量对于复现无用的配置等。
- [X] 我提供了完整的日志,而不是出于对自身智力的自信而仅提供了部分认为有用的部分。
- [X] 我直接使用 Mihomo 命令行程序重现了错误,而不是使用其他工具或脚本。
操作系统
Linux
系统版本
Linux 6.12.7-arch1-1 #1 SMP PREEMPT_DYNAMIC Fri, 27 Dec 2024 14:24:37 +0000 x86_64 GNU/Linux
Mihomo 版本
Mihomo Meta v1.19.1 linux amd64 with go1.23.4 Tue Dec 31 16:58:30 UTC 2024 Use tags: with_gvisor
配置文件
p: &p {type: http, proxy: DIRECT, interval: 900, health-check: {enable: true, url: "https://www.gstatic.com/generate_204", interval: 30}, exclude-filter: "群组|剩余|异常|到期|官网|失败|0.1|0.2|0.3|0.4|0.5"}
proxy-providers:
nano:
<<: *p
url: "xxx"
proxy-groups:
- {name: 🌍 代理, type: select, proxies: [♻️ 全部自动, DIRECT, REJECT]}
- {name: ♻️ 全部自动, include-all: true, type: url-test, tolerance: 20, filter: "^((?!(直连)).)*$"}
描述
使用 url-test 的 proxy-group, 若某个节点不可用之后, 无法切换到其他可用的节点
重现方式
正常使用 url-test 的 proxy-group, 过一阵子之后, 若出现无法访问外网的时候, 查看 metacubexd, 发现当前 url-test 的 proxy-group 中的节点已经不可用, 且无法自动切换到其他可用的节点, 此时就算手动点击整个 group 的 health-check, 也迟迟无法自动切换. 只能通过重启或者重载配置解决
日志
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13243 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13251 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"info","payload":"[TCP] 192.168.31.250:13253 --\u003e edge.microsoft.com:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13254 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"info","payload":"[TCP] 192.168.31.250:13264 --\u003e edge.microsoft.com:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13256 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"info","payload":"[TCP] 192.168.31.250:13269 --\u003e edge.microsoft.com:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13257 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial 🐟 漏网之鱼 (match Match/) 192.168.31.250:13267 --\u003e cdn.statically.io:443 error: dial tcp 69.63.184.142:443: i/o timeout"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13270 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"info","payload":"[TCP] 192.168.31.250:13278 --\u003e edge.microsoft.com:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13276 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial 🐟 漏网之鱼 (match Match/) 192.168.31.250:13277 --\u003e cdn.statically.io:443 error: dial tcp 199.59.148.96:443: i/o timeout"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13279 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13280 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"info","payload":"[TCP] 192.168.31.250:13286 --\u003e edge.microsoft.com:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"warning","payload":"[TCP] dial 🌍 代理 (match RuleSet/geolocation-!cn) 192.168.31.250:13281 --\u003e ublockorigin.pages.dev:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13285 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial 🌍 代理 (match RuleSet/geolocation-!cn) 192.168.31.250:13287 --\u003e ublockorigin.pages.dev:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13290 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial 🌍 代理 (match RuleSet/geolocation-!cn) 192.168.31.250:13291 --\u003e cdn.jsdelivr.net:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13293 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13294 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"info","payload":"[TCP] 192.168.31.250:13298 --\u003e edge.microsoft.com:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"warning","payload":"[TCP] dial 🌍 代理 (match RuleSet/geolocation-!cn) 192.168.31.250:13295 --\u003e cdn.jsdelivr.net:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13297 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial GitHub (match RuleSet/github_domain) 192.168.31.250:13299 --\u003e ublockorigin.github.io:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"info","payload":"[TCP] 192.168.31.250:13302 --\u003e api.vc.bilibili.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"warning","payload":"[TCP] dial GitHub (match RuleSet/github_domain) 192.168.31.250:13301 --\u003e ublockorigin.github.io:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"info","payload":"[TCP] 192.168.31.250:13313 --\u003e edge.microsoft.com:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13312 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial 🌍 代理 (match RuleSet/MyProxy) 192.168.31.250:13315 --\u003e www.bing.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial 🌍 代理 (match RuleSet/MyProxy) 192.168.31.250:13314 --\u003e copilot.microsoft.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial YouTube (match RuleSet/youtube_domain) 192.168.31.250:13318 --\u003e youtube.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial 🌍 代理 (match RuleSet/MyProxy) 192.168.31.250:13320 --\u003e copilot.microsoft.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial 🌍 代理 (match RuleSet/MyProxy) 192.168.31.250:13319 --\u003e www.bing.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"info","payload":"[TCP] 192.168.31.250:13337 --\u003e c.msn.cn:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13336 --\u003e browser.events.data.msn.cn:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13338 --\u003e assets.msn.cn:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13339 --\u003e assets.msn.cn:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13340 --\u003e browser.events.data.msn.cn:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13342 --\u003e browser.events.data.msn.cn:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13343 --\u003e browser.events.data.msn.cn:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13344 --\u003e home.microsoftpersonalcontent.com:443 match Match using 🐟 漏网之鱼[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13346 --\u003e ntp.msn.com:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13347 --\u003e ntp.msn.cn:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"warning","payload":"[TCP] dial 🌍 代理 (match RuleSet/MyProxy) 192.168.31.250:13341 --\u003e c.bing.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial GitHub (match RuleSet/github_domain) 192.168.31.250:13345 --\u003e github.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial 🌍 代理 (match RuleSet/MyProxy) 192.168.31.250:13348 --\u003e c.bing.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"warning","payload":"[TCP] dial GitHub (match RuleSet/github_domain) 192.168.31.250:13349 --\u003e github.com:443 error: sg02.05e57c23-bae7-41a0-aeef-8e75566fc3dd.genshinimpact.cyou:80 connect error: dial tcp 52.221.36.135:80: i/o timeout"}
{"type":"info","payload":"[TCP] 192.168.31.250:13352 --\u003e bimp.hdslb.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13354 --\u003e baidu.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13355 --\u003e www.baidu.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13356 --\u003e pss.bdstatic.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13357 --\u003e mbd.baidu.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13358 --\u003e pss.bdstatic.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13359 --\u003e pc-index-skin.cdn.bcebos.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13360 --\u003e himg.bdimg.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13361 --\u003e dss2.bdstatic.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13362 --\u003e www.baidu.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13363 --\u003e www.baidu.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13364 --\u003e www.baidu.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13365 --\u003e hectorstatic.baidu.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13366 --\u003e edge.microsoft.com:443 match RuleSet(microsoft_domain) using Microsoft[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13367 --\u003e api.vc.bilibili.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
{"type":"info","payload":"[TCP] 192.168.31.250:13368 --\u003e dss1.bdstatic.com:443 match RuleSet(cn_domain) using 🟢 直连[DIRECT]"}
它似乎不会自动测速
每次都需要手动切换
https://github.com/MetaCubeX/mihomo/issues/1862 https://wiki.metacubex.one/config/proxy-groups/#type
这是大佬故意留下的特性(bug), 节点挂了以后,不会自动测试和切换
最近翻了源码,url-test 失败次数达到 max-failed-times (默认5)会启动一轮健康检查。该检查完成后(有了所有节点延迟数据)才会切换到新的最快可用节点。我的情况是节点过多检查时间长,导致出现长时间无法切换到可用节点。