Shadowrocket REJECT 规则怎么写:拦截请求的原理、适用范围与边界

讲清 REJECT 策略在规则匹配中的作用,以及 DOMAIN-SUFFIX 等写法的拦截效果,并说明规则拦截能做到什么、做不到什么。

本文速览

本文适合已经使用 Config 分流、希望阻止特定目标连接的用户。先确认 REJECT 的作用位置,再按精确域名、域名后缀和目标 IP 编写规则,最后用连接记录验证命中与误拦截。示例域名仅用于说明语法;实际目标应根据自己的请求记录确定。

REJECT 的作用:阻止命中的连接

REJECT 是策略,不是独立的匹配条件。规则前半部分判断目标是否符合条件,末尾的 REJECT 指定命中后的处理方式。例如 DOMAIN,metrics.example.com,REJECT 表示按完整域名匹配,然后拒绝该请求;它不会自动识别所有统计服务,也不会自动生成域名列表。

应用发起请求 隧道接收流量 规则顺序匹配 命中拒绝策略 连接被阻止

这条流程以请求进入 Shadowrocket 的处理范围、且当前使用规则分流为前提。REJECT 不是先向目标发送完整内容、再把返回页面隐藏,而是在连接处理阶段阻止后续通信。请求方可能显示连接失败、重试或超时,具体表现取决于应用自身处理方式,不能仅凭页面提示判断是哪条规则生效。

规则通常自上而下匹配,首条命中的规则决定策略。因此,“写了 REJECT”与“请求实际采用 REJECT”是两件事:前面若已经命中更宽的放行规则,后面的拦截行就没有机会处理这次请求。排查时必须同时看目标、顺序和当前生效的配置。

先核对 Config,再添加最小范围的规则

在 Home 的 Global Routing 中选择 Config,再到 Config 确认正在使用的配置文件。Proxy 与 Direct 不能代替这一步;如果使用 Scene,还需要确认当前场景实际采用的配置与路由方式,不能仅凭某个配置文件里有 REJECT 就认定它正在生效。

  1. 在 Config 保留当前配置副本,记录原有规则顺序和 FINAL 策略,便于恢复。
  2. 打开正在使用的配置,通过编辑入口找到 [Rule] 段。先添加一条完整域名规则,不急于扩大到整组域名。
  3. 把这条规则放在可能提前命中的宽泛规则之前,同时保留业务必需的精确例外。
  4. 保存配置并确认其仍处于使用状态。关闭目标应用的旧连接,再重新发起同一操作。
  5. 查看本次连接对应的目标和策略;只有新请求实际命中 REJECT,才能确认拦截路径正确。

如果配置由远程来源更新,先确认本地修改是否会被后续更新覆盖。订阅与节点从你的服务商处获取;服务器订阅更新与 Config 规则修改不是同一项操作,刷新服务器列表不能证明新规则已经载入。

DOMAIN、DOMAIN-SUFFIX 与 IP-CIDR 的写法

优先选择能够覆盖目标的最窄条件。完整域名适合单个主机,域名后缀适合明确需要一起处理的域名及其子域,IP 网段则适合已确认地址范围的目标。域名字段不填写 https://、路径、查询参数或端口。

按域名匹配

完整域名
DOMAIN,metrics.example.com,REJECT
域名后缀
DOMAIN-SUFFIX,metrics.example.com,REJECT
匹配差异
前者只匹配指定主机;后者还匹配其下级子域。

后缀按域名层级匹配,不是任意文本包含匹配。

按目标 IP 匹配

单个 IPv4
IP-CIDR,192.0.2.8/32,REJECT
IPv4 网段
IP-CIDR,192.0.2.0/24,REJECT
示例用途
这里使用文档示例地址,不代表实际拦截目标。

按实际连接地址核对范围,不要把共享地址误当成单一服务。

DOMAIN-SUFFIX,metrics.example.com,REJECT 能匹配 metrics.example.com 和 img.metrics.example.com,但不会匹配 othermetrics.example.com。也不需要写成 *.metrics.example.com;通配符不是这条规则的后缀参数写法。

3 字段
上述 DOMAIN 规则:类型、目标、策略
/32
IPv4 前缀长度:精确到单个地址
/24
IPv4 地址范围:共 256 个地址

IP 规则与域名规则不能互相等同。一个域名可能解析到多个地址,同一个地址也可能承载多个域名;客户端还可能改用其他地址或 IPv6。仅拒绝某个 IPv4 地址,不能据此认定相关域名的所有连接都已被阻止。GEOIP 按地址归属匹配,范围更广,不适合代替某个具体域名的精确拦截。

规则顺序:先写例外,再写拦截,FINAL 留在末尾

下面演示一组有意保留例外的规则:允许一个指定主机直接连接,再拒绝同一后缀下的其他主机。示例中的 PROXY 必须是你的配置里可用的策略或策略组名称;若当前配置使用其他名称,应保留原有 FINAL 行,而不是照搬示例兜底。

[Rule]
DOMAIN,health.metrics.example.com,DIRECT
DOMAIN-SUFFIX,metrics.example.com,REJECT
FINAL,PROXY
请求目标首条命中结果
health.metrics.example.com第一条 DOMAIN采用 DIRECT
img.metrics.example.com第二条 DOMAIN-SUFFIX采用 REJECT
www.example.com末尾 FINAL采用示例中的 PROXY

如果把后缀拦截放到第一行,健康检查主机也会先命中 REJECT,后面的 DOMAIN 例外无法再放行。反过来,若在拦截前放入 DOMAIN-SUFFIX,example.com,DIRECT,它会提前放行这些目标。FINAL 本身负责剩余请求,放在拦截前会使后面的规则失去匹配机会。

判断:需要例外时,先缩小规则覆盖范围

先把必需主机的精确规则移到宽泛拦截之前,再重新验证。不要用删除所有 REJECT 的方式处理单个误拦截,也不要用更宽的 DIRECT 规则掩盖顺序问题。

拦截的适用范围与能力边界

REJECT 适合阻止目标清晰、可以按域名或地址区分的连接,例如用户已确认不需要访问的独立资源主机。它的判断对象是连接目标,不是页面里的每一个视觉元素,更不是对所有内容进行语义识别。

DNS 解析失败与 REJECT 命中也应区分。前者可能发生在获得目标地址之前,后者应有对应的规则策略证据;看到域名打不开,不能直接归因于 REJECT。另一方面,域名信息是否可用于匹配,取决于实际请求及解析路径;只有地址信息时,需要结合连接记录检查 IP 相关规则,不能假定域名条件一定存在。

写了不生效、误拦截与恢复方法

验证时一次只改一个变量:同一应用、同一动作、同一网络环境,对照修改前后的新连接。下面的问题按“配置是否使用、规则是否命中、结果是否被缓存掩盖”的顺序排查。

规则保存了,为什么目标还是能打开?

先核对 Home → Global Routing 是否为 Config,再检查 Config 中实际使用的文件。随后查看目标的新连接是否被前面的 DIRECT、PROXY 或其他宽泛规则提前匹配;不要仅检查文件中有没有 REJECT 这一行。

显示命中 REJECT,为什么页面还有原来的内容?

退出目标应用后重新进入,区分缓存显示与新请求。检查页面是否从其他域名重新获取资源,并记录这些连接;已缓存内容仍在屏幕上,不能证明命中的请求被放行。

加完后缀规则,登录或图片也失败了怎么办?

先停用刚添加的单条规则并重试,确认关联性。再从失败记录找出必需主机,改用更窄的 DOMAIN 拦截,或在后缀规则前加入精确放行例外;不要直接放行整个父域名。

更新配置之后,之前的拦截为什么消失了?

对照保存的副本检查当前配置的 [Rule] 段,确认本地修改是否被远程内容覆盖。重新加入经过验证的最小规则,并保留原有 FINAL;不要把服务器订阅刷新当作规则恢复操作。

需要回退时,优先撤销最后加入的拦截行,保存后重新建立目标连接;如果已经修改多处且无法确认先后,恢复此前保留的配置副本。保留测试目标、命中规则与恢复结果这三项记录,比反复切换所有设置更容易定位原因。

App Store 正版核验