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/
- 中国大陆域名:查看是否命中
GEOSITE或自定义RULE-SET,出站是否为DIRECT。 - 未列入直连分类的境外域名:查看是否落入
MATCH,并确认PROXY当前选择的是代理节点,而非DIRECT。 - 局域网服务:使用实际存在的路由器或 NAS 地址测试,确认私有网段规则生效。局域网访问是否经过代理,还取决于应用的绕过列表与 TUN 排除路由。
上述域名用于说明检查方法,不预设它们在任意版本数据库中的命中结果。HTTP 状态码为 200、301 或 403,都不足以单独证明分流正确;需要结合连接详情中的规则类型、出站链和日志判断。
7. 常见故障按层排查
中国大陆网站仍走代理
- 先检查前面是否存在更早命中的代理规则,尤其是订阅自带的业务规则集。
- 检查域名是否在当前 GEOSITE 数据中;若连接只有 IP,转查 GEOIP 与 DNS 识别链路。
- 确认修改的是当前启用的配置,而不是未选中的订阅副本;重新加载后新建连接再测。
所有请求都走同一个出口
依次确认 mode: rule、MATCH 的位置,以及 PROXY 组内的实际选择。策略组名字叫“代理”不代表内部一定选择了代理节点。修改规则后已有长连接可能继续保留原来的出站,应关闭对应连接或重启测试应用。
更新订阅后自定义规则消失
将规则移动到客户端支持的持久覆写或合并配置中,并检查合并顺序。把自定义规则追加到原有 MATCH 后面,即使保存成功也不会生效。每次订阅更新后至少复查一个直连域名和一个代理域名。
网页可用,但游戏或 UDP 仍异常
先确认应用流量已被接管,再检查节点协议、服务端与策略组选择是否支持所需的 UDP 转发。TUN 只解决接管入口的一部分问题,不会让不支持 UDP 的出站自动具备转发能力。IPv6 也要独立检查,不能把一次 IPv4 请求成功当成双栈验证完成。
最终保持一个可解释的规则顺序:明确例外在前,域名分类居中,IP 分类补充,MATCH 收尾。每增加一条规则,都在连接记录里确认它命中了什么,再继续扩充清单。