1. 先写最小分流规则

已有可用订阅时,先保留节点与策略组,只替换规则部分。下面的配置把私有地址、中国大陆域名和中国大陆 IP 送到直连,其余请求交给 PROXY。它是合并片段,不是完整可连接配置。

mode: rule
geodata-mode: true

rules:
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR6,::1/128,DIRECT,no-resolve
  - IP-CIDR6,fc00::/7,DIRECT,no-resolve
  - IP-CIDR6,fe80::/10,DIRECT,no-resolve
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

这里的“中国大陆直连”是依据数据库分类作出的路由选择,不是对网站经营主体、语言或服务器所在地的绝对判断。数据库可能存在遗漏,CDN 地址也会变化。重要业务应增加明确的域名规则,并通过连接记录验证。

使用订阅的客户端还要确认编辑位置:应在客户端支持的覆写、合并配置或持久化扩展中保存修改。直接编辑订阅下载生成的文件,下次更新时可能被替换。各客户端入口不同,以当前客户端说明为准。

2. 规则顺序:从上向下,首次命中

mihomo 按 rules 的排列顺序检查连接。命中一条可用规则后,就采用该条指定的出站,不会继续寻找“更具体”的后续规则。规则没有自动按域名长度排序的机制。

把明确例外放在通用分类之前

rules:
  - DOMAIN-SUFFIX,example.com,PROXY
  - DOMAIN,downloads.example.org,DIRECT
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

这里的两个示例域名仅用于说明语法,不代表某项真实服务。DOMAIN-SUFFIX,example.com 匹配根域名及其子域名,例如 api.example.com;DOMAIN 只匹配指定主机名。如果某个域名已被前面的规则送入代理,后面的中国大陆 IP 规则不会再把它改为直连。

  • 第一层:需要强制代理、强制直连或拒绝的精确例外。
  • 第二层:局域网地址与按业务划分的规则集。
  • 第三层:GEOSITE、GEOIP 等较宽泛的分类。
  • 最后一层:MATCH,接住前面尚未命中的连接。

MATCH 不表示“境外地址识别成功”,而是无条件兜底。本例将未识别流量送往代理,因此数据库漏掉的中国大陆域名也可能走代理。若把它放到第一行,后续分流规则就失去作用。

3. GEOSITE 与 GEOIP 的分工

规则类型 判断依据 适用位置
GEOSITE,cn 域名数据库中的 cn 分类 域名例外之后、IP 分类之前
GEOIP,CN 目标 IP 所属的数据库分类 补充域名规则未覆盖的连接
MATCH 不再附加匹配条件 规则列表末尾兜底

GEOSITE 不需要先判断服务器在哪

当连接携带可用域名时,GEOSITE,cn,DIRECT 可以直接检查域名分类。一个中国大陆网站使用境外 CDN,并不会自动改变它在域名数据库里的分类。反过来,境外服务使用中国大陆 IP,也不保证会被 GEOSITE 归入 cn。

GEOIP 可能触发域名解析

如果连接只有域名、尚无真实目标 IP,执行 IP 类规则时可能需要 DNS 解析。GEOIP,CN,DIRECT 因而可以为未命中域名分类的连接补充判断,但解析结果和 DNS 路径会影响最终决策。

# 允许在需要时解析域名,以判断目标 IP
- GEOIP,CN,DIRECT

# 不为这条规则主动解析域名
- GEOIP,CN,DIRECT,no-resolve

no-resolve 不是“关闭全部 DNS”,也不是“让所有流量更快”的通用选项。它限制该条 IP 规则主动发起解析;连接本来就有目标 IP 时仍可参与匹配。若期望 GEOIP 为域名连接提供补充判断,却给它加上 no-resolve,一部分请求就可能直接落入末尾的 MATCH。

4. 用 rule-providers 拆出独立规则集

规则数量增长后,可把域名清单移出主配置。rule-providers 定义规则集的来源与格式,RULE-SET 决定它在主规则中的匹配位置以及命中后的出站。只定义 provider 而不引用,不会产生分流效果。

先使用可检查的本地域名清单

下面定义名为 local-direct 的文件型规则集。路径相对于 mihomo 的工作目录;应把文件放在客户端允许读取的配置目录内,并确认实际工作目录,而不是按终端当前目录猜测。

rule-providers:
  local-direct:
    type: file
    behavior: domain
    format: yaml
    path: ./rules/local-direct.yaml

rules:
  - RULE-SET,local-direct,DIRECT
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

创建 rules/local-direct.yaml,文件完整内容如下。这是两项明确的直连选择,不是一份完整的中国大陆域名数据库。

payload:
  - '+.baidu.com'
  - '+.qq.com'

behavior: domain 表示文件只存域名匹配项,不能把 DOMAIN-SUFFIX,baidu.com,DIRECT 整行放进去。出站已经由主配置中的 RULE-SET,local-direct,DIRECT 决定。+. 写法覆盖该域名本身及其子域名。

需要混合规则时使用 classical

若同一文件需要同时表达域名和 IP 条件,可改用 behavior: classical,并使用对应的规则语法。下面是规则集文件的内容,仍不在每一项后面填写出站名称:

payload:
  - DOMAIN-SUFFIX,baidu.com
  - IP-CIDR,192.168.0.0/16,no-resolve

不要只改文件内容而忘记修改 provider 的 behavior。使用远程规则集时,还需核对其声明格式:YAML、纯文本和二进制规则集不能任意混用。HTTP 类型可用 interval: 86400 表示每 86400 秒检查更新;本地文件类型不靠这个参数同步文件。

5. DNS、fake-ip 与 TUN 的边界

分流规则只处理已经进入 mihomo 的连接。系统代理只覆盖遵循代理设置的应用;命令行工具、游戏或其他自行联网的程序可能绕过它。TUN 模式通过虚拟网卡接管更多 IP 流量,但能否接管仍取决于路由、权限与排除项。

  • 接管层:先确认应用请求是否出现在客户端连接列表中。没有连接记录时,优先检查系统代理、应用代理设置或 TUN 路由。
  • 识别层:确认连接记录有域名还是只有 IP。域名缺失时,GEOSITE 通常没有可直接匹配的域名信息。
  • 规则层:检查命中的规则、选中的策略组与实际节点,区分规则决定和节点选择。

在 fake-ip 模式下,DNS 可以返回合成地址,例如常见配置使用的 198.18.0.1/16 地址池。内核通过映射关联原始域名;不能把这个合成地址按地理位置当成真实服务器 IP。不要为“修复 GEOIP”而把整个 fake-ip 地址池添加为直连。

同时使用浏览器加密 DNS、独立 DNS 客户端与 TUN 时,应确认域名信息是否仍能进入内核。嗅探可在部分协议上补充域名,但不能保证所有连接都能恢复域名,也不应替代对 DNS 接管路径的检查。

6. 检查配置并验证三类连接

先检查语法,再加载到客户端

可以直接调用 mihomo 的配置检查功能。以下命令假设配置文件就在当前目录;若客户端采用独立工作目录,应同步指定正确的目录,并在该目录准备数据库与本地规则集。

mihomo -t -f ./config.yaml

检查通过只说明配置能被加载,不代表节点可连接,也不代表所有域名都按预期分流。加载后确认客户端处于规则模式,避免全局模式或直连模式改变观察结果。

固定测试入口,观察实际命中

若客户端实际的 HTTP 或 mixed 监听端口为 7890,可以显式指定代理测试。这里的端口是示例,必须以当前配置为准;只测试 HTTP 代理不需要为了测试额外开启 TUN。

curl -I --proxy http://127.0.0.1:7890 https://www.baidu.com/
curl -I --proxy http://127.0.0.1:7890 https://www.wikipedia.org/
  1. 中国大陆域名:查看是否命中 GEOSITE 或自定义 RULE-SET,出站是否为 DIRECT。
  2. 未列入直连分类的境外域名:查看是否落入 MATCH,并确认 PROXY 当前选择的是代理节点,而非 DIRECT。
  3. 局域网服务:使用实际存在的路由器或 NAS 地址测试,确认私有网段规则生效。局域网访问是否经过代理,还取决于应用的绕过列表与 TUN 排除路由。

上述域名用于说明检查方法,不预设它们在任意版本数据库中的命中结果。HTTP 状态码为 200、301 或 403,都不足以单独证明分流正确;需要结合连接详情中的规则类型、出站链和日志判断。

7. 常见故障按层排查

中国大陆网站仍走代理

  • 先检查前面是否存在更早命中的代理规则,尤其是订阅自带的业务规则集。
  • 检查域名是否在当前 GEOSITE 数据中;若连接只有 IP,转查 GEOIP 与 DNS 识别链路。
  • 确认修改的是当前启用的配置,而不是未选中的订阅副本;重新加载后新建连接再测。

所有请求都走同一个出口

依次确认 mode: rule、MATCH 的位置,以及 PROXY 组内的实际选择。策略组名字叫“代理”不代表内部一定选择了代理节点。修改规则后已有长连接可能继续保留原来的出站,应关闭对应连接或重启测试应用。

更新订阅后自定义规则消失

将规则移动到客户端支持的持久覆写或合并配置中,并检查合并顺序。把自定义规则追加到原有 MATCH 后面,即使保存成功也不会生效。每次订阅更新后至少复查一个直连域名和一个代理域名。

网页可用,但游戏或 UDP 仍异常

先确认应用流量已被接管,再检查节点协议、服务端与策略组选择是否支持所需的 UDP 转发。TUN 只解决接管入口的一部分问题,不会让不支持 UDP 的出站自动具备转发能力。IPv6 也要独立检查,不能把一次 IPv4 请求成功当成双栈验证完成。

最终保持一个可解释的规则顺序:明确例外在前,域名分类居中,IP 分类补充,MATCH 收尾。每增加一条规则,都在连接记录里确认它命中了什么,再继续扩充清单。