Shadowrocket 自定义规则写法:从上到下的匹配顺序与 FINAL 兜底

规则按从上到下的顺序逐条匹配,命中即停。本文说明 PROXY、DIRECT、REJECT 三种策略的含义,以及 FINAL 为什么必须放在最后。

本文速览

本文适合已有服务商与可用连接、准备编辑 Shadowrocket(小火箭)配置的用户。先确认 Global Routing 使用 Config,再按“具体例外在前、宽泛范围在后、FINAL 最后”的方式整理规则;通过一份最小配置、冲突示例和验证步骤,区分“规则没有命中”与“命中后连接失败”。

一、先确认 Config:规则列表何时参与分流

自定义规则不是连接开关,也不负责提供连接所需的服务器信息。开始前,应已从你的服务商处获取订阅或连接参数,并确认所选连接本身可用。本文以 iPhone / iPad 的 Home、Config、Settings 页面名称说明操作;其他平台应在对应的路由与配置入口核对相同设置。

在 Home 检查 Global Routing。使用 Config 时,当前生效配置中的规则才是排查分流的主要依据。Proxy 与 Direct 是全局路由姿态,不能与某一行规则末尾的 PROXY、DIRECT 策略混为一谈;Scene 则需结合当前场景的设置判断,不能直接当作 Config 的同义词。

请求进入隧道 读取目标信息 自上而下匹配 执行命中策略 建立或拒绝连接

这条流程描述的是参与配置分流的请求,不表示每个系统请求都必然按完全相同的路径处理。验证时应从一个明确的目标域名和一条新连接开始,不要仅凭状态栏出现 VPN 标记就认定规则已经生效。

二、规则语法:匹配条件与执行策略分开读

常见规则由“类型、匹配值、策略”构成,字段之间使用英文逗号。类型说明检查什么,匹配值限定范围,策略决定命中后的动作。FINAL 不需要匹配值,所以通常只有两个字段。不要使用中文逗号,也不要把解释文字直接接到策略名称后面。

3 个字段
常见条件规则:类型、匹配值、策略
2 个字段
兜底规则:FINAL、策略
3 种策略
本文使用 PROXY、DIRECT、REJECT
规则类型示例检查范围
DOMAINDOMAIN,login.example.com,PROXY精确匹配 login.example.com,不自动包含其子域名。
DOMAIN-SUFFIXDOMAIN-SUFFIX,example.com,DIRECT匹配 example.com 本身及其子域名,如 www.example.com。
IP-CIDRIP-CIDR,192.168.50.0/24,DIRECT检查目标 IPv4 地址是否落入指定网段;/24 不是端口号。
GEOIPGEOIP,CN,DIRECT按目标 IP 在本地 GeoIP 数据中的地区分类判断。
FINALFINAL,PROXY处理前面的规则均未命中的请求。

域名规则中的匹配值不带 https://、路径、查询参数或端口。例如目标网址是 https://login.example.com:443/account,DOMAIN 的值仍写 login.example.com。IP-CIDR 则使用地址与掩码长度,不写网址。GEOIP 判断的是 IP 分类,不是网页语言、域名后缀或服务运营方所在地。

三、PROXY、DIRECT、REJECT 分别改变什么

策略位于规则末尾。命中只说明选定了处理动作,不保证目标一定可达:PROXY 仍依赖所选连接与远端网络,DIRECT 仍依赖本地网络,REJECT 则有意阻止连接。下面两张配置卡用于拆解规则,不是需要同时导入的完整配置。

按域名设置例外

DOMAIN
login.example.com,PROXY
DOMAIN-SUFFIX
ads.example.com,REJECT
DOMAIN-SUFFIX
example.com,DIRECT

精确例外和屏蔽子域放在整个域名范围之前,避免被较宽的条件提前覆盖。

按地址设置范围

IP-CIDR
192.168.50.0/24,DIRECT
GEOIP
CN,DIRECT
FINAL
PROXY

只有确实需要直连该地址范围时才保留对应规则,FINAL 承接其余请求。

同一个域名既承担登录又承担其他内容时,宽泛使用 REJECT 可能连登录也一起阻断。应先找到实际需要处理的目标,再缩小匹配范围。不要把“页面少了一块内容”直接视为规则正确,也不要把所有失败都归因于代理连接。

四、匹配顺序:更精确的规则不会自动获得优先权

规则列表从第一行向下检查,先命中的规则决定本次请求的策略,后续规则不再参与本次选择。DOMAIN 比 DOMAIN-SUFFIX 更精确,但这种精确程度不会自动抵消行序;同样,REJECT 也没有跨越前面 DIRECT 规则的特殊优先级。

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

在这份顺序中,访问 login.example.com 会先命中第一行,因为它属于 example.com 的子域。第二行虽然更具体,但已经没有执行机会。若希望登录域名走 PROXY、其他子域走 DIRECT,应交换前两行:

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

结论:把例外写在它所属的大范围之前

新增规则后,先检查它上方是否已有覆盖同一目标的条件。若有,应调整位置或缩小上方规则范围,而不是反复追加同一条规则。

“具体在前”是整理规则的实用方法,真正生效的原则仍是先命中者优先。例如某个特定 IP 必须使用 PROXY,就应放在可能覆盖它的 GEOIP 直连规则之前。不要假设域名规则一定优先于地址规则,或某一类策略天然比其他策略更强。

五、FINAL 为什么必须放在最后

FINAL 不再检查一个具体域名或地址,而是接住前面没有匹配到的请求。将它放到列表中间,就相当于在该位置结束其余规则的判断;即使下面仍写着语法正确的 DOMAIN、IP-CIDR 或 GEOIP,也无法处理已经被 FINAL 接住的请求。

[Rule]
DOMAIN,login.example.com,PROXY
DOMAIN-SUFFIX,ads.example.com,REJECT
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,192.168.50.0/24,DIRECT
GEOIP,CN,DIRECT
FINAL,PROXY

这是一份用于理解顺序的最小示例,不是适用于所有网络的默认方案。example.com 及其子域只作演示;局域网段也必须替换为实际需要访问的范围。若已有配置包含 [Rule],应在现有段内整理规则,而不是再次粘贴一个同名段。

  1. login.example.com 在第一行命中 PROXY,不会继续进入后面的域名后缀规则。
  2. ads.example.com 在第二行命中 REJECT;其子域也属于该后缀范围。
  3. www.example.com 命中第三行 DIRECT,前提是请求具有可供匹配的目标域名信息。
  4. 目标地址 192.168.50.10 属于示例 /24 网段,在前面未命中时由第四行处理。
  5. 其余请求继续检查 GEOIP,仍未命中才使用 FINAL 指定的 PROXY。

FINAL 的策略需要主动选择。FINAL,PROXY 表示未分类请求交给代理;FINAL,DIRECT 表示未分类请求直连。它们没有脱离网络需求的统一正确答案。实际维护时保留一个明确的 FINAL,并让它成为最后一条有效规则。

IP 类规则可能涉及域名解析,匹配结果也会受到实际目标 IP、DNS 结果及 GeoIP 数据的影响。直接使用 IP 地址发起的连接可能没有可用于 DOMAIN 匹配的域名。因此,域名访问与直接访问其 IP 不应被当作完全等价的测试。

六、保存与验证:先排除未生效,再检查连接失败

编辑前保存一份当前可用配置的副本。验证时一次只改一个目标或一个顺序,保留修改前后的结果,避免同时调整 DNS、路由姿态和规则列表,导致无法判断是哪项变化产生影响。

  1. 确认正在编辑的文件:进入 Config,核对当前使用的配置,再打开其编辑入口。远程配置与本地副本应分开辨认。
  2. 检查规则段:在 [Rule] 内修改,保留英文逗号;核对策略名称拼写,并将 FINAL 移到末尾。
  3. 保存并应用:完成编辑后保存,确认该配置仍是当前使用项;回到 Home 检查 Global Routing 为 Config。
  4. 建立新连接:保存后重新连接,再重新打开测试页面或应用,避免把既有长连接的行为当成新规则的结果。
  5. 核对记录:在请求或连接记录中找到测试目标,查看可用的命中规则、策略与目标地址信息。先确认是否命中预期规则,再检查连接错误。
  6. 缩小问题范围:若命中 PROXY 后仍超时,检查所选连接与服务商状态;若命中 REJECT 后失败,则属于该策略的预期行为。

更新订阅与更新配置文件也要分清。连接订阅通常用于刷新服务商提供的连接信息,不等于已经改写当前 [Rule];远程配置更新则可能替换文件内容。需要长期保留的自定义规则,应明确放在哪份可维护的配置中,并在更新后再次核对。

不要用单次“能打开”证明分流正确。同一个页面可能连接主域名、图片域名和接口域名,分别命中不同规则。应逐个核对相关请求;排查时也不要公开带有认证信息的订阅链接或完整配置。

七、规则不生效时的常见问题

为什么加了 REJECT,目标还是能打开?

先检查它上方是否已有 DIRECT、PROXY 或 FINAL 覆盖同一目标,再确认 Global Routing 为 Config、编辑文件就是当前生效文件。随后重新建立连接,核对实际请求的域名;页面使用的接口域名可能与地址栏中的域名不同。

FINAL 后面还能继续写规则吗?

文件中可以出现后续文本,但 FINAL 已经接住此前未匹配的请求,后面的普通规则不会再有机会处理这些请求。把需要使用的规则移到 FINAL 上方,并清理多余的 FINAL,避免维护时误判。

开了 On Demand,为什么还是没有按域名分流?

Settings → On Demand 处理自动连接条件,不负责替换 Global Routing 的选择。回到 Home 检查 Config 姿态,再到 Config 核对所用文件;不要用自动连接开关代替路由设置。

订阅更新成功,为什么刚加的规则看起来没变?

先辨认更新的是连接订阅还是远程配置。前者不能作为规则已更新的证据;后者可能覆盖本地修改。打开当前配置检查实际的 [Rule] 内容,再用一个明确目标建立新连接验证。

同一个域名昨天直连,今天却命中其他规则?

先对比命中记录、实际目标 IP 和当前配置。DNS 返回地址变化可能改变 IP-CIDR 或 GEOIP 的判断,远程配置更新也可能改变行序。需要稳定按域名处理时,可把相应 DOMAIN 或 DOMAIN-SUFFIX 规则放在相关地址规则之前。

获取 Shadowrocket 与继续配置

iPhone / iPad 版在 App Store $2.99 一次性买断;Mac(Apple 芯片 / Intel)、Windows、安卓、Linux 版免费。iPhone / iPad 系统要求以 App Store 页面标注为准。进入下载页选择对应平台,再按教程导入已有配置与订阅。

客户端买断 ≠ 线路套餐。连接所需的订阅从你的服务商处获取;本站提供客户端获取与配置说明,不提供、不销售、不推荐节点或订阅。

Shadowrocket 全平台下载