Shadowrocket 自定义规则写法:从上到下匹配、FINAL 兜底与 PROXY/DIRECT/REJECT 策略

用真实规则片段讲清 Shadowrocket 自上而下逐条匹配的机制,说明规则顺序为什么决定结果、FINAL 为什么必须放在最后,以及三种策略各自的用途。

本文速览

Shadowrocket(小火箭)的自定义规则按顺序检查,先命中的规则决定策略;具体例外放在宽泛规则前,FINAL 放在 [Rule] 段末尾。本文适用于 iPhone、iPad、Mac、Windows、安卓与 Linux 用户理解规则文件,界面操作以设备实际显示为准。读完可建立一份最小规则、区分 PROXY / DIRECT / REJECT,并按“当前配置、运行姿态、命中顺序、出站连接”定位问题。

1. 先确认 Config 姿态,再判断规则是否生效

连接开关已打开,不等于自定义规则正在参与分流。以 iPhone / iPad 的界面为例,先在 Config 确认已选择准备编辑的配置,再回到 Home 查看 Global Routing。排查本文规则时应使用 Config,而不是先用 Proxy 或 Direct 测试后,就据此认定规则有误。

本文以用户已经拥有可用的服务配置为前提。规则只决定请求采用哪种处理方式,不能生成连接凭据,也不能修复服务端不可达。本站不提供、不销售、不推荐节点或订阅。修改前请先保留现有配置副本,避免一次替换全部设置后失去对照。

Global Routing排查时的含义适合验证什么
Config按当前配置中的规则决定策略规则顺序、例外与 FINAL
Proxy主要使用代理出站,而非本文逐条规则的测试姿态选中的代理连接是否可用
Direct主要使用直接连接当前网络的直连可达性
Scene按已设置的场景逻辑工作场景选择与切换,不作为本文基准
新连接请求 当前配置 顺序匹配 命中策略 出站连接

Settings → On Demand 管理按需连接条件,并不改变 [Rule] 的先后关系。若网络切换后连接状态变化,应先核对 On Demand,再检查规则;不要把“隧道没有连接”和“规则匹配错误”当成同一问题。

2. 规则语法:类型、匹配值、策略各占一项

多数规则采用“规则类型,匹配值,策略”的逗号分隔形式,关键字和分隔符使用英文字符。FINAL 没有匹配值,写成 FINAL,PROXY 即可。下面是 [Rule] 段的教学示例,不是包含服务器、DNS 与其他设置的完整配置;请将它放进已有可用配置中核对,不要把它当成可独立连接的文件。

[Rule]
DOMAIN,blocked.example.com,REJECT
DOMAIN,local.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
5 类
本例使用 DOMAIN、DOMAIN-SUFFIX、IP-CIDR、GEOIP、FINAL
3 种
本例策略为 PROXY、DIRECT、REJECT
1 条
FINAL 放在 [Rule] 末尾承担兜底

example.com 及其子域名用于说明匹配关系;192.0.2.0/24 是文档示例网段,不是可用服务地址。上面的规则说明语法与顺序,不能证明这些地址存在实际服务。验证时应使用自己有权访问的目标,并按真实用途决定是否需要直连或拒绝。

3. 从上到下匹配:具体例外先于宽泛范围

规则不是把全部匹配项收集后,再自动挑选“最精确”的一条。对同一请求,前面的规则先获得判断机会;一旦命中并确定策略,就不继续用后面的常规规则覆盖结果。因此,精确域名即便比域名后缀更具体,放在后面也不会自然获得更高优先级。

例外在前:符合目标

第一行
DOMAIN,local.example.com,DIRECT
第二行
DOMAIN-SUFFIX,example.com,PROXY
末行
FINAL,PROXY

local.example.com 先命中 DIRECT,其他匹配后缀的请求使用 PROXY。

范围在前:例外被遮住

第一行
DOMAIN-SUFFIX,example.com,PROXY
第二行
DOMAIN,local.example.com,DIRECT
末行
FINAL,PROXY

local.example.com 已命中第一行,后面的 DIRECT 不会改写这次决定。

结论:先放例外,再放范围,最后放兜底

新增一条“没有效果”的规则时,先向上查找能覆盖同一目标的旧规则。将必要的精确例外移到它前面,再建立新连接复测,比反复切换策略更容易定位原因。

  1. 写出目标意图:例如仅让 local.example.com 直连,其余 example.com 子域名使用代理。
  2. 先放精确的 DOMAIN 例外,再放 DOMAIN-SUFFIX 范围;存在拒绝例外时,也按预期优先级摆放。
  3. 检查是否还有更靠前的规则已经覆盖目标,包括已有配置内引入的其他规则。
  4. 保存并确认选中的仍是该配置;用新连接验证,不以旧页面中的存量连接作结论。

4. FINAL 为什么必须在最后,兜底该选什么

FINAL 没有额外匹配条件。若把 FINAL,PROXY 放到 [Rule] 开头,前面没有规则筛选,后续的域名或 IP 规则就失去了处理这些请求的机会。同理,放在中间会遮住它后面的规则。维护时保留一条清晰的 FINAL,并将它放在 [Rule] 段末尾,而不是整个配置文件任意位置。

[Rule]
DOMAIN,local.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY

这个示例表达的是:先处理明确的域名要求,再让 GEOIP 判断其余目的 IP,最后把仍未命中的请求交给 PROXY。FINAL 不是连接失败后的备用线路,也不是“上一条代理失败就走直连”的容错开关。规则已经选择 PROXY 后,连接失败不会仅因为末尾存在 FINAL,DIRECT 就自动重试直连。

兜底写法未命中请求的处理修改前应确认
FINAL,PROXY交给代理策略代理出口可用,并符合未知目标的预期路径
FINAL,DIRECT直接连接目的地址未列出的目标允许使用当前网络直连
FINAL,REJECT拒绝其余请求允许访问的范围已列全,否则正常业务也可能被拒绝

不要为了让网页暂时打开就频繁改动兜底。先确定希望未列明的目标走哪条路径,再补充必要例外。把 FINAL 当作清晰的默认策略,有助于在规则增多后仍然解释每一次分流结果。

5. PROXY、DIRECT、REJECT 不是三种连接协议

这三个关键字描述处理策略,而不是协议名称。Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuard 属于连接配置所涉及的协议概念;写成 PROXY 并不会把当前连接自动改成某一种协议。若当前配置使用自定义策略组,还要检查该组名称及实际选中的出站,不能把未定义的组名当成可用策略。

策略作用常见误解
PROXY将匹配请求交给代理出站;需核对当前选中的连接或相关策略设置不是自动选择最快线路,也不保证服务端可达
DIRECT使用当前网络直接连接目的地址不是停止全部 VPN,也不代表其他请求都直连
REJECT拒绝匹配到的请求不是修复连接,也不是降低优先级后等待重试

例如,DOMAIN,blocked.example.com,REJECT 会拒绝该精确域名,不会连带拒绝所有 example.com 子域名。若要拒绝整个域名范围,语义应改为 DOMAIN-SUFFIX,example.com,REJECT;这也会扩大影响面,必须检查是否误伤登录、接口或资源域名。

6. IP-CIDR、GEOIP 与 DNS:别把域名请求直接当成 IP 请求

域名规则通常可依据请求中的域名判断;IP-CIDR 与 GEOIP 则需要目的 IP 信息。一个域名可能对应多个地址,地址也可能随网络、解析结果或服务部署变化。把一次看到的 IP 写死成直连规则,未必能覆盖下一次访问,更不能据此断言整个域名都会采用同一策略。

no-resolve 用于避免仅为该 IP 规则的匹配而主动触发域名解析。它不是“禁用 DNS”,也不代表所有域名请求都能按这条 IP 规则判断;如果没有可用于判断的目的 IP,就不能依靠它强行得出网段匹配结果。

HTTPS 常见目的端口为 443,但本文的 DOMAIN-SUFFIX 规则没有端口条件。它按域名匹配,不是只匹配 443。遇到某个接口仍然失败时,应分别检查目标域名、实际地址、目的端口和连接错误,不要把应用服务端拒绝误判成规则没有命中。

7. 保存后如何验证:一次只改一个变量

验证应区分“匹配是否正确”和“所选出站能否完成连接”。前者看请求被分到哪个策略,后者看连接是否成功。规则命中 PROXY 但代理连接失败,仍可能说明规则顺序正确;反过来,页面能打开也不能证明一定走了预期策略。

  1. 保留基线:复制当前可用配置,记录修改前的 Global Routing、选中连接和要验证的域名。
  2. 只改一项:先添加一条精确 DOMAIN 规则,或只调整两行顺序,不同时改 DNS、连接协议和 FINAL。
  3. 确认选中:回到 Config 核对正在使用的配置,再在 Home 确认 Global Routing 为 Config、连接状态正常。
  4. 建立新连接:关闭旧页面后重新发起请求,必要时结束应用中的存量连接。已有连接可能继续使用建立时的路径。
  5. 核对记录:在设备可用的连接记录或日志中检查目标、命中规则及策略;记录不显示全部字段时,结合临时精确规则做对照,不猜测结果。
  6. 恢复与归档:若改动导致异常,先恢复副本;确认有效后再合并到日常配置,并记下规则用途。

加了 DIRECT,为什么这个域名还是走 PROXY?

先检查 Global Routing 是否为 Config,再确认编辑的配置就是当前配置。从该 DOMAIN 行向上查找覆盖它的 DOMAIN-SUFFIX 或其他规则,把必要例外放到范围规则前,保存后用新连接复测。

FINAL 写了 DIRECT,代理失败后怎么没有直连?

FINAL 只处理未命中前序规则的请求,不处理已经命中 PROXY 后发生的连接错误。先看该请求命中的具体规则,再排查当前代理出站;若业务本就要求直连,应添加范围准确的 DIRECT 规则,而不是依赖失败回退。

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

先区分 Home 中的连接订阅更新与 Config 中的远程配置更新。前者主要更新连接资料,后者可能重新载入规则内容。编辑前保存本地副本;需要持续更新远程配置时,先核对更新范围,不要只在远程内容上作一次性修改。

开了 On Demand,为什么规则还是没有效果?

在 Settings → On Demand 核对自动连接条件,再返回 Home 检查实际连接状态与 Global Routing。On Demand 负责何时连接,不负责把运行姿态自动解释为 Config,也不会调整规则顺序。

日常维护可遵循同一顺序:具体例外在前、范围规则居中、FINAL 在末尾。遇到问题先看当前配置与命中记录,再查出站可达性;不要通过堆叠重复规则来掩盖一个尚未定位的连接故障。

下载 Shadowrocket