这类故障最怕把三个问题混成一个:上游文件有没有变、客户端能不能解析、运行时有没有真正命中。先保留当前配置和上一版规则文件,再从日志里找第一个报错字符串。只看 UI 里的“更新失败”或“更新成功”,很难判断是哪一段出了问题。
##分清 geosite、geoip、rule-set 是什么?
| 名称 | 负责什么 | 常见文件或格式 | 误用后表现 |
|---|---|---|---|
| geosite | 域名分类,例如服务名、厂商、地区域名集合 | geosite.dat、文本域名列表、MRS/SRS 域名规则集 | 域名没有命中预期策略,日志走到 final |
| geoip | IP 网段分类,例如国家/地区或私有网段 | geoip.dat、CIDR 列表、MRS/SRS IP 规则集 | IP 兜底判断错误,连接进入错误策略 |
| rule-set | 客户端读取规则的容器或引用方式 | Mihomo rule-provider、sing-box rule_set | 文件能下载,但格式、tag 或行为不匹配 |
V2Fly 的 domain-list-community 明确是社区维护域名列表,用来生成 geosite.dat。V2Fly geoip 仓库则发布 geoip.dat 等 GeoIP 数据,并提供 .sha256sum 这类校验文件。它们是数据来源,不等于每个客户端都能直接读取同一个文件。
Mihomo 与 sing-box 更常见的是把规则拆成远程规则集。这个时候“geosite/geoip”更像内容类别,“rule-set/rule-provider”才是客户端配置入口。排错时先问:我手上这个 URL 返回的是域名规则、IP 规则,还是某个客户端专用的二进制文件?
看到更新失败时先看哪 6 个信号?
| 故障表现 | 更可能原因 | 第一处检查 |
|---|---|---|
| 浏览器打开 URL 是 HTML、登录页或 404 | 来源 URL 失效或被重定向到错误页 | curl -I 与实际下载内容 |
| Mihomo 提示 provider 解析失败 | behavior 或 format 不匹配 | rule-providers 的 behavior、format |
| sing-box 提示 rule-set 文件无效 | format 与文件类型不一致 | route.rule_set[].format 和扩展名 |
| 每次启动都重新下载 | 缓存没写入或路径变了 | Mihomo path;sing-box experimental.cache_file |
| 更新后域名仍走旧策略 | 只下载了文件,没有 reload 或 tag 没被引用 | 日志里的规则集名 |
| 内网域名突然失效 | DNS 规则把 .lan、路由器域名带进公共解析 | DNS policy、fake-ip/filter、nameserver-policy |
处理最早出现的错误。文件还没下载成功时,不要先改 DNS 策略;配置还没通过校验时,也不要判断规则命中。顺序错了,日志会变得更乱。
Mihomo 该比对哪些字段?
Mihomo 的 rule-providers 文档给出三类 provider:http、file、inline。远程更新通常是 http,必须有 url;本地文件用 file;少量规则可以放在 inline 的 payload 里。
关键是 behavior 和 format 不要猜:
| 字段 | 官方文档里的常见值 | 排错重点 |
|---|---|---|
behavior | domain、ipcidr、classical | 域名列表别写成 ipcidr,classical 规则别当纯域名处理 |
format | yaml、text、mrs,默认 YAML | MRS 只支持 domain / ipcidr 两类 behavior |
path | 可选;省略时会按 URL 生成文件名 | 想确认本地缓存,就显式写清路径更好查 |
interval | 秒数 | 不要为了“新”写得过短,看上游发布时间 |
proxy | 指定下载规则时使用的代理 | 下载失败时确认规则源请求走哪条出站 |
size-limit | 下载大小限制,0 表示不限制 | 上游文件变大后可能被本地限制挡住 |
一个最小排查片段可以写成这样,把本地文件落点固定下来:
rule-providers:
geosite-test:
type: http
behavior: domain
format: text
url: https://example.com/geosite-test.list
path: ./ruleset/geosite-test.list
interval: 86400
如果 path 使用相对路径,继续确认客户端的 HomeDir。Mihomo 文档提到 rule-provider 文件默认受 HomeDir 限制,额外路径要通过 SAFE_PATHS 放行。桌面客户端、OpenClash、Docker 容器的工作目录不同,同一段相对路径可能落到不同位置。
sing-box 和 Mihomo 的差异在哪里?
sing-box 使用 route.rule_set,远程规则集通常包含 type: remote、tag、format、url、update_interval。官方文档里的 format 是 source 或 binary;当路径或 URL 使用 json、srs 扩展名时,文档说明可以省略 format 让它自动判断。
| 项目 | Mihomo | sing-box |
|---|---|---|
| 配置入口 | rule-providers | route.rule_set |
| 远程类型 | type: http | type: remote |
| 格式字段 | yaml / text / mrs | source / binary |
| 引用方式 | 规则里引用 provider 名称 | route 规则引用 rule-set tag |
| 缓存线索 | provider path,省略时按 URL 生成 | remote rule-set 可配合 experimental.cache_file |
| 版本线索 | MRS 支持范围看当前 Mihomo 文档 | rule-set 自 1.8.0 起;本地文件 1.10.0 起支持变更自动重载;1.14.0 起新增 http_client,旧 download_detour 被标记弃用 |
不要把 MRS、SRS、dat 当成同一种东西。MRS 是 Mihomo rule-provider 的二进制规则集格式之一;SRS 是 sing-box 生态里常见的规则集文件;geosite.dat、geoip.dat 属于 V2Ray/V2Fly 生态常见容器。文件名里都有 geosite 或 geoip,不代表客户端能互相读取。
来源怎么验证才算够?
先验证“这个 URL 是不是我要的规则文件”,再谈规则内容。最少做 4 件事:
curl -I "https://example.com/rules/geosite.list"
curl -L "https://example.com/rules/geosite.list" -o /tmp/geosite.list
file /tmp/geosite.list
shasum -a 256 /tmp/geosite.list
看响应头时,重点是状态码、Content-Type、Content-Length、ETag、Last-Modified。如果上游提供 .sha256sum,优先比对上游校验;如果没有,就把本地 SHA256、文件大小和下载时间记到变更记录里。
MetaCubeX meta-rules-dat 这类维护仓库会明确区分输出和分支。它的 README 里列出 Mihomo 使用的 meta 分支、sing-box 使用的 sing 分支,以及 geosite.dat、geoip.dat、geoip.db、geosite.db 等不同产物。拿错分支或拿错产物,比“规则源坏了”更常见。
如果同一套配置要在多个客户端间迁移,准备一个最小样本,不要一口气把所有规则都换掉。订阅本身只能解决节点和客户端格式问题;用兼容 Clash / Singbox / V2Ray 的订阅做基线测试时,外部 geosite/geoip 规则仍要按各客户端文档单独比对。
缓存路径和 reload 怎么查?
Mihomo,看 provider 的 path。如果你没有写 path,文档说明会按 URL 生成文件名;这对自动运行没问题,对排错不友好。临时排查时建议显式写到 ./ruleset/xxx,更新后直接打开文件看内容和修改时间。
sing-box,区分两件事:规则集下载和缓存文件设置。route.rule_set 文档说明远程 rule-set 可在启用 experimental.cache_file 时缓存;cache file 文档里 path 留空时默认是 cache.db,cache_id 可以把不同配置的数据分到不同 bucket。
排查动作可以按这个顺序走:
- 记录客户端版本、配置文件路径、规则 URL。
- 下载规则到临时文件,确认不是 HTML 或空文件。
- 确认本地缓存路径是否可写。
- 触发一次规则更新。
- 重载配置或重启核心。
- 用日志确认样本命中了新规则集。
“文件时间变新”不是验收标准。真正有效的是日志里出现预期 provider 名称或 rule-set tag,并且样本域名、样本 IP 进入预期出站。
DNS 会怎样影响 geosite/geoip 命中?
geosite 是域名分类,通常发生在域名仍然可见的时候。DNS 策略如果提前把域名解析成 IP,后续连接阶段可能只能靠 geoip 或兜底规则判断。Fake-IP、nameserver-policy、fallback-filter、内网后缀处理都会影响你看到的命中结果。
先固定 3 个样本:
| 样本 | 用来验证什么 | 异常时先查 |
|---|---|---|
| 一个明确在 geosite 集合里的域名 | 域名规则是否命中 | rule-set 引用、DNS 是否保留域名语义 |
| 一个明确在 geoip 集合里的 IP | IP 规则是否命中 | CIDR 格式、geoip 文件来源 |
一个内网域名,例如 router.lan | 内网 DNS 是否被误带走 | fake-ip-filter、nameserver-policy、本地 DNS 上游 |
不要用“网页能打开”当唯一结论。网页能打开可能只是 final 兜底策略可用;网页打不开也可能是 DNS 上游、策略组或远端服务问题。打开 debug 日志,看命中的规则名和规则集名,才知道规则更新是否真的生效。
版本兼容要怎么记录?
规则更新和客户端升级经常绑在一起出问题,所以记录版本比记录截图更有用。至少留下这 6 项:
| 记录项 | 示例 | 用途 |
|---|---|---|
| 客户端与核心版本 | Mihomo / sing-box 具体版本号 | 判断字段是否被当前版本支持 |
| 规则来源 | 仓库、分支、release 或固定 URL | 排除拿错产物 |
| 文件格式 | text、yaml、mrs、source、binary、dat、srs | 对照客户端解析方式 |
| 本地路径 | ./ruleset/xxx、cache.db | 排查缓存和权限 |
| 校验信息 | SHA256、大小、下载时间 | 判断文件是否被覆盖 |
| 变更字段 | behavior、format、tag、path | 回滚时知道撤哪一项 |
sing-box 用户还要特别看旧配置里有没有 download_detour。官方文档已把它标记为 1.14.0 起弃用,并给出 http_client 作为新字段线索。看到弃用提示时,不要只为了消提示删除字段,复制配置,再按当前版本文档迁移下载链路。
安全回滚怎么做?
回滚不是把所有缓存删光。更稳的方式是只撤最近一次规则文件和配置字段,保留能启动的旧版本。
mkdir -p ruleset-backup
cp ruleset/geosite-test.list ruleset-backup/geosite-test.list.2026-05-22
shasum -a 256 ruleset/geosite-test.list > ruleset-backup/geosite-test.list.2026-05-22.sha256
替换文件前先备份,替换后立刻做一次静态检查。sing-box 可以先跑:
sing-box check -c config.json
Mihomo 桌面端或 OpenClash 场景下,至少要保存原 YAML、provider 本地文件和更新前日志。回滚时只做一件事:把规则文件换回上一版,或把刚改的 format/behavior/tag/path 改回去。不要同时换订阅、DNS、TUN 和规则源。
geosite 规则集:怎么判断已经修好
最后验收用同一组样本,不要临时换测试对象:
- 触发一次规则更新,确认没有下载或解析错误。
- 打开本地规则文件或缓存路径,确认文件大小、时间和 SHA256 符合预期。
- 重载配置或重启核心。
- 测试一个 geosite 域名、一个 geoip IP、一个内网域名。
- 在日志里确认命中的 provider 名称或 rule-set tag。
- 第二次重启后确认没有重复下载、缓存写入失败或旧字段弃用报错。
如果第 4 步失败,看日志中的规则命中;如果第 2 步失败,先回到来源和缓存路径;如果第 1 步失败,先回到格式和版本字段。按这个顺序排,能避免把 DNS 问题误判成规则源问题。