🌏 运维工单统计:fake-ip 环境下 GEOIP 误判导致「漏分流」占 60% 以上。本文记录生产验证的规则优先级模板——GEOSITE 合并 80% SUFFIX 后规则 P99 从 210µs 降至 140µs(基准见 三内核压测),并给出 rule-providers 热更新零中断与 MATCH 兜底排查 checklist。

规则匹配顺序:自上而下,首匹配生效
mihomo 按 rules 数组顺序逐条测试,命中即停止。常见误区是把 GEOIP,CN,DIRECT 放在 GEOSITE 海外媒体规则之前,导致国内 CDN 节点误判。推荐骨架:
rules: - RULE-SET,reject,REJECT - RULE-SET,direct,DIRECT - RULE-SET,proxy,PROXY - GEOSITE,cn,DIRECT - GEOIP,CN,DIRECT,no-resolve - MATCH,PROXY
rule-providers 热更新零中断
HTTP 行为
配置 behavior: classical 的 YAML 规则集,interval: 86400 每日拉取。mihomo 在后台下载至临时文件,校验后原子替换,现有连接不受影响。若 CDN 返回 ETag,仅 304 时不重写。
手动触发
curl -X PUT -H "Authorization: Bearer $SECRET" \ http://127.0.0.1:9090/providers/rules/loyalsoldier
API 安全见 External Controller 加固文。
GEOSITE vs DOMAIN-SUFFIX 性能权衡
GEOSITE 类别(如 geolocation-!cn)在 DAT 索引中一次命中,适合大类分流。DOMAIN-SUFFIX 适合精确后缀(.githubusercontent.com)。DOMAIN-KEYWORD 因子串匹配开销大,应控制在 50 条以内或改用 RULE-SET 预编译。
在 基准测试 中,12 万条 SUFFIX 使 P99 达 210µs;将 80% 合并为 GEOSITE 后 P99 降至 140µs。
GEOIP 与 no-resolve 修饰符
当 DNS 返回 fake-ip(198.18.0.0/16)时,对 IP 做 GEOIP 查询会得到错误国家。对依赖 IP 的规则务必加 ,no-resolve 或确保规则仅用于域名阶段。TUN 模式下 dns-hijack 与 fake-ip-filter 需包含内网段:
dns:
fake-ip-filter:
- '*.lan'
- '*.local'
- 'localhost.ptlogin2.qq.com'
TUN 完整配置参考 macOS TUN 排障。
MATCH 兜底陷阱
MATCH,PROXY 必须位于最后一条。若误写为 MATCH,DIRECT,所有未命中流量直连,造成「规则失效」假象。调试技巧:临时将 MATCH 指向 REJECT 并观察日志,确认是否有流量滑至兜底。
私有域名与分流例外
企业内网域名应写入 direct rule-set,置于 GEOIP 之前:
# custom-direct.yaml payload: - DOMAIN-SUFFIX,corp.internal - DOMAIN-SUFFIX,svc.cluster.local
Android 端同步此规则集见 CMFA 部署文。
与出站协议的衔接
规则决定「走哪组代理」,协议性能决定「组内节点谁快」。弱网环境建议在 PROXY 组使用 url-test 并筛选 Hysteria2 节点,参见 QUIC 协议文。
检查清单
- ✅ reject 规则置顶(广告、恶意域名)
- ✅ direct 规则在 GEOIP 之前
- ✅ GEOIP 带 no-resolve(fake-ip 环境)
- ✅ MATCH 仅一条且在末尾
- ✅ rule-providers interval 与 CDN 缓存策略一致
配置模板起点:下载页最小 config · 返回 资讯目录