先启用规则模式,再确认流量进入内核
打开客户端的模式选择,切换到「规则 / Rule」;随后进入「代理 / Proxies」,在准备使用的代理策略组中选择一个可连接的节点。国内外分流由规则决定出口,全局模式会绕过这套分流逻辑,直连模式也不会按下文规则选择代理。
本文以使用 mihomo 内核的客户端为配置目标。Clash 是常用的客户端与配置生态称呼,但旧版 Clash 内核对 GEOSITE、数据文件和部分参数的支持存在差异。先在客户端「关于」或内核信息页面确认内核名称;配置报错时,优先检查实际内核和日志,而不是只看应用名称。
- 确认当前配置:在「配置 / Profiles」页找到已启用的订阅,先导出备份。自定义内容优先写进客户端提供的覆写、合并或扩展配置,避免订阅更新后丢失。
- 确认接管方式:浏览器测试可以先打开系统代理;需要覆盖不读取系统代理的程序时,再启用 TUN。两种接管方式都可以使用同一组分流规则。
- 确认监听端口:下面示例使用
mixed-port: 7890。实际端口以当前生效配置为准,不能因为示例用了 7890 就假定客户端也在监听该端口。 - 打开连接记录:找到「连接 / Connections」与「日志 / Logs」。后续需要同时查看目标域名、命中规则和最终策略链。
分清 GEOSITE、GEOIP 与 RULE-SET 的职责
分流可以按域名判断,也可以按目标 IP 判断。国内服务经常使用跨区域 CDN,海外服务也可能解析到邻近地址,因此“IP 所属地区”与“服务应走哪个出口”不是同一件事。通常先应用明确的域名策略,再用 IP 地理库补充判断。
| 规则类型 | 判断依据 | 适合的位置 |
|---|---|---|
DOMAIN-SUFFIX | 域名本身及其子域名 | 需要固定出口的具体服务 |
GEOSITE | 域名分类数据库 | 国内服务、海外服务等批量分类 |
GEOIP | 目标 IP 与地址数据库 | 私有网络或地区 IP 补充判断 |
RULE-SET | 配置中命名的规则提供者 | 独立维护的直连、代理、拦截列表 |
MATCH | 接收前面没有命中的连接 | 规则列表最后一行 |
规则顺序:先命中,先执行
rules 按从上到下的顺序匹配,首次命中后就使用该规则的策略。建议顺序为:必要的例外放行、广告拦截、局域网直连、业务域名策略、国内域名、海外域名、国内 IP、最终兜底。若把 MATCH 提前,后面的规则就没有机会执行。
GEOSITE 的 cn 与 geolocation-!cn 是常见数据集里的分类名称,并非所有数据源都保证提供;后者也不等于“所有不属于国内的域名”。启用前确认当前 geosite 数据包含这些分类。只有 GEOIP 数据文件时,不能据此推断 GEOSITE 也已可用。
配置组合:国内直连、海外代理与广告拦截
下面采用两个本地规则集,分别维护广告域名和业务直连域名。这样可以先验证规则加载与匹配,再考虑换成远程维护的列表。示例中的 PROXY 是策略组名称,必须替换为配置中真实存在的代理组名称,或者确保已有一个同名组;它不是自动创建节点的关键字。
第一步:建立本地规则集文件
在内核可访问的配置目录中建立 rules 文件夹,并分别保存下面两个文件。相对路径通常基于内核工作目录,不一定是下载订阅文件所在目录;部分 GUI 客户端会限制文件路径,应使用客户端允许的配置目录。
rules/local-ads.yaml:采用 classical 行为,文件内容写完整的规则类型,但不写出口策略。
payload:
- DOMAIN-SUFFIX,doubleclick.net
- DOMAIN-SUFFIX,googlesyndication.com
rules/local-direct.yaml:采用 domain 行为,内容只写域名模式。前导 +. 在该规则集语法中覆盖域名本身及其子域名。
payload:
- '+.bilibili.com'
- '+.bilibili.cn'
这里的广告列表只有两个域名,用于演示拦截链路,不代表完整广告覆盖。广告域名可能与登录、统计或内容加载发生依赖关系,扩充列表后应逐项验证。直连列表也只展示写法,视频、图片和账户服务可能使用其他域名,需要结合连接记录补充。
第二步:合并规则提供者与分流规则
将以下字段合并到当前配置。已有 rule-providers 时保留原有条目;已有 rules 时按顺序整合,不要在同一 YAML 层级再写第二个同名键。客户端的“追加规则”若放在订阅的 MATCH 后面,同样不会生效,应使用前置规则或可控制完整顺序的覆写方式。
mixed-port: 7890
mode: rule
rule-providers:
local-ads:
type: file
behavior: classical
format: yaml
path: ./rules/local-ads.yaml
local-direct:
type: file
behavior: domain
format: yaml
path: ./rules/local-direct.yaml
rules:
- RULE-SET,local-ads,REJECT
- 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,fc00::/7,DIRECT,no-resolve
- RULE-SET,local-direct,DIRECT
- GEOSITE,cn,DIRECT
- GEOSITE,geolocation-!cn,PROXY
- GEOIP,CN,DIRECT
- MATCH,PROXY
这是一段合并示例,仍依赖已有的节点、proxy-groups 以及可用的地理数据库,不能单独作为订阅使用。私有地址段只列出了常见范围,并不等于完整的特殊用途地址表;企业网络若使用其他内部网段,应按网络实际规划补充。
第三步:确认兜底策略与兼容性
- 国内域名优先直连:
GEOSITE,cn,DIRECT位于 IP 判断之前,避免国内服务仅因解析到其他地区的 CDN 就落到代理兜底。 - 已分类海外服务优先代理:海外域名规则位于国内 IP 规则之前,减少海外服务因 CDN 地址位置而被意外直连。
- 未分类连接走代理:
MATCH,PROXY偏向海外服务可达性。若改成MATCH,DIRECT,未收录的海外域名可能直连失败;选择应与使用需求一致。 - 缺少分类时先移除对应行:如果内核提示 GEOSITE 分类不存在,先恢复可加载配置,再配置匹配的数据源。不要反复重启客户端掩盖加载错误。
DNS 与 no-resolve:避免把解析问题当作规则问题
保存并重新加载配置后,先看日志是否出现规则集文件找不到、策略组不存在、地理数据库读取失败等错误。加载成功后,再检查 DNS。域名解析得到异常地址时,即使规则顺序正确,也可能出现直连超时或服务访问失败。
国内 IP 规则是否添加 no-resolve
示例中的 GEOIP,CN,DIRECT 没有添加 no-resolve,因此在匹配需要 IP 而连接只有域名时,内核可触发解析以继续判断。它有助于把未收录进国内域名分类的国内地址交给直连,但也会增加对 DNS 结果的依赖。
若改为 GEOIP,CN,DIRECT,no-resolve,该规则不会为了自身匹配而触发域名解析。已经掌握目标 IP 的连接仍可匹配;仅有域名且缺少可用地址的连接则可能继续落到 MATCH。因此,添加这个参数并不等于提高国内识别准确率。
Fake-IP 与 TUN 的检查重点
- Fake-IP:应用可能拿到
198.18.0.0/16常见范围内的映射地址,具体范围以fake-ip-range为准。这个地址不是服务器的真实地理位置,不能拿它查询地区来评价分流。 - 域名信息:正确的 DNS 接管与映射有助于内核恢复域名并应用 GEOSITE。应用使用独立加密 DNS、直接连接缓存 IP 或复用旧连接时,观察结果可能不同。
- TUN:确认虚拟网卡路由和 DNS 接管实际生效。TUN 扩大接管范围,但不会自动修正策略组名称、规则顺序或数据库分类。
- 解析器选择:分别测试国内域名与代理域名的解析结果。需要按域名选择解析器时,再设置
nameserver-policy;修改前核对当前 mihomo 文档与客户端的 DNS 覆写行为。
验证分流:看命中规则,不只看网页能否打开
完成重载后,关闭测试应用中仍在使用的旧连接,或在客户端连接页面结束对应连接,再发起新请求。既有 TCP 连接通常不会因为规则变化立即重新选路,浏览器的连接复用也可能让旧结果持续一段时间。
- 验证国内直连:打开
www.bilibili.com,在连接记录按域名筛选。首页域名应命中local-direct或其他更靠前的直连规则,策略链最终显示DIRECT。附属资源需分开检查。 - 验证海外代理:访问实际需要代理的海外服务,查看是否命中
geolocation-!cn或MATCH,并确认策略链从PROXY落到预期节点,而非组内的直连选项。 - 验证拦截:请求
https://doubleclick.net/,预期连接命中local-ads并采用REJECT。浏览器报错本身不够,需用连接记录确认是规则拦截而非 DNS 或网络失败。 - 验证局域网:访问实际使用的路由器或 NAS 地址,检查私有网段规则与直连出口。公司网络存在特殊路由时,同时检查系统路由表。
用显式代理排除系统代理设置的影响
在 macOS「终端」中执行下面命令,可明确把请求送入本机 7890 端口。--max-time 15 将单次测试限制为 15 秒;这只是诊断参数,不是性能实测结果。若实际端口不同,先修改命令。
curl -I --max-time 15 \
--proxy http://127.0.0.1:7890 \
https://www.bilibili.com/
curl -I --max-time 15 \
--proxy http://127.0.0.1:7890 \
https://www.wikipedia.org/
HTTP 状态码由目标服务决定,重定向、访问限制或不接受 HEAD 请求都可能影响输出。这里主要检查请求是否出现在客户端连接记录,以及其命中规则和策略链;单凭 200、403 或一次超时,无法判断国内外分流是否准确。
常见偏差:按配置、匹配、出口三层排查
| 现象 | 优先检查 | 处理方向 |
|---|---|---|
| 国内站点仍走代理 | 实际域名、直连列表、规则位置 | 按连接记录补域名;把明确直连规则移到代理规则之前 |
| 海外站点命中直连 | 宽泛直连规则、组内选择 | 收窄域名范围,检查代理组是否选到了 DIRECT |
| 保存后完全不生效 | 当前配置、覆写结果、模式 | 确认正在运行的是目标配置,并切换到 Rule |
| 广告仍然出现 | 是否同源投放、是否实际命中 | 补充独立广告域名;同域名内容需由浏览器内容过滤处理 |
| 代理请求超时 | 命中记录、节点连通性、DNS | 先确认选路正确,再测试节点与解析,避免盲目加规则 |
| 重载提示文件错误 | 路径、YAML 缩进、behavior | 核对工作目录,保持文件格式与规则提供者声明一致 |
例外规则保持最小范围
某个广告规则误伤登录时,将经过确认的必要域名单独放到拦截规则之前。优先使用 DOMAIN 精确匹配,而不是把整个服务商的大域名全部放行。反过来,某个海外服务需要固定代理,也应在国内分类前增加精确规则,而不是删除整组国内直连。
规则集从本地文件改为远程订阅时,要同时核对 type、behavior、format 和更新周期。domain 列表不能直接按 classical 规则读取,YAML 规则也不能仅改扩展名就当作二进制规则集。更新后保留一份可回滚配置,再用同一组域名重做验证。
最终检查可以归纳为三件事:连接确实进入内核,规则命中符合预期,策略组最终出口正确。把这三层分开记录,国内直连、海外代理与广告拦截才能持续维护,而不是靠不断增加规则碰运气。需要了解客户端操作入口,可查看使用教程;需要核对配置字段,可查看进阶配置。