适用范围:先确认内核与流量入口

境内外分流适合这样的场景:境内办公、视频和下载服务保持直连,境外服务交给指定代理策略组。这里的“境内外”是规则数据库对域名或 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 是说明规则行为的保留示例域名,不是需要实际访问的测试服务。

建议的排序层次

  1. 自己的精确例外,例如某个域名必须直连或必须代理。
  2. 本地地址段,避免 NAS、路由器和局域网服务进入境外代理。
  3. 明确的境外服务域名规则与规则集。
  4. 境内域名集合,再接境内 IP 地理规则。
  5. 最后放 MATCH,承接分类以外的流量。

GEOIP、GEOSITE、RULE-SET 的边界

规则类型判断依据常见写法与用途
GEOIP目标 IP 所属的数据分类GEOIP,CN,DIRECT,no-resolve,接住境内 IP 流量。
GEOSITEGeoSite 数据库中的域名集合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 使用的数据文件。主配置更新、规则集下载和地理数据库更新应分别检查。

  1. 保存并重新加载配置,先确认内核没有 YAML 解析或策略组不存在的错误。
  2. 在客户端规则集页面查找 overseas-domains 与 domestic-domains。界面名称因客户端而异,核对条目数量、更新时间和错误日志比只看开关更可靠。
  3. 手动更新一次,确认下载成功。示例缓存位置为内核工作目录下的 ./ruleset/,不是固定的系统绝对目录。
  4. 再更新节点订阅,重新加载后检查自定义规则是否仍在。若消失,应把修改迁移到客户端持久化覆写入口。

首次启动时若规则来源无法直连,而代理节点尚未可用,可能出现规则集下载失败的启动依赖问题。先恢复一个可工作的基础配置,再下载规则集;对确认支持该字段的 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 和全部规则更容易定位问题。