这类故障最怕把三个问题混成一个:上游文件有没有变、客户端能不能解析、运行时有没有真正命中。先保留当前配置和上一版规则文件,再从日志里找第一个报错字符串。只看 UI 里的“更新失败”或“更新成功”,很难判断是哪一段出了问题。

##分清 geosite、geoip、rule-set 是什么?

名称负责什么常见文件或格式误用后表现
geosite域名分类,例如服务名、厂商、地区域名集合geosite.dat、文本域名列表、MRS/SRS 域名规则集域名没有命中预期策略,日志走到 final
geoipIP 网段分类,例如国家/地区或私有网段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 解析失败behaviorformat 不匹配rule-providersbehaviorformat
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:httpfileinline。远程更新通常是 http,必须有 url;本地文件用 file;少量规则可以放在 inlinepayload 里。

关键是 behaviorformat 不要猜:

字段官方文档里的常见值排错重点
behaviordomainipcidrclassical域名列表别写成 ipcidr,classical 规则别当纯域名处理
formatyamltextmrs,默认 YAMLMRS 只支持 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: remotetagformaturlupdate_interval。官方文档里的 formatsourcebinary;当路径或 URL 使用 jsonsrs 扩展名时,文档说明可以省略 format 让它自动判断。

项目Mihomosing-box
配置入口rule-providersroute.rule_set
远程类型type: httptype: remote
格式字段yaml / text / mrssource / 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.datgeoip.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-TypeContent-LengthETagLast-Modified。如果上游提供 .sha256sum,优先比对上游校验;如果没有,就把本地 SHA256、文件大小和下载时间记到变更记录里。

MetaCubeX meta-rules-dat 这类维护仓库会明确区分输出和分支。它的 README 里列出 Mihomo 使用的 meta 分支、sing-box 使用的 sing 分支,以及 geosite.datgeoip.datgeoip.dbgeosite.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.dbcache_id 可以把不同配置的数据分到不同 bucket。

排查动作可以按这个顺序走:

  1. 记录客户端版本、配置文件路径、规则 URL。
  2. 下载规则到临时文件,确认不是 HTML 或空文件。
  3. 确认本地缓存路径是否可写。
  4. 触发一次规则更新。
  5. 重载配置或重启核心。
  6. 用日志确认样本命中了新规则集。

“文件时间变新”不是验收标准。真正有效的是日志里出现预期 provider 名称或 rule-set tag,并且样本域名、样本 IP 进入预期出站。

DNS 会怎样影响 geosite/geoip 命中?

geosite 是域名分类,通常发生在域名仍然可见的时候。DNS 策略如果提前把域名解析成 IP,后续连接阶段可能只能靠 geoip 或兜底规则判断。Fake-IP、nameserver-policy、fallback-filter、内网后缀处理都会影响你看到的命中结果。

先固定 3 个样本:

样本用来验证什么异常时先查
一个明确在 geosite 集合里的域名域名规则是否命中rule-set 引用、DNS 是否保留域名语义
一个明确在 geoip 集合里的 IPIP 规则是否命中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/xxxcache.db排查缓存和权限
校验信息SHA256、大小、下载时间判断文件是否被覆盖
变更字段behaviorformattagpath回滚时知道撤哪一项

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 规则集:怎么判断已经修好

最后验收用同一组样本,不要临时换测试对象:

  1. 触发一次规则更新,确认没有下载或解析错误。
  2. 打开本地规则文件或缓存路径,确认文件大小、时间和 SHA256 符合预期。
  3. 重载配置或重启核心。
  4. 测试一个 geosite 域名、一个 geoip IP、一个内网域名。
  5. 在日志里确认命中的 provider 名称或 rule-set tag。
  6. 第二次重启后确认没有重复下载、缓存写入失败或旧字段弃用报错。

如果第 4 步失败,看日志中的规则命中;如果第 2 步失败,先回到来源和缓存路径;如果第 1 步失败,先回到格式和版本字段。按这个顺序排,能避免把 DNS 问题误判成规则源问题。

相关阅读