Shadowrocket 规则语法入门:DOMAIN-SUFFIX、GEOIP、FINAL 等关键字分别匹配什么

逐个讲解 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP、IP-CIDR、FINAL 的匹配对象与书写格式,以及规则自上而下的匹配顺序。

本文速览

本文适合已在 Shadowrocket(小火箭)中准备好自己的服务商配置、需要读懂或调整分流规则的用户。先区分域名与目标 IP,再掌握“首条命中生效、FINAL 放最后”的顺序,最后通过 Config、Global Routing 和连接记录验证结果。示例只说明规则语法,不提供连接服务;客户端买断 ≠ 线路套餐。

一、规则由匹配条件与策略组成

规则用于决定一条连接采用哪种出站策略,不负责创建可用的代理连接。常见写法是“规则关键字,匹配内容,策略”,字段之间使用英文逗号。FINAL 没有匹配内容,因此只有关键字与策略两个字段。配置文件中,这些条目通常写在 [Rule] 段。

[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

这里的 DIRECT 表示直接连接,PROXY 表示通过代理策略出站,REJECT 用于拒绝连接。使用命名策略组时,规则末尾也可以是当前配置中实际存在的组名。不要照抄其他配置里的组名,否则可能出现策略引用无效的问题。本文示例中的 example.com 仅作语法演示,不是服务入口。

连接发起 识别目标 顺序匹配 确定策略 出站连接

要让这些规则参与常规分流,应在 Home → Global Routing 中选择 Config,并在 Config 中确认当前使用的配置。Proxy 与 Direct 属于不同的整体路由姿态,不能用来验证同一套按域名分流的预期;Scene 则应按其场景条件另行核对。编辑了文件,不等于当前连接已采用该文件。

二、DOMAIN 系列匹配域名,不匹配网址路径

先把网址拆开看:https://api.example.com:443/account 的主机名是 api.example.com,端口是 443,路径是 /account。下面三类规则的匹配内容应填写域名或域名片段,不要附上 https://、端口和路径。它们不会依据网页标题或页面正文判断去向。

关键字写法示例匹配范围
DOMAINDOMAIN,api.example.com,PROXY仅完整域名 api.example.com
DOMAIN-SUFFIXDOMAIN-SUFFIX,example.com,PROXYexample.com 本身及其子域名
DOMAIN-KEYWORDDOMAIN-KEYWORD,example,PROXY域名中包含 example 的目标

DOMAIN:给单个主机写例外

DOMAIN,api.example.com,PROXY 不会匹配 www.example.com,也不会匹配 v2.api.example.com。当只有登录接口、某个 API 或一个独立主机需要特殊策略时,完整域名匹配更容易控制范围。域名来源应以实际连接记录为依据,不要仅凭浏览器地址栏猜测所有资源的主机。

DOMAIN-SUFFIX:覆盖一个域名及其子域名

DOMAIN-SUFFIX,example.com,PROXY 可以覆盖 example.com、www.example.com 与 a.b.example.com,但不应匹配 notexample.com 或 example.com.other.test。其含义是域名层级上的后缀,而不是任意字符串结尾。通常填写 example.com,不必写成 *.example.com。

DOMAIN-KEYWORD:范围更宽,需要核对误命中

DOMAIN-KEYWORD,example,PROXY 可能同时匹配 example.com 和 myexample.test。这类规则适合确实需要按字符串覆盖的场景;如果目标只是一个确定的域名家族,优先用 DOMAIN-SUFFIX。过短的关键字会扩大影响范围,也会使后续排错更难定位。

三、GEOIP 与 IP-CIDR 匹配目标 IP

域名规则判断的是名称,IP 规则判断的是连接的目标地址。某个域名解析到哪个 IP,会受到 DNS 结果、网络环境与内容分发部署影响。因此“域名属于某个组织”与“目标 IP 在数据库中归属某个地区”是两种条件,不能互相替代。

GEOIP,CN,DIRECT
IP-CIDR,192.168.50.0/24,DIRECT
IP-CIDR,203.0.113.7/32,PROXY

当请求最初以域名形式出现时,判断 IP 类规则可能涉及域名解析。部分 IP 类规则可以附加 no-resolve,表示不要为了这条规则额外发起域名解析;这不等于关闭 DNS,也不保证所有域名请求都能命中该条 IP 规则。入门配置建议先不添加此参数,等明确 DNS 与匹配过程后再调整。

四、首条命中生效,FINAL 负责兜底

规则通常自上而下检查,第一条满足条件的规则决定策略,不会继续向下寻找“更精确”的条目。DOMAIN 并不天然比 DOMAIN-SUFFIX 优先;如果宽范围规则放在前面,后面的精确例外就没有机会生效。

[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,DIRECT
目标条件首先命中的条目结果
login.example.comDOMAINDIRECT
img.example.comDOMAIN-SUFFIXPROXY
其他域名,目标 IP 被归入 CNGEOIPDIRECT
前面条件均未命中FINALDIRECT

FINAL,DIRECT 表示其余连接直接出站;FINAL,PROXY 表示其余连接交给代理策略。这不是两种写法的优劣比较,而是不同的默认行为。若目标是“只让列出的网站走代理”,前者更符合预期;若把 FINAL 放在首行,后面的条目就失去匹配机会。

五、在 Config 中修改并验证规则

以下步骤以用户已有可用服务商配置为前提。规则决定如何选择策略,代理连接是否成功还取决于服务参数与网络条件。修改前保留原配置副本;若使用会被远程更新覆盖的配置,应先确认本地修改的保存位置与后续更新行为。

  1. 确认当前配置

    进入 Config,确认当前选中的配置文件。通过该文件的编辑入口查看 [Rule] 段,不要修改一个尚未启用的副本。

  2. 添加精确规则

    先加一条 DOMAIN,api.example.com,PROXY 形式的规则,再按需要扩展为 DOMAIN-SUFFIX。保留英文逗号,并核对策略名称确实可用。

  3. 选择 Config

    返回 Home → Global Routing → Config,确认连接开关已开启。测试期间不要切换到 Proxy 或 Direct,否则验证条件发生变化。

  4. 发起新连接

    保存后重新连接,并重新打开测试页面或重启测试应用,以产生新的请求。已建立的长连接不一定因规则编辑立即换路。

  5. 核对连接记录

    在连接记录中核对目标域名、目标 IP 与所选策略;若当前记录提供匹配规则,也一并核对。将实际结果与首条命中的预期逐项比较。

验证时一次只改一个条件。先证明完整域名规则能命中,再改后缀或增加 IP 范围。网页能打开只是结果之一,不能单独证明它走了预期策略;缓存、本地连接和页面的其他域名都可能干扰判断。

六、区分规则未命中与连接失败

排错应分两步:先确定连接选择了哪条策略,再判断该策略的出站是否成功。下面是 DNS 或网络诊断中常见的错误文本,不保证在每个界面都以同样措辞出现。只有实际记录包含这些信息时,才按对应方向检查。

报错:NXDOMAIN

原因与解法:DNS 查询返回域名不存在——核对请求域名的拼写和当前 DNS 返回结果;先解决名称解析,再验证 GEOIP 或需要目标 IP 的规则。修改 FINAL 不会使不存在的域名获得有效地址。

报错:Connection refused

原因与解法:目标连接被主动拒绝,可能是端口未监听或服务策略拒绝——先确认日志中的策略与目标地址,再向自己的服务商核对服务器地址、端口和协议参数;不能仅凭此错误判定 DOMAIN-SUFFIX 写错。

如果没有报错,但记录显示走了意外的策略,优先回查四项:实际主机名是否不同、前面是否已有宽范围规则、当前选中的配置是否正确、Global Routing 是否为 Config。不要为了消除超时而一次加入大量宽泛规则,否则会丢失对照依据。

七、常见规则疑问

写了 DOMAIN-SUFFIX,为什么登录页面仍不对?

重新发起登录并查看连接记录。登录可能跳转到另一个域名,或精确规则被前面的条目覆盖。先为记录中的实际主机添加 DOMAIN 测试,再决定是否扩大后缀范围。

GEOIP,CN,DIRECT 能替代所有域名规则吗?

不能。它判断目标 IP 的数据库归属,不判断网站内容或用途。需要固定按域名选择策略的请求,应在 GEOIP 之前放置对应的 DOMAIN 或 DOMAIN-SUFFIX 规则。

订阅更新后,为什么规则看起来没有变化?

连接信息订阅与 Config 中的规则文件是不同对象。先在 Config 检查当前文件的 [Rule] 内容,不要把 Home 中连接列表更新成功当成规则已经更新的依据。

打开 On Demand,会自动修正规则吗?

不会。Settings → On Demand 控制按条件触发连接,不负责重排规则或选择域名范围。需要检查规则时,仍应核对 Config 的内容与 Home → Global Routing 的当前姿态。

把 FINAL 改成 PROXY,就能证明代理正常吗?

不能。FINAL 只是给未命中请求指定策略。先确认连接确实采用 PROXY,再核对自己的服务商配置和实际出站结果;测试结束后恢复符合日常需求的兜底策略。

前往 App Store