Shadowrocket 自定义规则优先级:从上到下匹配、FINAL 兜底与 PROXY/DIRECT/REJECT

讲解自定义规则自上而下逐条匹配的机制,以及 FINAL 兜底的位置和 PROXY、DIRECT、REJECT 三种策略的含义,附调整规则顺序的示例。

本文速览

本文适用于已经在 Shadowrocket(小火箭)中配置连接、需要调整分流行为的用户。先确认 Global Routing 使用 Config,再理解规则首次命中即采用对应策略的顺序关系;随后用具体域名例外、IP 网段和 FINAL 组合出可检查的规则列表。本文只使用说明性地址,不提供连接服务;订阅链接请从你的服务商处获取。

1. 自定义规则优先级:先匹配到的规则生效

在按配置分流时,[Rule] 中的规则从上到下检查。某条规则满足条件后,请求采用该条规则指定的策略,不会继续向下寻找“更精确”或“更靠后”的规则。因此,规则优先级主要由位置决定,而不是由域名长短或规则类型自动排序。

请求进入隧道 读取当前配置 顺序检查规则 采用命中策略 建立出站连接

例如,DOMAIN-SUFFIX,example.com,PROXY 可以匹配 example.com 及其子域名。如果希望其中的 files.example.com 例外直连,就应把 DOMAIN,files.example.com,DIRECT 放在这条后缀规则之前。反过来放时,后缀规则已经覆盖这个子域名,下面的例外就没有机会参与该请求的决策。

2. Global Routing 与 PROXY、DIRECT、REJECT 的区别

先在 Home → Global Routing 核对当前姿态。Config 才是本篇验证当前配置规则的基准;Proxy 与 Direct 是全局路由选择,不能用来证明某条自定义规则是否命中。若使用 Scene,还需要核对场景实际采用的设置,不能仅凭配置编辑器里的规则推断当前结果。

3 种
本文使用的规则策略:PROXY / DIRECT / REJECT
4 项
Global Routing:Proxy / Direct / Config / Scene
1 条
本文规则示例末尾只保留一条 FINAL
规则策略匹配后的处理检查重点
PROXY通过代理出站处理该请求。核对当前代理选择;若配置使用策略组,则继续检查组内实际选中的出站。
DIRECT通过当前网络直接连接目标。直连仍依赖本地网络、目标可达性及 DNS 结果,不等于保证连接成功。
REJECT拒绝匹配到的请求。目标相关功能可能无法加载,先确定匹配范围再扩大拦截。

判断顺序:先核对姿态,再检查规则

规则改动后没有效果时,先回到 Home 确认 Global Routing 为 Config,再到 Config 确认选中的文件就是刚编辑的文件;不要先通过反复更换代理来判断规则顺序。

PROXY 是规则里的策略标识,Proxy 是 Global Routing 中的界面选项,两者处于不同层级。规则决定哪些请求应使用某个出站,Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuard 等协议则决定对应连接如何建立;调整规则顺序并不会修正协议参数中的端口、密钥或认证错误。

3. DOMAIN-SUFFIX、GEOIP、IP-CIDR 与 FINAL 的写法

常见规则写成“规则类型、匹配内容、策略”。FINAL 不需要匹配内容,因此只有规则关键字和策略两部分。下面的表格用于理解语法;其中 example.com 和 192.0.2.0/24 均为文档示例,不应当作实际服务地址。

规则示例匹配含义顺序注意点
DOMAIN,files.example.com,DIRECT匹配这个完整域名。放在会覆盖它的 DOMAIN-SUFFIX 前面。
DOMAIN-SUFFIX,example.com,PROXY匹配该域名及其子域名,不是任意字符串包含匹配。可以承接前面单域名例外之后的其余子域名。
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve匹配示例 IPv4 网段;no-resolve 避免为了这一条 IP 规则主动进行域名解析。它不是关闭整个配置的 DNS,也不改变此前已知目标 IP 的匹配条件。
GEOIP,CN,DIRECT按目标 IP 的地区数据库归类进行匹配。不按域名后缀判断;结果取决于目标 IP 和数据库。
FINAL,PROXY把前面未匹配的请求交给 PROXY。放在规则列表末尾。

域名规则能否参与匹配,也与该连接是否具有可用的目标域名信息有关。直接请求 IP 地址时,不应期待它自动命中某条 DOMAIN-SUFFIX。同样,一个网页可能同时请求主站、图片、认证接口和内容分发域名;主站命中直连,不代表页面里的每个连接都会采用相同策略。

4. 规则顺序调整示例:子域名例外与 FINAL 兜底

假设需求是:files.example.com 直连,ads.example.com 拒绝,其余 example.com 域名走代理。下面两张配置卡使用相同规则内容,只改变位置。它们说明为什么“例外已经写了”并不等于“例外一定会生效”。

调整前:大范围规则在前

第 1 条
DOMAIN-SUFFIX,example.com,PROXY
第 2 条
DOMAIN,files.example.com,DIRECT
第 3 条
DOMAIN,ads.example.com,REJECT
第 4 条
FINAL,PROXY

两个特定子域名都会先命中第 1 条,后面的例外无法达到预期。

调整后:明确例外在前

第 1 条
DOMAIN,files.example.com,DIRECT
第 2 条
DOMAIN,ads.example.com,REJECT
第 3 条
DOMAIN-SUFFIX,example.com,PROXY
第 4 条
FINAL,PROXY

先处理单域名例外,再处理整个域名范围,最后处理剩余请求。

若还需要按网段和地区分流,可将规则组织成下面的结构。这里的 GEOIP,CN,DIRECT 只是说明地区规则如何放置,并不意味着所有用户都应使用这个选择。实际策略应与当前网络和访问需求一致。

[Rule]
DOMAIN,files.example.com,DIRECT
DOMAIN,ads.example.com,REJECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

该示例中,example.com 范围内的域名先由域名规则处理,不会因为其解析地址被 GEOIP 归入 CN 就改走 DIRECT。对于没有命中上述域名规则的其他请求,后面的 IP 规则才有机会参与决策。这正是规则列表位置比“规则看起来更具体”更重要的原因。

调整原则:先写业务例外,再写分类规则

把必须直连或必须拒绝的具体目标移到会覆盖它们的规则之前,每次只移动一组相关规则,并保留末尾的 FINAL;这样更容易解释每一次行为变化。

5. 从 Config 编辑到新连接验证的操作顺序

验证规则要区分“编辑完成”“当前配置已选中”和“新请求已采用新设置”这三个环节。浏览器或应用可能复用已有连接,单纯刷新页面不一定产生新的出站连接。测试时还要区分规则决策正确但连接失败,与请求根本没有命中目标规则这两种情况。

  1. 保留原配置。在 Config 中编辑前保存一份可恢复的副本,记录当前选中的文件。不要直接用整段示例替换已有配置的其他部分。
  2. 检查 [Rule]。找到需要调整的规则,检查是否存在更靠前的相同域名、上级后缀、网段规则或提前出现的 FINAL。只保留一个明确的末尾兜底。
  3. 保存并选择文件。完成编辑后确认保存,再在 Config 中确认实际选中的是这份配置,而不是名称相近的另一个文件。
  4. 核对路由姿态。回到 Home → Global Routing → Config。测试期间保持当前代理选择不变,避免同时改变出站与规则造成混淆。
  5. 重新建立连接。在不会中断重要任务的情况下,断开后重新开启连接,并重新发起目标请求。必要时关闭目标应用后再打开,减少旧连接复用的影响。
  6. 查看新请求记录。在连接记录或日志中核对目标域名、目标 IP 和采用的策略;若记录提供命中规则信息,一并检查。不要仅凭网页是否打开判断规则成功与否。

文中的示例域名没有提供实际的测试服务。进行验证时,应换成自己有权访问且能确认请求目标的地址,并记录测试条件。例如,出现“页面文字能显示、图片一直加载”的现象时,应检查图片实际请求的域名,而不是立即把整个主站改成另一种策略。

6. FINAL 与自定义规则常见问题

FINAL 写在第一行,下面的规则为什么没有效果?

FINAL 会接住所有到达它的未匹配请求。先把它移到 [Rule] 末尾,再检查前面的具体规则。不要在 FINAL 后面继续添加期望生效的域名例外;也不要用第二条 FINAL 试图覆盖第一条。

已经写了 DIRECT,为什么网站还是打不开?

先核对新请求记录是否实际采用 DIRECT;若是,则规则已经完成直连决策,接着检查当前网络能否访问目标、DNS 是否返回合理地址以及目标服务是否响应。DIRECT 只指定路径,不修复网络或服务端故障。

改成 FINAL,DIRECT,会不会影响所有已有规则?

不会改变此前已经命中的规则,但会改变所有剩余请求的默认出站。修改前先确认哪些请求依赖当前兜底。如果只是想让一个域名直连,应新增靠前的 DOMAIN 或 DOMAIN-SUFFIX 例外,而不是扩大整个兜底的影响范围。

订阅更新后,自定义规则会被覆盖吗?

先区分 Home 中更新的连接订阅,与 Config 中更新的远程配置。两者不是同一个对象;远程配置更新可能替换对应配置内容。更新前保留副本,更新后核对当前选中文件及 [Rule],不要把本地修改一定会保留当作前提。订阅链接请从你的服务商处获取。

REJECT 后页面有些按钮不能用,应该怎么查?

先查看点击按钮时新增的请求,确认是否有认证、接口或资源域名被拒绝。临时停用那条可疑规则后重新测试;确认依赖关系后,缩小 REJECT 范围或在其前面添加明确例外,避免直接放行所有请求。

App Store 正版下载核对开发者与应用 ID