进阶配置 预计阅读 14 分钟

Clash 规则分流配置实战:国内直连、国外走代理的 rules 写法与代理组设计

以真实 rules 语法为例,拆解 DOMAIN-SUFFIX、GEOIP、RULE-SET 的匹配顺序,给出国内直连、国外走代理、广告拒绝三类场景的可用配置思路与排错要点。

先确认规则分流的执行模型

Clash 与 Clash Meta(mihomo)的规则系统按列表顺序从上到下匹配。一个连接命中首条符合条件的规则后,后面的规则不再参与判断。因此,配置结果不仅取决于写了哪些规则,也取决于每条规则放在什么位置。

典型的国内直连、国外代理配置,可以按“局部例外优先、宽泛规则靠后”的顺序组织:先处理局域网与必须直连的域名,再处理拒绝规则和指定代理域名,然后匹配国内域名、国内 IP,最后使用 MATCH 接住未命中的流量。

rules:
  - DOMAIN,router.asus.com,DIRECT
  - DOMAIN-SUFFIX,qq.com,DIRECT
  - DOMAIN-SUFFIX,bilibili.com,DIRECT
  - DOMAIN-SUFFIX,github.com,国外代理
  - GEOIP,CN,DIRECT
  - MATCH,国外代理

这段配置中,访问 www.qq.com 会命中 DOMAIN-SUFFIX,qq.com,DIRECT;访问 GitHub 会进入“国外代理”组;解析后属于中国大陆地址的其他连接会被 GEOIP,CN,DIRECT 接管;剩余流量最终交给“国外代理”。

三类动作分别代表什么

  • DIRECT:连接直接从本机或当前网关发出,不经过代理节点。
  • REJECT:由内核拒绝连接,适合已确认的广告域名、追踪域名或不需要访问的目标。
  • 代理组名称:把连接交给指定组,例如“国外代理”“自动选择”或“故障转移”。组内再决定具体节点。

规则的第三段必须与代理组名称完全一致,包括中文、空格和大小写。若规则写成 国外代理,而 proxy-groups 中实际名称是 国外节点,内核校验时通常会提示代理组不存在。

DOMAIN、DOMAIN-SUFFIX 与 DOMAIN-KEYWORD 怎么选

域名规则通常比 IP 规则更直观,也更适合处理站点级分流。选择规则类型时,应尽量使用边界明确的匹配方式,避免一个短关键词影响大量无关域名。

规则类型 匹配范围 适用场景
DOMAIN 只匹配完整域名 单独处理某个 API、下载域名或内网主机
DOMAIN-SUFFIX 匹配主域名及其子域名 处理一个站点旗下的大部分服务
DOMAIN-KEYWORD 域名中包含指定字符串 域名规律明确、无法用后缀概括的少量场景
rules:
  - DOMAIN,api.example.net,国外代理
  - DOMAIN-SUFFIX,example.org,国外代理
  - DOMAIN-KEYWORD,cdnvideo,国外代理

DOMAIN,api.example.net 只会匹配这个完整主机名,不会自动匹配 www.example.netDOMAIN-SUFFIX,example.org 可以匹配 example.orgwww.example.orgstatic.example.org。相比之下,DOMAIN-KEYWORD 的覆盖面难以直接观察,应限制使用数量。

局部例外必须放在宽泛后缀之前

如果同一站点的大部分请求需要代理,但下载服务器需要直连,可以先写完整域名例外,再写域名后缀:

rules:
  - DOMAIN,download.example.org,DIRECT
  - DOMAIN-SUFFIX,example.org,国外代理
  - MATCH,国外代理

交换这两条规则后,download.example.org 会先被后缀规则命中,直连例外便不会生效。这是修改 rules 后“规则明明存在,实际却没有执行”的高频原因。

用代理组分离手动选择、测速与故障转移

rules 负责决定流量进入哪个策略,proxy-groups 负责决定策略使用哪个节点。把节点名称直接写进大量规则虽然可以运行,但节点更新或重命名后需要逐条修改。更稳定的方式是让规则统一指向代理组,再由代理组管理节点。

proxy-groups:
  - name: 国外代理
    type: select
    proxies:
      - 自动选择
      - 故障转移
      - 香港节点 A
      - 新加坡节点 A
      - DIRECT

  - name: 自动选择
    type: url-test
    proxies:
      - 香港节点 A
      - 新加坡节点 A
      - 日本节点 A
    url: https://www.gstatic.com/generate_204
    interval: 300
    tolerance: 50

  - name: 故障转移
    type: fallback
    proxies:
      - 香港节点 A
      - 新加坡节点 A
      - 日本节点 A
    url: https://www.gstatic.com/generate_204
    interval: 300

select、url-test 与 fallback 的区别

  • select:由用户手动选择组内项目。适合作为 rules 最终引用的总入口。
  • url-test:周期性测试组内节点,选择延迟较低的可用项。示例每 300 秒测试一次,tolerance: 50 表示延迟差距不足 50 毫秒时减少频繁切换。
  • fallback:按列表顺序使用第一个可用节点。它更强调固定优先级,而不是单纯追求最低延迟。

延迟测试地址应返回体积很小且状态稳定的响应。一次测速只能说明探测地址的往返时间,不能直接代表视频吞吐量或所有网站的连接质量。实际选择节点时,还应观察 5 至 10 分钟内的连接失败率、页面首包时间和下载速率。

国内直连与国外代理的完整 rules 顺序

仅使用 GEOIP,CN,DIRECT 并不能覆盖所有国内服务。GEOIP 依据目标 IP 所属区域判断,只有在连接进入 IP 匹配阶段后才能发挥作用。部分站点使用跨境 CDN、全球 Anycast 或境外地址,即使业务面向国内用户,也可能不属于 CN 地址库。因此,常用国内域名规则通常应放在 GEOIP 之前。

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

  # 明确的域名动作
  - DOMAIN-SUFFIX,qq.com,DIRECT
  - DOMAIN-SUFFIX,weixin.qq.com,DIRECT
  - DOMAIN-SUFFIX,bilibili.com,DIRECT
  - DOMAIN-SUFFIX,github.com,国外代理
  - DOMAIN-SUFFIX,githubusercontent.com,国外代理

  # IP 区域与最终兜底
  - GEOIP,CN,DIRECT
  - MATCH,国外代理

no-resolve 用于告诉内核:执行这条 IP 规则时不要仅为匹配规则而额外触发域名解析。它适合已经拿到目标 IP 的连接和局域网网段规则,但不能代替正常 DNS 配置。对于依赖域名判断的请求,仍需确保 Clash DNS 模块能够稳定获得结果。

为什么局域网规则要放在前面

打印机、NAS、路由器管理页和局域网开发服务通常使用 10.0.0.0/8172.16.0.0/12192.168.0.0/16。如果这些地址被兜底规则送进远端代理,连接往往会超时。TUN 模式会接管更广泛的系统流量,因此更需要明确保留私有地址直连。

若企业内网使用自定义网段,还要追加实际网段。例如办公网络服务位于 100.64.20.0/24,可增加 IP-CIDR,100.64.20.0/24,DIRECT,no-resolve。注意 100.64.0.0/10 也常用于运营商级 NAT,不应在不了解网络结构时直接扩大直连范围。

RULE-SET:把大规模规则拆成独立文件

当域名达到数百或数千条时,直接维护主配置会变得困难。mihomo 支持通过 rule-providers 加载规则集合,再在 rules 中使用 RULE-SET 引用。这样可以分别管理广告拒绝、国内域名、代理域名和私有网络。

rule-providers:
  reject-domain:
    type: file
    behavior: domain
    format: yaml
    path: ./ruleset/reject-domain.yaml

  domestic-domain:
    type: file
    behavior: domain
    format: yaml
    path: ./ruleset/domestic-domain.yaml

rules:
  - RULE-SET,reject-domain,REJECT
  - RULE-SET,domestic-domain,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,国外代理

对应的 domain 类型规则文件可以使用 payload 列表。以下内容用于说明格式,实际部署时应替换为经过检查的域名集合:

payload:
  - '+.ads.example.test'
  - '+.tracker.example.test'
  - 'metrics.example.test'

behavior: domain 适合域名集合;behavior: ipcidr 适合 IPv4、IPv6 网段;behavior: classical 可以容纳带规则类型的传统条目。behavior 必须与规则文件内容对应,把 IP 网段放进 domain 集合会导致载入失败或无法匹配。

远程规则集的更新策略

使用 HTTP 类型 provider 时,一般需要提供 url、本地缓存 path 和更新间隔 interval。例如设置 interval: 86400,代表每 86400 秒检查一次更新。规则源短时间不可访问时,内核通常继续使用已缓存文件;首次启动且本地没有缓存时,则可能无法完成加载。

广告拒绝规则应放在国内直连集合之前,否则同时存在于两个集合中的域名会先命中 DIRECT。对登录、支付、验证码、媒体播放等关键请求,不宜只根据域名中出现 adtrack 等字符串直接拒绝。发生页面组件缺失时,应先在连接日志中定位被 REJECT 的主机,再添加精确放行规则。

rules:
  - DOMAIN,login.example.test,DIRECT
  - RULE-SET,reject-domain,REJECT
  - RULE-SET,domestic-domain,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,国外代理

DNS、TUN 模式与规则结果的关系

系统代理模式主要接管遵循 HTTP 或 SOCKS 代理设置的应用;TUN 模式则通过虚拟网卡接管更多 TCP、UDP 流量。两种模式最终都可以使用同一套 rules,但 DNS 解析路径和流量覆盖范围不同。

fake-ip 模式下看到保留地址是否正常

启用 enhanced-mode: fake-ip 后,客户端可能先向应用返回 198.18.0.0/15 范围内的映射地址,再由内核根据原始域名执行规则。这不代表目标网站真实位于该网段。排查时应查看连接详情中的 Host、Rule 与 Rule Payload,而不是只根据应用显示的目标 IP 判断。

dns:
  enable: true
  listen: 0.0.0.0:1053
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - 223.5.5.5
    - 119.29.29.29
  fallback:
    - tls://1.1.1.1:853
    - tls://8.8.8.8:853

示例把 Clash DNS 监听在 1053 端口,避免与本机已有的 53 端口服务直接冲突。具体客户端通常会自动管理监听地址与 DNS 劫持,不应在不了解其覆写逻辑时同时修改图形界面和订阅原始文件。

TUN 开启后局域网无法访问

先确认私有网段 DIRECT 规则是否位于 MATCH 之前,再检查 TUN 的路由排除项、严格路由设置和 DNS 劫持。mihomo 配置常见的 DNS 劫持写法包括 any:53,其目的在于把进入 TUN 的 53 端口查询交给内核处理。若本机同时运行 AdGuard Home、systemd-resolved 或企业 VPN DNS,应避免多个服务争用相同端口。

配置校验、命中检查与常见错误

完成修改后,先做语法校验,再重载配置。mihomo 1.19.x 可在命令行使用配置目录执行测试;不同安装方式的二进制名称和目录可能不同:

mihomo -t -d /etc/mihomo

测试通过后,在客户端执行「配置」→「重新载入」,或在服务端运行对应的重启命令。部分桌面客户端把配置目录入口放在「设置」→「配置目录」。订阅配置重新更新时,直接编辑的文件可能被覆盖,长期自定义规则应放入客户端支持的覆写、合并配置或单独维护的 provider 文件中。

规则没有命中的排查顺序

  1. 在连接页面找到目标域名,记录实际命中的 Rule 与策略组。
  2. 检查目标域名是否经过 CNAME 跳转,实际连接主机可能与浏览器地址栏不同。
  3. 搜索 rules 上方是否已有更宽泛的 DOMAIN-SUFFIX、RULE-SET 或 GEOIP 规则。
  4. 确认规则引用的代理组名称与 proxy-groups 完全一致。
  5. 重新载入配置,并确认当前启用的是修改后的配置文件。
  6. 清理应用自身的 DNS 缓存或断开旧连接,再发起一次新请求。

国内网站仍然走代理

先查看它是否在 GEOIP 之前命中了代理规则集。若没有域名规则,检查目标 IP 是否被识别为 CN。使用全球 CDN 的站点可能解析到境外地址,应为其主要业务域名增加 DOMAIN-SUFFIX 直连规则,而不是扩大 GEOIP 或 IP-CIDR 范围。

国外网站间歇性直连

检查是否存在过宽的国内域名集合、关键字规则或自定义 IP 直连段。还要确认浏览器是否启用了独立安全 DNS;当域名解析和连接被不同软件接管时,日志可能缺少预期的域名信息。排查阶段可暂时统一由 Clash DNS 处理,再逐项恢复其他 DNS 设置。

代理组有节点但显示不可用

分别测试节点本身与健康检查地址。若所有节点恰好同时失败,可能是测试地址被当前网络限制,而不是所有节点都失效。可更换为稳定的小响应地址,并把测试间隔保持在 300 至 600 秒,避免过于频繁的探测增加连接数量。

一份可维护的分流配置应具备什么

稳定的规则配置不以条目数量为目标,而是保持清晰的优先级:私有网络和精确例外在前,拒绝集合与业务域名随后,国内域名和 GEOIP 用于大范围归类,MATCH 负责最终兜底。代理节点通过 select、url-test、fallback 等代理组统一管理,rules 不直接依赖频繁变化的节点名称。

每次调整建议只修改一个层级,并通过连接日志验证。一次同时更换 DNS 模式、开启 TUN、替换规则集和改动代理组,会让问题来源难以定位。按照“语法校验、重新载入、产生新连接、检查命中规则”的顺序测试,通常可以在数分钟内判断问题位于规则顺序、DNS、节点还是系统接管范围。

下载 Clash 客户端