适用范围:先确认内核与流量入口
境内外分流适合这样的场景:境内办公、视频和下载服务保持直连,境外服务交给指定代理策略组。这里的“境内外”是规则数据库对域名或 IP 的分类,不是按网页语言、公司注册地或域名后缀直接推断。一个境外服务也可能使用境内 CDN,因此域名规则通常应放在 IP 地理规则之前。
本文完整示例面向 Clash Meta,即现称的 mihomo 内核。经典 Clash 与不同分支对 GEOSITE、规则集格式和数据文件的支持并不相同。先在客户端「关于」或内核信息页面核对实际内核,不要只凭客户端名称判断。若加载时提示未知规则类型,应先查兼容性,而不是反复调整缩进。
- 运行模式:在客户端「代理」或「模式」页面选择「规则」。全局模式不会按本文的
rules列表逐条分流。 - 流量入口:浏览器先通过系统代理测试;需要接管不遵循系统代理的应用时,再单独检查 TUN。开启 TUN 不会替代规则配置。
- 策略组:下文使用名为
境外代理的已有策略组。它必须包含可用节点,且在proxy-groups中真实存在。 - 备份:先导出当前配置。订阅用户优先使用客户端提供的覆写、扩展或合并功能,避免订阅更新覆盖本地修改。
匹配顺序:从上到下,首条命中生效
规则不是按“写得越精确优先级越高”自动排序。对于这里列出的常见规则,内核从列表顶部向下检查,命中后就采用该条规则的目标。即使一条更精确的域名规则写在后面,也不会推翻前面已经命中的宽泛规则。
rules:
- DOMAIN,mail.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,境外代理
- GEOIP,CN,DIRECT,no-resolve
- MATCH,境外代理
这段示例中,mail.example.com 直连,www.example.com 使用境外代理;两者都不会继续交给 GEOIP 决定。example.com 是说明规则行为的保留示例域名,不是需要实际访问的测试服务。
建议的排序层次
- 自己的精确例外,例如某个域名必须直连或必须代理。
- 本地地址段,避免 NAS、路由器和局域网服务进入境外代理。
- 明确的境外服务域名规则与规则集。
- 境内域名集合,再接境内 IP 地理规则。
- 最后放
MATCH,承接分类以外的流量。
GEOIP、GEOSITE、RULE-SET 的边界
| 规则类型 | 判断依据 | 常见写法与用途 |
|---|---|---|
| GEOIP | 目标 IP 所属的数据分类 | GEOIP,CN,DIRECT,no-resolve,接住境内 IP 流量。 |
| GEOSITE | GeoSite 数据库中的域名集合 | GEOSITE,cn,DIRECT,按域名识别境内服务。 |
| RULE-SET | 指定 rule-provider 提供的规则 | RULE-SET,overseas-domains,境外代理,引用单独维护的集合。 |
GEOIP:识别 IP,不代表识别整个服务
GEOIP,CN 根据所用地理数据库判断目标地址。数据库可能存在更新延迟,云服务和 CDN 也会让同一域名解析到不同地区。对于明确要走代理的服务,应优先使用域名规则,不要期待一条 GEOIP 就能表达全部业务需求。
no-resolve 的含义是:不要为了检查这条 IP 规则而主动把域名解析成 IP。它不是全局关闭 DNS。连接已经具有真实目标 IP 时仍可参与匹配;若尚无可用 IP,则该规则可能无法命中,继续落到后面的规则。代理节点自身的地址解析与应用解析也仍然需要正常工作。
GEOSITE:依赖 GeoSite 数据文件
GEOSITE,cn 需要内核能够加载包含 cn 分类的 GeoSite 数据。不同发行包可能预置数据,也可能在首次使用时下载。若日志提示文件缺失或分类不存在,应检查内核的数据目录、下载连接与数据源,而不是把 cn 随意改成网站域名。GEOSITE 的域名分类与 GEOIP 的 IP 分类是两套数据。
RULE-SET:格式与 behavior 必须对应
规则集把规则内容与主配置分开,适合定期更新。behavior: domain 用于域名集合,ipcidr 用于 IP 网段集合,classical 用于包含规则类型的传统规则列表。YAML、纯文本和 MRS 的解析方式也不同;不能只换 URL,而保留不匹配的 format 与 behavior。
配置实战:境内直连,境外代理
下面给出可合并到现有 mihomo 配置的完整 rule-providers 和 rules 段,保留原配置中的节点、策略组与 DNS 设置。它不是独立运行的订阅文件。合并前,将已有策略组命名为 境外代理,或把代码中每个同名目标改为自己的准确组名。
示例引用 Loyalsoldier 的 Clash 域名规则集 YAML 文件:境外集合优先,境内集合其次,再由 GEOSITE 与 GEOIP 补充判断。重叠域名以列表中更靠前的规则为准。若只想维护一套境内域名来源,可以删除境内 RULE-SET 或 GEOSITE 中的一条,并同步清理不用的 provider。
mode: rule
rule-providers:
overseas-domains:
type: http
behavior: domain
format: yaml
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/proxy.txt"
path: ./ruleset/overseas-domains.yaml
interval: 86400
domestic-domains:
type: http
behavior: domain
format: yaml
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
path: ./ruleset/domestic-domains.yaml
interval: 86400
rules:
- DOMAIN-SUFFIX,google.com,境外代理
- DOMAIN-SUFFIX,github.com,境外代理
- DOMAIN-SUFFIX,githubusercontent.com,境外代理
- DOMAIN-SUFFIX,qq.com,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-CIDR,169.254.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
- RULE-SET,overseas-domains,境外代理
- RULE-SET,domestic-domains,DIRECT
- GEOSITE,cn,DIRECT
- GEOIP,CN,DIRECT,no-resolve
- MATCH,境外代理
合并时检查三个位置
- 顶层键只保留一份:已有
rules:时,编辑原列表,不要在文件末尾再添加第二个同名键。重复键可能报错,也可能造成前一段被覆盖。 - 名称完全一致:
RULE-SET第二项必须对应 provider 名称;最后一项必须是内置动作或已存在的策略组。中文名、空格和大小写都要核对。 - 保留实际所需的 IPv6 规则:应用如果走 IPv6,只有 IPv4 的局域网与公网规则并不足够。不要为简化排错而随意删除系统网络功能。
规则集更新:区分订阅、provider 与地理数据
interval: 86400 的单位是秒,即 24 小时。它控制 HTTP rule-provider 的更新检查,不会同时刷新节点订阅,也不会刷新 GEOSITE 使用的数据文件。主配置更新、规则集下载和地理数据库更新应分别检查。
- 保存并重新加载配置,先确认内核没有 YAML 解析或策略组不存在的错误。
- 在客户端规则集页面查找
overseas-domains与domestic-domains。界面名称因客户端而异,核对条目数量、更新时间和错误日志比只看开关更可靠。 - 手动更新一次,确认下载成功。示例缓存位置为内核工作目录下的
./ruleset/,不是固定的系统绝对目录。 - 再更新节点订阅,重新加载后检查自定义规则是否仍在。若消失,应把修改迁移到客户端持久化覆写入口。
首次启动时若规则来源无法直连,而代理节点尚未可用,可能出现规则集下载失败的启动依赖问题。先恢复一个可工作的基础配置,再下载规则集;对确认支持该字段的 mihomo,也可以为 HTTP provider 设置 proxy: 境外代理,让其下载使用现有策略组。该组应由已加载的节点支撑,避免循环依赖尚未下载的资源。
需要离线部署时,可以预先保存对应 YAML 文件,并将 provider 改为 type: file,保留正确的 path、behavior 和 format,移除 HTTP 下载字段。此时更新文件的责任转为本地维护,不再按 HTTP 更新间隔自动拉取。
验证分流:看命中规则,不只看网页是否打开
打开客户端的「连接」页面,分别访问一个明确直连域名和一个明确代理域名。检查目标主机、命中规则、策略链和目标 IP。网页加载成功只能说明请求有结果,不能证明采用了预期路径;节点选择器里选中了节点,也不代表所有连接都会经过它。
用固定入口减少变量
如果当前配置的混合端口是 7890,可以在终端执行以下命令。端口不同就按实际值修改。命令只用于 HTTP 请求验证,不测试整个系统的 TUN 接管范围,也不等同于测速。
curl -I --proxy http://127.0.0.1:7890 https://www.qq.com/
curl -I --proxy http://127.0.0.1:7890 https://github.com/
按照本文规则,第一个请求应命中 DOMAIN-SUFFIX,qq.com 并直连;第二个应命中 DOMAIN-SUFFIX,github.com 并进入境外代理组。服务端可能返回重定向或拒绝 HEAD 请求,判断分流仍应以客户端连接记录为准。
常见偏差与对应处理
- 总是命中 MATCH:核对域名是否出现在连接记录中、provider 是否加载成功,以及 GEOSITE 分类是否可用。直接访问 IP 的请求无法按普通域名规则命中。
- 修改后仍走旧节点:已有长连接可能继续沿用原策略。重新建立测试连接,再查看新的命中记录,不要只刷新一个持续复用连接的应用窗口。
- 境外服务被 GEOIP 直连:确认服务域名规则是否缺失,补在 GEOIP 之前。不要用某次解析结果永久代表整个服务。
- 浏览器与其他应用结果不同:检查系统代理、应用自带代理、TUN 路由及浏览器安全 DNS。嗅探可以在部分协议中辅助恢复域名,但不能保证从所有加密流量中获得域名。
- fake-ip 场景下看到虚拟地址:这是 DNS 映射机制的一部分,内核通常利用映射恢复域名。不要把 fake-ip 地址池当成真实境外地址加入代理 IP 列表。
维护顺序:先小范围例外,再扩展规则集
日常维护不需要不断增加相似规则。先保留“精确例外、域名集合、IP 补充、最终兜底”这四层,再根据连接记录处理真实偏差。新增一条规则时,记录适用域名、目标策略和添加原因;测试通过后再同步到其他设备。
多端使用同一订阅,也不意味着所有内核都能解析同一份配置。向其他设备复制前,确认 GEOSITE、IPv6、provider 格式和自定义覆写机制都受支持。完整操作入口可参考订阅导入教程;遇到连接路径问题,再检查系统代理设置和端口说明。
最终验收应满足三项:配置能够正常加载,境内与境外测试请求分别命中预期规则,规则集手动更新成功且订阅更新后自定义内容仍保留。三项都通过,再扩大到日常应用,比一次改动 DNS、TUN 和全部规则更容易定位问题。