· 规则分流 · 约 9 分钟

Shadowrocket 规则语法入门:DOMAIN、DOMAIN-SUFFIX、GEOIP 与 FINAL 的匹配范围

逐条解释 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP、IP-CIDR、FINAL 分别匹配什么,讲清书写格式与自上而下的匹配顺序,并附可直接对照的示例行。

本文速览

Shadowrocket(小火箭)的规则分流以 Global Routing 选择 Config 为前提。本文适合已经持有自己的服务商连接资料、准备编辑配置的用户:先辨认规则字段,再区分域名与 IP 匹配,最后按顺序验证命中结果。示例域名与地址用于说明语法,不是可用连接资料;修改前请保留现有配置。

1. 规则生效条件与匹配顺序

先给结论:规则按配置中的顺序自上而下检查,命中适用规则后采用该规则的策略,不会因为后面还有一条“更精确”的规则而自动重新选择。应把例外放在前面,把较宽范围放在后面,并用 FINAL 接住其余请求。只有确认当前使用的配置文件,编辑规则才有明确的作用对象。

在 Home → Global Routing 中选择 Config,才能按当前配置进行分流。Proxy 与 Direct 是全局路由姿态,不能用它们验证本文示例的规则顺序;Scene 则按场景设置工作,检查时还要核对场景对应的路由。测试单份规则文件时先使用 Config,避免把路由姿态造成的结果误认为语法问题。

发起请求 识别目标 顺序匹配 选定策略 建立连接

这条流程说明的是规则决策关系,不代表所有请求都必须先做一次 DNS 查询。域名规则使用已知的目标域名,IP 规则使用目标地址;能否取得域名、是否需要解析,以及配置中的 DNS 设置,都会影响可参与匹配的信息。命中 PROXY 只表示选用了代理策略,不表示后续连接一定成功。

2. 规则行格式:关键字、条件与策略

常见规则行由英文逗号分隔。DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP 与 IP-CIDR 都需要匹配条件和策略;FINAL 没有匹配条件,只跟策略。规则放在配置的 [Rule] 段,不要把它们写进 [General] 或 [Host]。

[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,example,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,DIRECT

上述配置把 login.example.com 作为先行例外,其余 example.com 范围交给 PROXY。关键字规则覆盖更广,只是用来展示格式;实际配置不需要同时写入所有类型。PROXY 与 DIRECT 是策略,不是协议名。Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuard 等协议的连接参数应在已有连接配置中核对,不能填入规则行的策略位置。

条件中只写规则需要的内容。域名规则填写域名,不加 https://、路径、查询参数或 :443。例如 https://example.com/account 的域名条件是 example.com;这六类规则不能凭 URL 路径区分同一网站的不同页面。

3. DOMAIN、DOMAIN-SUFFIX 与 DOMAIN-KEYWORD

DOMAIN 精确匹配一个完整域名;DOMAIN-SUFFIX 匹配指定域名及其子域名;DOMAIN-KEYWORD 则检查域名是否包含给定字符串。三者匹配范围依次不同,不能用“都包含 example”来理解。尤其是 DOMAIN-SUFFIX 会考虑域名边界,而 DOMAIN-KEYWORD 不是后缀边界匹配。

规则条件会匹配不会匹配
DOMAIN,example.comexample.comwww.example.com
DOMAIN-SUFFIX,example.comexample.com、api.example.comnotexample.com、example.com.other.test
DOMAIN-KEYWORD,exampleexample.com、myexample.testsample.test

只指定网站的一个主机时使用 DOMAIN;希望覆盖主域名与多级子域名时使用 DOMAIN-SUFFIX。DOMAIN-KEYWORD 适合确实需要字符串覆盖的情况,但也可能包含无关域名,因此不宜仅为少写几行就替换后缀规则。DOMAIN-SUFFIX 的条件不需要写成 *.example.com,直接写 example.com。

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

在这一示例中,api.example.com 先命中 DOMAIN,所以走 DIRECT;www.example.com 命中第二行,所以走 PROXY。如果交换前两行,后缀规则会先接住 api.example.com,精确规则便不能作为例外生效。网页还可能加载独立的图片、登录或接口域名,需要分别检查这些请求,不能只用地址栏中的主域名代表整页流量。

4. GEOIP 与 IP-CIDR:根据目标 IP 匹配

GEOIP 根据目标 IP 在应用使用的地理信息数据库中的归属匹配,例如 GEOIP,CN,DIRECT。这里的 CN 是国家代码,不表示域名后缀或内容所属地区。数据库的归属结果也不是物理位置的实时证明,不能仅凭页面显示中文就预期它会命中 CN。

IP-CIDR 判断目标 IPv4 地址是否落在指定网段。192.168.0.0/16 表示从 192.168.0.0 到 192.168.255.255 的范围;/32 表示单个 IPv4 地址。下列地址均用于语法说明,不是服务端地址推荐。

IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,203.0.113.7/32,PROXY,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

示例末行采用 FINAL,PROXY,与前面 FINAL,DIRECT 的目的不同:它让未匹配请求走代理。选择哪一种兜底策略取决于自己的分流目标。实际验证时,应同时记录请求域名、目标地址和最终策略,避免将 DNS 返回了另一个地址的现象归因于 CIDR 写法。

5. FINAL 兜底与配置验证步骤

FINAL 匹配到达它的其余请求,应放在规则末尾。它不是“默认规则优先级最低”的自动设置,而是顺序中的一行:若放在前面,后面的规则就没有机会接住请求。只让指定域名走代理时,可以采用域名规则加 FINAL,DIRECT;其余请求也要走代理时,则使用 FINAL,PROXY。

  1. 保存原配置

    进入 Config,先确认当前启用的文件,保留修改前的副本。记录原有的 [Rule] 顺序,避免只保留测试规则而丢失已有例外。

  2. 写入测试规则

    打开这份配置的编辑入口,在 [Rule] 中添加需要的规则。把 DOMAIN 例外放在 DOMAIN-SUFFIX 之前,最后保留一条符合目标的 FINAL,并保存。

  3. 核对路由

    回到 Home → Global Routing → Config,并在 Config 核对选中的文件。确认 Home 中代理策略使用的是自己已有且可连接的服务端。

  4. 发起新请求

    重新建立连接后访问测试目标,避免沿用修改前建立的长连接。在应用的请求记录中核对目标与实际策略;已缓存的网页不能证明新规则生效。

  5. 核对兜底

    再访问一个不在域名列表中的目标,检查是否进入 FINAL 指定的策略。如果结果不同,依次查看前置规则、目标 IP 和当前配置,不要立即增加更宽的关键字规则。

对第三节的三行示例,预期是 api.example.com 使用 DIRECT、www.example.com 使用 PROXY、其他未匹配目标使用 DIRECT。这些是规则推导结果,不是对示例域名进行联网实测的报告。换成自己要配置的真实域名后,再用请求记录验证;单独一次延迟测试只检查连接能力,不能证明某个网页命中了哪条规则。

6. 规则未生效与连接报错的区分

先分清两类问题:请求采用了错误策略,属于路由姿态、配置选择、规则条件或顺序的检查范围;请求已经采用预期策略却连接失败,则应检查目标服务与已有服务端的连接参数。规则只决定如何处理请求,不会修复服务端端口错误或不可达的问题。

报错:Connection refused

原因与解法:这是底层连接可能返回的拒绝错误,通常与目标端口未监听或明确拒绝连接有关。先核对请求实际使用的策略;若为 PROXY,再对照自己的服务商资料检查服务器地址与 Port,例如资料明确写 443 时应填写 443,而不是凭常见端口猜测。

报错:Operation timed out

原因与解法:这是底层操作可能返回的超时错误,表示操作未在等待时间内完成,不等于规则语法错误。先在 Home 测试已有连接,再查看请求目标与策略,分别检查当前网络、目标可达性以及服务端是否可用;应用记录的完整措辞可能随错误来源不同而变化。

写了 DOMAIN-SUFFIX,为什么还是直连?

先到 Home → Global Routing 选择 Config,再确认 Config 中启用的是刚保存的文件。然后从 [Rule] 顶部检查是否存在先命中的 DIRECT 或 FINAL;条件只保留域名,不带协议、路径和端口。

想让一个子域名直连,怎样不影响其他子域名?

把 DOMAIN,api.example.com,DIRECT 放在 DOMAIN-SUFFIX,example.com,PROXY 前面。保存后发起新请求,分别核对 api.example.com 与另一个子域名的策略,不要只测试其中一个。

网页能打开,为什么部分图片仍加载失败?

查看失败请求的真实域名,而不只看页面地址。图片可能来自独立域名,也可能已经命中 PROXY 但连接失败。确认请求记录后再决定是否添加 DOMAIN 或 DOMAIN-SUFFIX,避免用过宽的 DOMAIN-KEYWORD 覆盖无关目标。

更新订阅后,自己写的规则会一起改变吗?

先区分 Home 中连接资料的订阅与 Config 中规则文件的更新。更新已有连接订阅不等于编辑当前 [Rule];如果当前配置文件本身来自远程更新,更新后应再次核对文件内容,并把自定义修改保留在可控的副本中。

排查时一次只修改一个条件,并保留修改前后的规则行与请求结果。按“当前配置、Global Routing、命中顺序、域名或 IP、连接参数”的次序检查,可以把分流判断与网络连接问题分开。需要配置入口的完整说明时,可继续阅读站内使用教程;协议参数的核对位置见协议参考。

下载 Shadowrocket