Mihomo 规则不生效?先检查 mode、代理组和规则顺序
简答:写了规则却仍然走直连或代理,先确认 mode: rule、规则目标名称和 YAML 缩进,再用最小模板测试。Mihomo 按 rules 从上到下匹配,第一条命中即停止,末尾应保留 MATCH 兜底;RULE-SET 还要核对 URL、behavior 与 format。
定义:Mihomo 规则配置,是在 config.yaml 中用 mode、代理组、rules 和 rule-providers 共同决定域名、IP 或网络请求进入直连、代理、拒绝等处理路径。
先试这一步:四项检查决定规则是否参与匹配
写了规则却没有效果时,不要先继续添加更多规则。先检查 mode、代理组名称、规则顺序和配置是否成功加载。Mihomo 官方文档将 rule、global、direct列为运行模式;只有使用 mode: rule 时,路由规则才会参与匹配。可参考 mihomo General configuration。
| 检查项 | 正常写法或现象 | 不正常时先处理什么 |
|---|---|---|
mode | mode: rule | 如果是 global 或 direct,先改为规则模式再测试 |
| 规则目标 | 例如 Proxy 与 proxy-groups.name 逐字一致 | 检查大小写、空格和中文符号,不能把节点名误当代理组名 |
| 规则顺序 | 例外规则在前,范围较宽的规则在后 | 检查前面是否已有更宽泛的规则提前命中 |
| 最终规则 | 末尾有 MATCH,Proxy | 没有 MATCH 时,未命中的请求可能没有明确兜底路径 |
规则的可视化判断可以记成:请求 → 第 1 条规则 → 命中就停止;未命中 → 继续下一条 → 全部未命中 → MATCH 兜底。官方路由文档明确说明规则按从上到下匹配,上方规则优先级更高,并列出了 DOMAIN、GEOIP、RULE-SET 和 MATCH等类型,详见 mihomo Route Rules。
可复制的最小 config.yaml:先替换三处再加载
下面是一份用于验证规则链路的最小模板。它的配置结构包含 mixed-port、mode、proxy-providers、proxy-groups、rules 和 rule-providers。示例中的订阅地址、规则集地址和测试域名都是占位内容,必须替换;不能直接把占位地址当作真实服务使用。
mixed-port: 7890
mode: rule
log-level: info
allow-lan: false
proxy-providers:
my-subscription:
type: http
url: https://替换为你的订阅地址
path: ./providers/my-subscription.yaml
interval: 86400
proxy-groups:
- name: Proxy
type: select
use:
- my-subscription
proxies:
- DIRECT
rule-providers:
test-domain:
type: http
behavior: domain
format: yaml
path: ./rule-providers/test-domain.yaml
url: https://替换为真实的域名规则文件地址
interval: 86400
rules:
- DOMAIN,example.com,DIRECT
- DOMAIN-SUFFIX,example.org,Proxy
- RULE-SET,test-domain,Proxy
- MATCH,Proxy| 必须替换的字段 | 替换成什么 | 判定标准 |
|---|---|---|
proxy-providers.url | 你实际使用的订阅地址 | 客户端能下载并解析订阅,且代理组中出现可选节点 |
rule-providers.test-domain.url | 实际可访问的规则文件地址 | 规则提供者状态显示已加载,而不是下载失败或格式错误 |
Proxy | 可由你控制的代理组名称 | rules 中的目标名称与 proxy-groups.name 完全一致 |
官方快速配置示例同时展示了代理提供者、代理组、规则提供者和最终 MATCH 规则的组合方式,可对照 mihomo Quick configuration。如果你的客户端已经自动生成了代理组,不要重复创建同名组;先查看现有配置,再决定是修改组名还是修改 rules 的目标。
规则类型怎么选:精确域名、后缀、关键词还是 IP
| 类型 | 匹配对象 | 适合场景 | 使用提醒 |
|---|---|---|---|
DOMAIN | 完整域名 | 只处理一个明确域名 | 范围窄,适合写例外 |
DOMAIN-SUFFIX | 域名及其后缀范围 | 处理一个主域名下的多个子域名 | 范围比 DOMAIN 更宽,要注意提前命中 |
DOMAIN-KEYWORD | 域名中的关键词 | 域名变化较多、只能按关键词归类 | 可能误匹配,建议先用精确规则验证 |
DOMAIN-REGEX | 符合表达式的域名 | 需要模式匹配的特殊场景 | 表达式应先用少量域名测试 |
GEOSITE | 预设站点分类 | 按已有站点集合处理 | 分类内容取决于所用数据文件 |
IP-CIDR/IP-CIDR6 | IPv4 或 IPv6 网段 | 请求目标直接表现为 IP 地址段 | 不要用 IP 规则代替域名规则 |
GEOIP | 目标 IP 的地区代码 | 按 IP 地理归属处理 | IP 归属不等同于网站运营地 |
新手可以先用两条简单规则确认链路:
rules:
- DOMAIN,example.com,DIRECT
- DOMAIN-SUFFIX,example.org,Proxy
- MATCH,Proxyexample.com 和 example.org 只是示例域名,请替换为你确实要测试的域名。不要同时加入大量关键词、地区和规则集,否则即使出现异常,也很难判断是哪一条规则提前命中。各类规则及其参数以 mihomo Route Rules 文档为准。
RULE-SET 怎么配置:先确认 behavior,再确认 format
RULE-SET 只是引用入口,真正决定能否加载的是 rule-providers。官方文档列出 domain、ipcidr、classical 三种 behavior,以及 yaml、text、mrs 三种 format。填写时要按规则文件的实际内容选择,不能只看文件扩展名。详情见 mihomo Rule-Providers。
| 规则文件内容 | behavior | 常见 format | 适用说明 |
|---|---|---|---|
| 域名集合 | domain | text、yaml 或 mrs | 每项主要是域名,适合域名类集合 |
| IP 网段集合 | ipcidr | text、yaml 或 mrs | 每项主要是 IPv4 或 IPv6 网段 |
| 完整 Mihomo 规则行 | classical | yaml 或 text | 文件内含 DOMAIN、IP-CIDR 等完整规则行 |
Text 规则集可以是每行一个域名或网段,例如:
# domain 格式的 text 文件
example.com
example.org
sub.example.netClassical 文件则应包含完整规则行,例如:
# classical 格式的 text 文件
DOMAIN,example.com
DOMAIN-SUFFIX,example.org
IP-CIDR,192.0.2.0/24,no-resolveMRS 是二进制规则集格式。官方文档说明,mrs behavior 当前只支持 domain 和 ipcidr;如果手头是 YAML 或 Text 文件,可以使用 Mihomo 的 convert-ruleset 命令转换为 MRS,命令格式应以当前版本帮助信息为准。不要把包含完整规则行的 classical 文件直接标记为 MRS。
no-resolve 到底做什么:避免把 IP 规则误解成域名规则
no-resolve 的作用是:当域名请求开始匹配目标 IP 类规则时,不触发 DNS 解析来检查解析后的目标 IP 是否命中该规则。官方路由文档明确说明,目标 IP 规则在域名匹配过程中可能触发 DNS 解析,而添加 no-resolve 可以跳过这一步。
rules:
- IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,Proxy因此,GEOIP,CN,DIRECT 不加 no-resolve 时,域名请求可能需要先解析,再根据目标 IP 的地区归属继续判断。是否添加应取决于你的规则目的:如果规则只想处理已经明确出现的 IP,使用 no-resolve;如果希望域名请求也通过解析后的 IP 参与 GEOIP 判断,就不要随意添加。
DNS、Fake-IP 和 TUN 如何影响规则:不要只看系统解析结果
DNS 负责解析和返回地址,rules 负责决定请求交给哪个目标,TUN 则决定哪些系统流量能被 Mihomo 接收到。三者不是同一个配置层级,只改 rules 不能保证没有进入 Mihomo 的应用流量也会被处理。
官方 DNS 文档显示,enhanced-mode 可使用 fake-ip 或 redir-host;Fake-IP 模式下使用 Fake-IP 地址范围。因此,假如系统工具看到 198.18.x.x,不能仅凭这一结果判断 DNS 出错或规则失效。先查看 Mihomo 的连接信息和实际代理目标,再临时使用 redir-host 做对照。DNS 字段说明见 mihomo DNS configuration。
TUN 配置中的 auto-route 用于自动设置路由,dns-mode 可设置为 disabled、native 或 hijack,dns-hijack 用于将符合条件的 DNS 连接导入内部 DNS 模块。不同系统对防火墙、严格路由和 DNS 劫持的要求不同,修改前应对照 mihomo TUN configuration。
最小验证顺序是:先用 mixed-port 让浏览器或应用明确接入;确认 rules 能命中后,再开启 TUN;最后再调整 Fake-IP、DNS 劫持或严格路由。一次只改一个变量,才能知道问题来自规则、DNS 还是流量没有进入 Mihomo。
怎样查看命中的规则:打开日志和本地 API
如果客户端界面没有直接显示命中规则,可以在配置中临时加入本地控制 API 和 debug 日志:
log-level: debug
external-controller: 127.0.0.1:9090
secret: "请替换为本地管理密钥"
external-controller 默认可监听本地地址,secret 用于 API 访问认证。不要把控制地址改成公网监听,也不要把密钥留空后暴露到局域网或互联网。字段说明见 mihomo General configuration。
- 保存配置并重新加载,先确认内核没有 YAML 解析错误。
- 打开客户端的连接列表,访问一个你明确写入
DOMAIN或DOMAIN-SUFFIX的测试域名。 - 在连接详情中查看目标地址、进程或连接元数据,以及最终使用的代理组;重点确认它是否进入了预期的
Proxy或DIRECT。 - 如果需要通过 API 检查,可使用本机地址访问
http://127.0.0.1:9090/connections;若配置了密钥,按客户端要求发送认证信息。 - 检查规则集时访问
/providers/rules,看 provider 名称是否存在、更新时间和状态是否正常。
Mihomo API 文档列出了 /connections、/logs 和 /providers/rules 等接口。实际面板是否提供这些按钮,取决于你使用的客户端界面;接口说明可查看 mihomo APIs。
常见故障按这个顺序排查
- 规则完全不生效:先看
mode: rule是否存在。若当前为global或direct,先切换到 rule 模式。 - 配置加载失败:用
pre中的原始 YAML 检查同级缩进、冒号、列表短横线和重复键。不要把配置片段放在普通段落中复制,连续空格和层级必须保留。 - 代理组不存在:将 rules 中的目标名称与
proxy-groups.name逐字比较。Proxy、proxy和带尾随空格的名称不是同一个值。 - 规则集下载失败:先检查 URL 是否能访问,再核对
type、path、behavior、format和interval。官方文档说明更新间隔单位为秒。 - 规则集已下载但不匹配:检查文件实际内容。域名集合用
domain,网段集合用ipcidr,完整规则行才考虑classical。 - 指定规则被另一条规则覆盖:把更精确的 DOMAIN 例外移到宽泛的 DOMAIN-SUFFIX、GEOSITE 或 RULE-SET 之前。
- 只有部分应用不受规则控制:确认应用使用了 Mihomo 的 mixed-port,或确认 TUN 已接管该系统流量。Windows、macOS、Android 的 TUN 和 DNS 行为可能不同,应按当前客户端和系统设置检查。
- Fake-IP 下判断错误:不要只用系统 DNS 命令的返回地址下结论,先查看连接列表、debug 日志和规则提供者状态,再用 redir-host 进行单变量对照。
本站是第三方使用指南,与相关项目及开发者无隶属关系;文中字段和行为以已链接的官方 Mihomo 文档为准,客户端界面差异和未公开字段均未核实。
完成最小配置后,再逐步增加规则
- 备份当前配置文件,保留一份能正常启动的副本。
- 确认
mode: rule,并让一个明确的代理组名称承担最终目标。 - 只加入一条 DOMAIN、一条 DOMAIN-SUFFIX 和末尾 MATCH,确认连接列表显示预期目标。
- 再加入一个 domain 类型的 RULE-SET,核对 provider 状态和命中结果。
- 需要处理 IP 时,再增加 IP-CIDR、GEOIP 或 IP-CIDR6,并根据是否允许 DNS 解析决定是否使用
no-resolve。 - 最后才调整 DNS 的 Fake-IP、redir-host、TUN、dns-mode 或 dns-hijack,避免同时改变多个变量。
如果规则已经能命中,但应用仍然连接失败,可以继续查看本站的连接问题排查;如果还没有完成客户端基础接入,可先浏览设备配置指南和更多使用指南。
常见问题
Mihomo 规则为什么写了却不生效?
先检查是否为 mode: rule;global 和 direct 模式不会按普通 rules 进行规则匹配。然后核对 rules 目标是否对应现有 proxy-groups.name,再检查宽泛规则是否排在精确规则之前,最后确认 MATCH 位于末尾。
DOMAIN 和 DOMAIN-SUFFIX 应该怎么选?
只处理一个完整域名时使用 DOMAIN;需要覆盖主域名及其子域名时使用 DOMAIN-SUFFIX。若只是写一个例外,优先使用范围更窄的 DOMAIN,并把它放在较宽泛规则之前。
RULE-SET 的 behavior 和 format 怎么填写?
先看规则文件实际内容:域名集合通常使用 domain,IP 网段集合使用 ipcidr,包含完整规则行的文件才考虑 classical;format 再按实际文件选择 yaml、text 或 mrs。官方文档说明 mrs behavior 当前只支持 domain 和 ipcidr。
no-resolve 是什么意思?
它表示目标 IP 类规则在处理域名请求时不触发 DNS 解析来检查目标 IP。需要让域名解析后的 IP 参与 GEOIP 等判断时,不要为了省事随意添加 no-resolve。
Fake-IP 模式看到 198.18.x.x,是 DNS 出错了吗?
不一定。Fake-IP 模式会使用专门的地址范围返回映射地址。应先查看 Mihomo 连接列表或 debug 日志中的实际规则和代理组,再临时切换 redir-host 对照,不能只依据系统解析命令的结果判断。
规则集下载成功但仍然不匹配怎么办?
检查文件真实内容与 behavior、format 是否一致。域名集合、IP 网段集合和 classical 完整规则行的写法不同;同时确认 RULE-SET 中引用的 provider 名称与 rule-providers 下的键名完全一致。