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

以 DOMAIN-SUFFIX、IP-CIDR、GEOIP 为例,说明规则逐条匹配的顺序、FINAL 为什么必须放在最后,以及三种策略各自的适用场景。

本文速览

自定义规则用于决定请求采用哪一种连接策略,适合已经在 Shadowrocket 中配置好自己的服务、需要调整分流结果的用户。本文先确认 Global Routing 的工作姿态,再说明规则语法、例外顺序和 FINAL 的位置,最后给出保存与验证步骤;默认策略以当前 Config 为准,不把任何一份示例当作所有网络环境的通用配置。

Global Routing:先确认规则是否参与处理

Global Routing 是 Home 中控制整体路由方式的设置,不等同于某一条规则的策略。Shadowrocket(小火箭)的自定义规则主要在 Config 姿态下参与分流;编辑前应进入 Home → Global Routing,确认当前选项,再到 Config 核对正在使用的配置文件。默认选项以当前应用显示为准,本文的规则验证统一使用 Config。

Config

推荐

按当前配置中的规则决定请求去向。选中 Config 并不代表所有请求都使用 PROXY,最终结果仍由实际命中的规则决定。

适合:编写自定义规则、验证域名例外与最终策略。

Proxy

将整体路由设为代理姿态,不按本文的常规规则列表逐条分流。可以临时用于比较同一目标经代理访问的结果,但测试后应恢复原设置。

适合:隔离规则影响,检查已有代理连接是否可用。

Direct

将整体路由设为直连姿态。此时更改常规分流规则不能作为判断规则是否正确生效的依据。

适合:检查当前网络对目标的直接访问能力。

Scene

按已配置的场景管理路由选择。排查时需要同时核对场景条件与对应动作,不能只看某一份配置中的规则文字。

适合:已经明确设置场景条件、需要按环境切换的使用方式。

On Demand 是连接触发机制,而不是 DOMAIN-SUFFIX 等规则的替代品。若断开连接后又自动建立连接,应另查 Settings → On Demand 的当前条件;若连接已经建立但请求去向不符,则优先检查 Global Routing、当前 Config 和命中规则。两类问题应分开处理。

规则语法:匹配条件与处理策略分开写

规则行由规则类型、匹配值和策略构成,常见形式是 类型,匹配值,策略。FINAL 没有匹配值,只写最终策略。编辑纯文本时使用英文半角逗号,不把网址中的协议前缀、路径或查询参数写进域名匹配值。以下内容属于配置文件的 [Rule] 段,而不是 Home 中的服务器地址栏。

3 类
本文匹配条件:DOMAIN-SUFFIX / IP-CIDR / GEOIP
3 项
本文基础策略:PROXY / DIRECT / REJECT
1 条
示例只保留一条 FINAL,置于规则末尾
关键字示例写法匹配含义
DOMAIN-SUFFIXDOMAIN-SUFFIX,example.com,PROXY匹配 example.com 本身及其子域名,不匹配 notexample.com。
IP-CIDRIP-CIDR,192.168.1.0/24,DIRECT,no-resolve匹配指定 IPv4 网段;no-resolve 避免仅为这条规则主动解析域名。
GEOIPGEOIP,CN,DIRECT依据 IP 地理数据库判断地址归属,不依据网页语言或域名后缀判断。
FINALFINAL,PROXY接住前面均未匹配的请求,采用指定策略。

IP-CIDR 的 /24 是网络前缀长度,上例覆盖 192.168.1.0 至 192.168.1.255。如果只针对一个 IPv4 地址,可使用 /32。这些数值不是服务器端口;域名规则同样不应写成 example.com:443。按端口区分请求属于另一类匹配需求,不能靠修改 DOMAIN-SUFFIX 的匹配值实现。

匹配顺序:先写具体例外,再写宽泛条件

规则顺序是逐条判断的优先次序,不是系统自动计算的“最精确匹配”。在通常的规则分流过程中,请求命中前面的有效规则后就使用其策略,不再靠后面的常规规则覆盖。因此,具体域名例外应放在较大的域名范围之前,网段与地区规则放在适当位置,FINAL 留在末尾。

[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.1.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

这是一份用于理解顺序的片段:api.example.com 命中第一条走 DIRECT;www.example.com 命中第二条走 PROXY;直接访问 192.168.1.20 时由网段规则处理。其他请求是否命中 GEOIP 取决于目标地址和数据库结果,只有前面均未命中才落入 FINAL。example.com 是说明用域名,不代表可用服务。

PROXY、DIRECT、REJECT:按目标选择策略

策略描述命中后的处理动作,不描述规则匹配范围。PROXY 将请求交给代理路径,DIRECT 使用当前网络直接连接,REJECT 拒绝请求。默认最终策略以当前 Config 为准;推荐先确定未分类流量的预期去向,再选择 FINAL,而不是在没有验证的情况下统一替换。

策略适用条件验证重点
PROXY该目标明确需要通过用户已有的代理服务访问。核对当前选择的服务或策略组及其连接状态;规则命中不等于远端连接成功。
DIRECT局域网设备,或已经确认当前网络可以直接访问的目标。检查本地路由、网络权限和目标服务本身;DIRECT 仍然需要正常的 DNS 与网络连接。
REJECT明确不希望建立连接、且已确认拒绝影响的目标。先用精确 DOMAIN 范围测试,避免误拒绝登录、支付或页面依赖的公共域名。

FINAL,PROXY 表示未分类请求仍走代理,适合明确希望保留这种兜底行为的配置;FINAL,DIRECT 则让未分类请求直接连接,适合已经充分列出代理目标的配置。二者不存在脱离使用目标的统一优劣。若把 FINAL 设为 REJECT,所有未列出的请求都会被拒绝,新增域名也可能立刻不可用,因此不宜作为初次编写规则的起点。

DOMAIN,blocked.example.com,REJECT
DOMAIN,printer.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

上例展示同一域名范围内的策略例外,不是可直接照搬的联网方案。PROXY 的实际出口还要结合当前选中的服务和配置中引用的策略名称核对;如果规则引用自定义策略组,必须确保名称与配置定义一致。不要把 Global Routing 中的 Proxy 姿态与规则行里的 PROXY 当成同一层设置。

保存与验证:一次只改一项

验证是将“编辑内容”“当前启用文件”和“实际请求结果”对应起来的过程。开始前在 Config 保留原文件的副本,并记录原有 Global Routing 选项。本文以前提为用户已有自己的服务商与订阅,仅调整路由规则;Home 中的 Subscribe 更新与 Config 文件的更新是不同对象,刷新服务器订阅不等于已经替换正在使用的规则。

  1. 确认姿态

    进入 Home → Global Routing → Config。记录 Home 当前选择的服务,避免规则修改与服务切换同时发生,导致结果无法比较。

  2. 定位文件

    进入 Config,确认当前选中的配置;打开该文件的编辑入口,核对 Rule 列表或纯文本中的 [Rule] 段。不同编辑视图的入口文案以当前应用显示为准。

  3. 添加例外

    在较宽泛的规则与 FINAL 前插入一条明确目标规则。若用纯文本编辑,只修改已有 [Rule] 段,不把示例重复粘贴成两个规则段。

  4. 保存应用

    保存后回到 Config,确认仍选中修改后的文件,再返回 Home。必要时断开并重新建立连接,以新的请求验证;已有长连接不适合作为修改后立即生效的判断依据。

  5. 核对记录

    重新访问目标,在应用的请求记录中核对目标域名或 IP、所用策略及可见的规则信息;Settings → Log 用于进一步查阅诊断信息,具体记录字段以当前界面为准。

合格的验证记录至少包含目标、期望策略和实际策略三项。例如,对自己的测试目标写明“精确域名规则期望 DIRECT,记录显示 DIRECT”;若结果是 PROXY,则先检查当前文件与上方宽泛规则,不要立即修改 DNS。本文示例推演不代表真实网络实测,也不提供可直接访问的测试服务。

DNS 与地址规则:避免把解析问题当作顺序问题

DNS 将域名转换成地址,而 IP-CIDR 与 GEOIP 需要可供判断的地址信息。DOMAIN-SUFFIX 优先依赖域名匹配,IP-CIDR 则按地址范围判断。请求是否携带域名、是否已经解析、配置中的解析选项与缓存状态,都会影响排查时能看到的信息,因此不能只凭网页是否打开来推断命中了哪条规则。

推荐排查顺序是先确认姿态和文件,再确认命中规则,最后检查解析地址与服务连通性。如果实际记录已经显示期望的策略,而目标仍不可用,问题就可能位于 DNS、远端服务、TLS 或当前网络路径;此时继续调整 FINAL 的位置通常不能解决连接故障。

常见问题:规则不生效与更新覆盖

规则加了,为什么还是全部走代理?

先打开 Home → Global Routing,确认不是 Proxy,而是 Config;再到 Config 核对选中的文件。若这两项正确,查看目标是否先命中了上方 DOMAIN-SUFFIX 或其他宽泛规则,把明确的例外放到其前面,再保存并发起新请求。

FINAL 后面的规则还能起作用吗?

在本文讨论的常规规则列表中,不应依赖 FINAL 后面的规则。把全部匹配条件移到 FINAL 前面,并只保留一条明确的最终策略。检查重复 FINAL 时应搜索整个规则段,而不只检查文件底部几行。

订阅更新后,自定义规则为什么不见了?

先区分更新对象:Home 的 Subscribe 通常更新服务器信息,远程 Config 更新则可能替换配置内容。进入 Config 检查当前文件是否被更新或切换;需要稳定保留本地改动时,先保存独立副本,并在每次更新后比较规则段。

网站首页能开,登录却失败,要改 FINAL 吗?

先查看登录时新出现的域名与实际策略。登录可能使用独立域名,也可能被 REJECT 或分配到不同出口。只对已确认的相关域名添加必要例外,并放在宽泛规则前,不要直接把整套规则全部改成 DIRECT 或 PROXY。

规则维护的完成条件是结果可解释、修改可回退:每一条例外都对应明确目标,每一次验证都能指出命中位置,FINAL 的处理方向与预期一致。若仍无法解释结果,应恢复备份并逐条增加规则,而不是同时叠加多套来源不同的配置片段。更多界面入口可查阅选项手册。

App Store 正版核验 →