先确定目标:国内直连,国外交给策略组
Clash 的规则模式并不会先判断一个网站属于“国内”还是“国外”,再自动选择出口。内核实际执行的是一张从上到下排列的规则表:每个新连接依次经过规则匹配,命中第一条后立即停止,随后交给该规则指定的策略组、代理节点或 DIRECT。因此,分流效果首先取决于规则顺序,其次才是规则库覆盖率和节点状态。
本文采用一个可直接落地的目标:局域网与明确的国内域名直接连接,已知需要代理的域名交给“国外流量”策略组,剩余目标尝试按 GEOIP 判断,最后由 MATCH 统一兜底。示例以 mihomo v1.19 系列支持的经典规则语法为基线,同样适用于多数读取 Clash YAML 配置的图形客户端。
| 流量类型 | 推荐动作 | 主要规则 | 放置位置 |
|---|---|---|---|
| 本机与局域网地址 | DIRECT | IP-CIDR | 最前 |
| 需要强制代理的域名 | 国外流量 | DOMAIN、DOMAIN-SUFFIX | 国内规则之前 |
| 明确的国内域名 | DIRECT | DOMAIN-SUFFIX | 中段 |
| 解析到中国大陆的 IP | DIRECT | GEOIP,CN | 接近末尾 |
| 其余未命中连接 | 国外流量 | MATCH | 最后一条 |
规则语法:DOMAIN、DOMAIN-SUFFIX 与 IP-CIDR
精确域名与域名后缀
DOMAIN 只匹配一个完整主机名。例如 DOMAIN,api.example.com,国外流量 会匹配 api.example.com,但不会匹配 www.example.com。它适合处理单独的接口域名、更新服务器或需要覆盖通用规则的特殊主机。
DOMAIN-SUFFIX 匹配指定域名及其下级子域名。规则 DOMAIN-SUFFIX,example.com,国外流量 可以覆盖 example.com、www.example.com 和 api.eu.example.com。实际维护中,后缀规则比逐个列出主机名更简洁,但范围也更大;不要为了处理一个接口而把整个业务域名全部改走代理。
rules:
- DOMAIN,api.example.com,国外流量
- DOMAIN-SUFFIX,wikipedia.org,国外流量
- DOMAIN-SUFFIX,qq.com,DIRECT
- DOMAIN-SUFFIX,taobao.com,DIRECT
规则中的策略名称必须与 proxy-groups 里已经存在的名称逐字一致。若策略组叫“节点选择”,规则末尾就应写“节点选择”,不能写成“国外流量”。名称不同不会自动映射,配置检查通常会直接报告找不到策略。
局域网地址用 IP-CIDR 提前直连
路由器后台、NAS、打印机和本地开发服务通常使用私有地址。将这些地址放在前面,可以避免访问 192.168.1.1、10.0.0.20 等设备时被交给远端代理。IPv4 常见私有网段为 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16。
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
no-resolve 表示匹配该 IP 网段时不为域名额外发起解析。对明确的私有地址规则,这能减少不必要的 DNS 查询。它不等同于关闭 DNS,也不会改变已经获得的目标 IP。
GEOIP,CN 的作用与限制
GEOIP,CN,DIRECT 根据目标 IP 的地理归属数据库进行判断。当连接目标已经是 IP 地址,或内核为了匹配规则取得了域名解析结果时,只要该 IP 被数据库归入 CN,就会执行直连。它很适合作为大范围国内直连的后备规则,但不宜替代所有域名规则。
域名归属与服务器 IP 归属并不总是一致。国内业务可能使用境外 CDN 节点,国外服务也可能通过位于中国大陆的边缘节点提供静态资源。GEOIP 数据还存在更新周期,刚调整机房或重新分配的地址段可能暂时归类不准。因此,稳定的关键业务应优先使用 DOMAIN 或 DOMAIN-SUFFIX 指定方向,GEOIP 放在域名规则之后补充覆盖。
是否给 GEOIP 添加 no-resolve
下面两种写法的结果可能不同:
- GEOIP,CN,DIRECT
- GEOIP,CN,DIRECT,no-resolve
第一种允许内核在需要时解析域名,以便取得 IP 后执行地理匹配;第二种阻止这条规则触发额外解析。如果前面已经有覆盖较完整的国内域名规则集,给 GEOIP 添加 no-resolve 可以减少规则匹配阶段的解析动作。如果只依赖少量手写域名规则,过早使用 no-resolve 可能让未被列出的国内域名直接落入 MATCH,最终走代理。
实际配置时可以先使用不带 no-resolve 的写法,观察连接日志和 DNS 延迟。测试环境中,连续首次访问 20 个未缓存域名时,额外解析通常会带来数毫秒到数十毫秒等待,具体数值取决于本地 DNS、网络距离和缓存命中率。若已经启用覆盖充分的 GEOSITE 或 rule-provider,再根据日志决定是否减少 GEOIP 的解析行为。
GEOIP 数据需要随内核资源更新
mihomo 通常通过 GeoIP 数据文件识别地址归属。图形客户端可能在内核更新、配置资源更新或单独的数据库更新入口中维护该文件。若大量常见国内 IP 被错误分到兜底策略,除了检查规则顺序,还应检查 GeoIP 文件是否加载成功。日志里出现资源文件缺失、解析失败或数据库格式不兼容时,继续增加 DOMAIN-SUFFIX 只能缓解局部现象,不能修复地理规则本身。
MATCH 兜底:最后一条决定未知流量出口
MATCH 会接收所有此前没有命中的连接,因此必须放在规则列表末尾。国内直连、国外代理的常见设计是 MATCH,国外流量:无法确认归属的目标默认交给代理策略组。这样更适合规则库暂未收录的新域名,也便于在策略组内切换节点。
如果写成 MATCH,DIRECT,未收录的国外域名会直接连接。它适合“默认直连、只代理少数服务”的另一类需求,却不符合本文的目标。两种设计都能工作,区别在于未知流量的默认出口,而不是 MATCH 本身的优先级。
一份可读的完整规则顺序
以下片段假定配置中已经存在名为“国外流量”的策略组。它不包含节点凭据和订阅信息,可以并入客户端的规则覆写区域:
mode: rule
mixed-port: 7890
log-level: info
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,wikipedia.org,国外流量
- DOMAIN-SUFFIX,githubusercontent.com,国外流量
- DOMAIN-SUFFIX,qq.com,DIRECT
- DOMAIN-SUFFIX,taobao.com,DIRECT
- DOMAIN-SUFFIX,jd.com,DIRECT
- DOMAIN-SUFFIX,bilibili.com,DIRECT
- GEOIP,CN,DIRECT
- MATCH,国外流量
mode: rule 用于启用规则模式,mixed-port: 7890 同时接受常见的 HTTP 与 SOCKS 入站连接。若客户端已经管理端口,不必在覆写中重复声明,以免与界面设置冲突。Clash Verge Rev 2.3.x 可在「设置」→「Clash 设置」中检查当前端口和运行模式;不同版本的分组名称可能略有调整,但应确认模式显示为 Rule,而不是 Global 或 Direct。
规则之间不需要插入空行,示例中的空行只用于区分局域网、强制代理、国内域名和兜底四个层次。YAML 使用空格缩进,不能使用制表符。保存后若客户端提示解析错误,应先检查冒号后的空格、列表前的短横线以及策略组名称。
订阅配置中的持久化方法
直接打开订阅生成的配置并修改,短时间内可以看到效果,但下一次更新订阅时通常会被覆盖。图形客户端一般提供“覆写”“合并配置”或“扩展脚本”能力,用于在订阅内容加载后追加或调整字段。使用哪一种方式,取决于客户端是否支持规则前置、规则后置以及数组替换。
- 先复制当前配置,在副本中完成规则测试。
- 确认客户端的覆写机制是追加
rules,还是完全替换原规则数组。 - 需要优先命中的自定义规则放到订阅规则之前,不能只追加到 MATCH 后面。
- 保存后重新加载配置,再查看实际运行配置,而不是只查看编辑器里的源文件。
- 手动更新一次订阅,确认自定义规则仍然存在并保持原顺序。
“追加到末尾”是最常见的失效原因。订阅规则通常已经以 MATCH 或 FINAL 结束,追加在其后的内容永远不会命中。若客户端只能追加规则,应使用它提供的 prepend、规则前置或脚本注入能力;若只能整体替换,则需要把订阅原有的重要直连、拦截和局域网规则一并纳入维护。
验证分流是否真正生效
先检查模式、端口与系统代理
规则正确但流量没有进入 Clash 时,日志里不会出现对应连接。桌面客户端应先确认 Rule 模式已经启用,再确认系统代理指向当前监听端口。本文示例使用 127.0.0.1:7890;如果界面显示的是 7897、7899 或其他端口,测试命令也要同步修改。
curl -I -x http://127.0.0.1:7890 https://www.qq.com/
curl -I -x http://127.0.0.1:7890 https://www.wikipedia.org/
这两条命令只用于确认请求经过指定 HTTP 代理端口。返回 200、301 或 302 都说明已经收到远端 HTTP 响应,不能仅凭状态码判断出口。真正的分流结果应结合客户端连接列表或日志中的规则名称、策略组和实际节点查看。
在连接日志中看三个字段
- 目标主机:确认日志记录的是预期域名,而不是某个后台请求或页面内的第三方资源。
- 命中规则:国内站点应看到 DOMAIN-SUFFIX 或 GEOIP,CN,国外测试域名应看到指定后缀规则或 MATCH。
- 最终链路:DIRECT 表示直接连接;策略组名称后通常还会显示实际选中的节点。
一个网页会同时连接主站域名、图片 CDN、统计接口、字体资源和视频分片,因此同一页面出现 DIRECT 与代理连接并不矛盾。分流检查应按单个连接判断,而不是把整个浏览器标签页视为一个目标。清空连接记录后重新打开无痕窗口,通常更容易观察首次建立的连接。
用临时规则验证优先级
如果怀疑规则顺序不对,可以在最前面临时加入一条容易识别的测试规则,例如把某个国内域名指向“国外流量”。重新加载配置并访问该域名,若日志仍显示 DIRECT,说明当前运行配置没有采用这条规则,或前置覆写没有生效。测试完成后应删除临时规则,避免长期改变业务访问路径。
TUN 模式下的额外检查
系统代理只覆盖主动读取代理设置的应用,TUN 模式则通过虚拟网络设备接管更多 TCP、UDP 和不遵循系统代理设置的流量。规则语法仍然按照同一顺序匹配,但 DNS、路由表和应用自身的加密 DNS 会更明显地影响结果。
开启 TUN 后,先确认客户端已经取得创建虚拟网络设备所需的系统权限。Windows 可检查客户端是否成功安装并启用虚拟网卡;macOS 会出现网络扩展或 VPN 配置授权;Linux 通常需要可用的 /dev/net/tun 以及相应 capability。权限失败时,界面可能显示 TUN 开关已操作,但实际连接仍只经过系统代理。
若浏览器启用了独立的安全 DNS,它可能绕过配置中的 DNS 监听方案,造成域名解析结果与规则引擎预期不一致。排查阶段可以暂时让浏览器使用系统 DNS,再比较连接日志。mihomo 配置常见的 DNS 监听端口为 1053,代理混合端口常见为 7890,两者用途不同,不能把系统代理指向 DNS 端口。
常见错误与修正方法
| 现象 | 常见原因 | 处理方法 |
|---|---|---|
| 所有网站都走同一节点 | 当前处于 Global 模式 | 切换为 Rule,并重新建立连接 |
| 自定义规则完全不命中 | 规则被追加在 MATCH 后 | 改用规则前置或整体合并 |
| 国内域名偶尔走代理 | 域名未收录,解析 IP 也未归入 CN | 增加精确域名规则并更新 GeoIP 数据 |
| 局域网设备打不开 | 私有地址被兜底规则接管 | 把私有网段 IP-CIDR 放到最前 |
| 更新订阅后规则消失 | 修改了订阅生成文件 | 迁移到客户端覆写或合并配置 |
| 规则命中但网页仍失败 | 策略组选中的节点不可用 | 检查延迟测试、握手日志与节点选择 |
完成配置后,不必追求规则数量越多越好。更稳妥的做法是保留清晰的层次:私有地址、少量强制例外、经过维护的国内域名规则、GEOIP 和最终 MATCH。每次只调整一个层次,并通过日志确认命中结果,后续遇到新域名时也更容易判断应添加精确规则、更新规则集,还是修正策略组。