规则引擎的模型非常简单:请求到达后,从 rules 的第一行开始逐条比较, 命中第一条匹配的规则就立即决定策略,后面的规则不再参与。

规则的匹配流程

一条规则的格式是 匹配器,值,策略,部分匹配器还有可选参数:

#   匹配器          值                     策略
-   DOMAIN-SUFFIX,  github.com,            🚀 节点选择
-   IP-CIDR,        10.0.0.0/8,            DIRECT, no-resolve
-   MATCH,                                  🐟 漏网之鱼

策略可以是节点名、代理组名,或者三个内置策略之一:

策略含义
DIRECT直连,不经过任何代理
REJECT拒绝连接,常用于广告拦截
REJECT-DROP静默丢弃,不返回响应

域名类匹配器

域名规则在发出 DNS 请求之前就能命中,效率最高,应优先使用。

  • DOMAIN, —— 精确匹配完整域名;
  • DOMAIN-SUFFIX, —— 匹配域名后缀,会同时命中子域,最常用;
  • DOMAIN-KEYWORD, —— 关键词匹配,范围最宽但最容易误伤,谨慎使用;
  • DOMAIN-REGEX, —— 正则匹配,适合复杂场景,有一定性能开销。
rules:
  # 精确匹配:只影响 api.example.com
  - DOMAIN,api.example.com,🚀 节点选择

  # 后缀匹配:会命中 a.b.example.com 等所有子域
  - DOMAIN-SUFFIX,example.com,🚀 节点选择

  # 关键词匹配:任何包含该词的域名都会被命中
  - DOMAIN-KEYWORD,ads,REJECT

IP 类匹配器

  • IP-CIDR, / IP-CIDR6, —— 按目标网段匹配;
  • GEOIP,CN —— 按 IP 所属国家/地区匹配,依赖 Country.mmdb
  • SRC-IP-CIDR, —— 按来源地址匹配,适合区分内网设备;
  • IP-ASN, —— 按自治系统号匹配,可一次性覆盖某云厂商的地址段。

务必加上 no-resolve对于 IP 类的规则,如果目标是一个域名,引擎会为了比对而先做一次 DNS 解析,这会显著增加延迟。加上 no-resolve 表示只对纯 IP 请求生效,不做额外解析。

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
  - GEOIP,LAN,DIRECT,no-resolve
  - GEOIP,CN,DIRECT

进程与规则集

桌面端支持按进程名或进程路径分流,特别适合「只代理某个客户端」的场景:

rules:
  - PROCESS-NAME,chrome.exe,🚀 节点选择
  - PROCESS-NAME,Telegram,🚀 节点选择
  - PROCESS-PATH,C:\\Games\\client.exe,DIRECT

RULE-SET 用于引用外部规则集文件,可以把成百上千条规则外置,既保持配置整洁, 又能独立更新:

rule-providers:
  reject:
    type: http
    behavior: domain
    url: "https://example.com/ruleset/reject.yaml"
    path: ./ruleset/reject.yaml
    interval: 86400

rules:
  - RULE-SET,reject,REJECT
  - GEOIP,CN,DIRECT
  - MATCH,🚀 节点选择

推荐的规则顺序

把下面这个顺序记下来,绝大多数配置问题都能避免:

  1. 广告与隐私拦截 —— 优先级最高,尽早拦截;
  2. 本地与内网地址 —— localhost127.0.0.0/8、私网网段,必须直连;
  3. 需要代理的域名 —— 精确域名优先于后缀;
  4. 需要直连的域名与地区 —— 国内网站、GEOIP,CN
  5. 兜底规则 —— MATCH 放最后一行。

常见错误是把 GEOIP,CN,DIRECT 放得太靠前,导致国内 CDN 域名被直接放行,而它实际解析到的是海外 IP,结果是访问缓慢却找不到原因。

如何调试规则命中

把日志等级调到 debug,日志会打印每条连接最终命中的规则:

log-level: debug

# 观察日志中的这一行
# [TCP] example.com:443 match DOMAIN-SUFFIX example.com using 🚀 节点选择

也可以通过控制接口查询当前连接与规则列表,配合面板查看实时命中情况。


规则写完之后,下一步是让代理组具备自动选优能力:代理组与负载均衡策略

配置 ← 返回教程列表