一、先确定分流依据:域名、目标 IP 与兜底策略
境内外分流不是按网页语言判断,也不是按公司注册地判断。Clash 规则引擎使用连接中可获得的域名、目标 IP 等信息,按配置顺序寻找匹配项。本文采用的目标是:明确列入直连范围的域名优先直连,已知中国大陆 IP 尝试直连,其余连接交给代理组。
这是一套可维护的路由策略,不是对所有网站地理位置的精确分类。跨国服务可能使用境内 CDN,境内服务也可能访问境外 API。域名规则表达使用意图,GEOIP 补充地址归属,两者不能互相替代。
| 规则 | 判断依据 | 适用范围 |
|---|---|---|
DOMAIN | 完整域名 | 单个主机名的精确例外 |
DOMAIN-SUFFIX | 域名后缀 | 主域名及其子域名 |
GEOIP | 目标 IP 的数据库归属 | 补充域名列表未覆盖的连接 |
MATCH | 前面的规则均未命中 | 所有剩余连接的兜底 |
配置生效的三个前提
- 客户端处于
rule规则模式。全局模式不会按本文规则列表选择出站。 - 目标应用流量确实进入客户端。系统代理只覆盖遵循代理设置的应用;TUN 则依赖虚拟网卡、路由和权限配置。
- 规则引用的代理组已经存在。本文使用的组名是
境外代理,需要替换为当前配置中的真实名称。
二、DOMAIN-SUFFIX 放在 GEOIP 前面
DOMAIN-SUFFIX,qq.com,DIRECT 可以匹配 qq.com 与 mail.qq.com,不会匹配 notqq.com。规则按域名标签边界识别后缀,不需要写成 *.qq.com,也不要把 https://、端口或 URL 路径放进域名字段。
标准规则列表采用从上到下的首次命中原则,不会自动选择“更具体”的规则。因此,同一站点需要局部例外时,应先写精确域名,再写较宽的后缀规则;如果后缀规则已经命中,后面的 GEOIP 不会再改变结果。
基础规则片段
mode: rule
rules:
- DOMAIN,localhost,DIRECT
- 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
- DOMAIN-SUFFIX,qq.com,DIRECT
- DOMAIN-SUFFIX,taobao.com,DIRECT
- GEOIP,CN,DIRECT,no-resolve
- MATCH,境外代理
这个片段保留常见私网地址、IPv6 唯一本地地址与回环地址直连,随后处理两个明确指定的域名后缀。它不是完整的特殊用途地址清单;如果网络使用 IPv6 链路本地地址、组播或企业自定义路由,需要结合现有局域网规则补充,不能直接删除原配置中的相关条目。
DIRECT是内置直连策略,不代表流量不经过客户端,而是由客户端按直连方式建立出站连接。境外代理是自定义策略组名称,规则中的名称必须与proxy-groups中的名称完全一致。MATCH放在最后。若提前放置,后续规则将没有命中机会。
对于“某个子域名必须代理,但主域名其余部分直连”的需求,可在后缀规则前加一条 DOMAIN,指定的完整主机名,境外代理。不要为了处理一个接口,直接把整个大型服务的域名后缀改成代理,这会扩大改动范围,也更难验证。
三、GEOIP 与 no-resolve:是否为匹配主动解析域名
GEOIP,CN,DIRECT 查询的是 IP 数据库,而不是在线判断网站所属国家。若当前连接只有域名,规则引擎可能需要先解析域名,才能执行 IP 匹配。具体解析行为还受内核实现、DNS 模式与连接已有元数据影响。
添加 no-resolve 的含义是:不要仅为这条 IP 规则主动发起域名解析。如果连接已经具有可用于匹配的目标 IP,仍然可以命中;如果缺少可用 IP,则继续检查后面的规则。它不是“关闭 DNS”,也不是“阻止 DNS 请求”的开关。
| 写法 | 只有域名时 | 取舍 |
|---|---|---|
GEOIP,CN,DIRECT | 可能触发解析以判断 IP | 增加按 IP 归属直连的机会,但引入解析依赖 |
GEOIP,CN,DIRECT,no-resolve | 不为该规则主动解析 | 减少匹配阶段的额外解析,部分域名连接会进入兜底 |
怎样选择
- 已维护较完整的直连域名集合,希望剩余域名直接交给代理组:可以优先采用
no-resolve。 - 依赖 IP 归属补充大量未列出的境内域名:可以评估不加该参数,但要同时确认 DNS 可用性和解析结果。
- 应用直接访问 IP 地址:目标地址已经存在,
no-resolve通常不会妨碍对该地址的匹配。
GEOIP 的准确性还取决于本地数据库。地址段转移、数据库更新滞后与 CDN 调度都可能产生偏差。mihomo 的地理数据配置也会影响实际读取的数据文件。若启动日志提示数据库缺失或读取失败,应先处理数据加载问题,而不是不断调整规则顺序。
四、rule-providers:把直连域名拆成可维护文件
当域名例外从几条增加到几十条时,继续堆在主配置里容易重复或写错。mihomo 可以通过 rule-providers 声明规则提供者,再用 RULE-SET 引用。提供者负责存放匹配条件,最终使用哪个策略,仍由主配置的引用规则决定。
主配置:声明本地域名规则集
rule-providers:
domestic-domains:
type: file
behavior: domain
format: yaml
path: ./rules/domestic-domains.yaml
rules:
- DOMAIN,localhost,DIRECT
- 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
- RULE-SET,domestic-domains,DIRECT
- GEOIP,CN,DIRECT,no-resolve
- MATCH,境外代理
规则文件:rules/domestic-domains.yaml
payload:
- '+.qq.com'
- '+.taobao.com'
- '+.jd.com'
对于 mihomo 的 domain 类型规则集,+.qq.com 表示该域名及其子域名。单引号保留域名模式的原始文本。这里不要写成 DOMAIN-SUFFIX,qq.com,DIRECT,那不是此文件所需的域名条目格式。
behavior: domain:文件存放域名匹配项,适合直连或代理域名集合。behavior: ipcidr:文件存放 IP 网段,不能混入域名条目。behavior: classical:文件存放DOMAIN-SUFFIX,qq.com等规则表达式,一般不在条目末尾写策略名。
相对路径应按内核工作目录及客户端的文件访问约束理解,不一定相对于正在编辑的订阅文件。移动端客户端还可能限制文件导入与存储位置。保存后需要确认规则集加载成功、条目数合理,再重新建立连接测试。本地 type: file 不会从网络自动下载内容,也不需要添加用于远程更新的 interval。
如改用远程规则集,应先核对来源文件的 behavior 与 format。不能把域名纯文本列表当成 YAML 文件读取,也不能把其他内核专用的二进制文件直接交给不支持该格式的版本。
五、DNS、系统代理与 TUN:规则能看到什么
规则不命中,未必是规则语法出错。先看连接进入客户端时携带了什么信息。HTTP 代理请求通常能提供目标主机名;某些 SOCKS 应用会先在本地解析,再只向客户端提交 IP。后者即使访问的是同一网站,也未必能直接命中域名后缀规则。
三个常见边界
- 本地解析先于代理。 应用只提交目标 IP 时,域名规则缺少直接匹配条件。支持嗅探的内核在部分协议中可以补充域名,但不能保证恢复所有连接的主机名。
- DNS 接管范围不足。 TUN 的 DNS 劫持配置不等于可以识别所有加密 DNS。应用自带的 DoH 使用 HTTPS 连接,不能简单视为普通的 UDP 53 查询。
- IPv4 与 IPv6 走向不同。 同一域名可能同时获得 A 与 AAAA 记录,两次连接使用不同地址。只观察 IPv4 测试结果,无法证明 IPv6 连接也会选择相同策略。
TUN 用于接管符合路由条件的 IP 流量,并不会自动修复错误的规则列表。若系统代理和 TUN 同时开启,应确认当前测试应用实际走哪条入口。企业 VPN、容器网段和虚拟机网络也可能改变路由;访问内网失败时,先检查是否存在网段重叠,再考虑追加直连规则。
DNS 与出站需要分别验证:解析成功只证明得到地址,不能证明目标端口可达;命中 DIRECT 也不能证明直连线路可用。若域名解析到境外地址而被 GEOIP 排除,这是规则按当前数据运行的结果,不一定是规则引擎故障。
六、规则不命中的排查顺序与验证样本
排查时只修改一个变量。先记录失败连接的域名、目标 IP、端口、命中规则和实际策略,再决定改域名集合还是改 IP 规则。下面是预期结果表,不是线路速度实测;其中的结果需要在当前配置和网络中逐项验证。
| 验证对象 | 预期匹配 | 检查重点 |
|---|---|---|
192.168.1.1:80 | 私网 IP 规则 → DIRECT | 仅在该地址确为本地网关时测试 |
www.qq.com:443 | 域名后缀或规则集 → DIRECT | 连接记录是否保留域名 |
| 不在域名集合内的 CN 地址 | GEOIP → DIRECT | 连接是否已有可匹配 IP |
| 其余新建连接 | MATCH → 境外代理 | 组内实际选中的节点或策略 |
按六步定位,不先重装客户端
- 确认活动配置与模式。 检查当前配置名称,确认处于规则模式,并查看运行中的规则列表,而不只是编辑器中的文件。
- 确认连接进入客户端。 在连接面板查找目标请求。完全没有记录时,优先排查系统代理、TUN 路由或应用自身代理设置。
- 检查第一条命中规则。 若命中较早的宽泛域名规则,移动更具体的例外到它前面。若命中提前出现的 MATCH,先修正兜底位置。
- 核对解析与数据库。 查看目标 IP、IPv4 或 IPv6、地理数据加载日志。采用
no-resolve时,确认未命中是否因为缺少可用 IP。 - 检查规则集加载。 路径错误、缩进错误、格式不一致都可能使提供者不可用。先确认文件可读和条目加载,再验证 RULE-SET 的位置。
- 重新建立连接。 关闭目标应用的旧会话,或在客户端断开对应连接后重试。已有长连接通常不会因为规则文件变化而自动改走另一条出站。
验证完成后还要查看代理组的实际选择。规则命中“境外代理”只说明连接被交给该组;如果组内选中了 DIRECT,最终仍然直连。相反,规则命中直连但页面打不开,问题可能在 DNS、目标服务或本地网络,不应直接判定分流失效。