Shadowrocket 规则语法入门:DOMAIN-SUFFIX、GEOIP、IP-CIDR 与 FINAL 匹配逻辑

讲清 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP、IP-CIDR、FINAL 分别匹配什么,说明规则从上到下的命中顺序,并给出 PROXY、DIRECT、REJECT 的示例写法。

本文速览

Shadowrocket 的规则决定连接使用哪一种策略,不负责提供可用的服务器。本文适合已经完成服务器导入、准备使用 Config 分流的用户:先区分 Global Routing 与配置文件,再读懂六个规则关键字,最后通过最小示例检查匹配顺序、DNS 条件与实际出站。所有域名与地址示例只用于解释语法,不能作为可用线路。

1. 先选 Config,再讨论规则是否生效

Shadowrocket(小火箭)的规则不是打开连接后就必然逐条执行。先在 Home 查看 Global Routing:要使用当前配置文件里的规则,应选择 Config;同时到 Config 确认实际启用的是刚刚编辑的配置,而不是另一个同名文件。

选项用途检查规则时的注意事项
Config按当前配置分流本文规则示例的验证前提。
Proxy全局使用代理出站不能用此状态验证某条规则是否选择了 DIRECT。
Direct全局直接连接不能用此状态判断 PROXY 规则是否正确。
Scene按场景条件应用相应设置先核对当前场景,避免把场景切换误认成规则失效。

Home 负责服务器选择与连接,Config 管理配置文件,Settings 提供应用设置。Settings → On Demand 影响按条件建立连接的行为,不会把一条 DOMAIN-SUFFIX 自动改成其他策略。排查时先区分“连接是否建立”和“连接建立后走哪条规则”,不要同时修改两类设置。

2. 规则从上向下,首次命中就决定策略

常见规则行由英文逗号分隔,基本结构是“规则类型、匹配内容、策略”。FINAL 没有匹配内容,结构为“FINAL、策略”。规则按顺序检查,一旦命中便使用对应策略,不会继续寻找后面看起来更精确的规则。因此,“精确例外在前、宽泛范围在后、FINAL 在最后”是组织配置的重要原则。

连接信息逐条检查首次命中选择策略执行出站
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY

这三行中,api.example.com 命中第一行并选择 PROXY;www.example.com 不符合第一行,但符合第二行,因此选择 DIRECT。若把第二行移到第一行之前,api.example.com 也会被后缀规则先接住,原来的精确例外就无法执行。顺序错误不会必然产生语法报错,却会直接改变结果。

3. DOMAIN、DOMAIN-SUFFIX 与 DOMAIN-KEYWORD 的边界

域名规则匹配的是连接可用的域名信息,不是完整网页地址。填写匹配内容时不带协议头、端口、路径或查询参数。例如访问一个带有 /account 路径的页面时,DOMAIN 仍然只判断主机名,不能用它区分同一主机下的两个页面。

关键字与示例会匹配不会匹配或注意事项
DOMAIN,example.com,DIRECTexample.com不包含 www.example.com。
DOMAIN-SUFFIX,example.com,PROXYexample.com、www.example.com、a.b.example.com不包含 notexample.com;后缀具有域名标签边界。
DOMAIN-KEYWORD,metrics,REJECT域名中包含 metrics 的连接范围可能很宽,不等于只匹配名为 metrics 的子域。

如果只想让 api.example.com 使用代理,优先用 DOMAIN,而不是用 api 作为 DOMAIN-KEYWORD。后者可能同时覆盖其他无关域名。需要覆盖一个域名及其所有子域时,再选择 DOMAIN-SUFFIX;不要把通配符写成 *.example.com 来代替这里的后缀语法。

4. IP-CIDR、GEOIP 与 DNS 的关系

IP-CIDR 按地址网段匹配,GEOIP 按 IP 地理数据库的归属结果匹配。它们判断的都是地址信息,不是网页语言、账号地区,也不是域名末尾的国家或地区后缀。某个域名使用了某种后缀,并不能据此断定它会命中 GEOIP 的哪个地区代码。

IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

192.0.2.0/24 是文档示例网段,/24 表示前 24 位为网络前缀,覆盖 192.0.2.0 至 192.0.2.255;它不是可用服务器地址。IP-CIDR 匹配整个地址范围,不是只匹配文本里出现的 192.0.2.0。IPv6 网段应使用对应的 IP-CIDR6 规则类型,不要把 IPv6 地址硬写进 IPv4 示例。

当域名规则没有命中、后续 IP 规则需要地址信息时,DNS 状态可能影响匹配过程。GEOIP 的结果也取决于实际目标地址与数据库内容,不能保证覆盖某类网站的全部资源。排查时应记录具体域名、实际地址与命中策略,而不是只记录“某个应用打不开”。

5. 用最小规则集理解 FINAL 与策略结果

下面是用于阅读与试验的完整规则段,不是面向所有网络的配置推荐。使用前保留自己的完整配置与服务器设置,只在副本里调整规则;不要把只有 [Rule] 的片段当作包含全部连接参数的新配置。

[Rule]
DOMAIN,blocked.example.com,REJECT
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
DOMAIN-KEYWORD,metrics,REJECT
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

如果想让 metrics.example.com 也被拒绝,可以在后缀规则之前增加精确 DOMAIN 例外;若把整个关键词规则上移,则所有包含 metrics 的域名都可能提前被拒绝。修改时应先明确所需范围,再选择“增加精确例外”或“移动宽泛规则”,避免为了修复一个域名扩大影响范围。

6. 在当前配置中修改并验证

  1. 保留原配置

    进入 Config,先保留当前可用配置的副本,再打开待修改文件的编辑入口。记录文件名与原来的 Global Routing,方便回退。

  2. 核对规则段

    在配置文本中定位 [Rule],使用英文逗号逐行编辑;精确例外放在对应宽泛规则前,FINAL 放在最后。不要重复粘贴多个 [Rule] 段来代替整理顺序。

  3. 启用并选模式

    保存后,在 Config 确认使用此文件;返回 Home → Global Routing → Config。只保存文件而没有选用它,不能验证刚才的修改。

  4. 核对出站

    在 Home 选中已有服务器并运行 Connectivity Test,先确认代理出站具备连接条件。服务器与订阅信息从你的服务商处获取,规则文本不能代替这些参数。

  5. 新建连接验证

    重新发起目标请求,在应用的连接记录中核对目标、命中规则与出站策略。一次只改一项;旧连接可能继续复用,必要时停止旧请求,再重新连接测试。

Connectivity Test 检查的是连接能力,不能单独证明某个网站命中了指定规则。规则验证应以具体请求的记录为准。还要区分服务器订阅与规则配置:更新 Home 中的服务器列表,不等于当前 Config 里的规则也随之更新;远程配置重新更新后,本地修改是否保留也应再次检查。

7. 区分规则错误与出站错误

规则已命中 PROXY 但网页仍无法打开,并不必然说明语法错误。下面列出连接日志中常见的网络错误片段;完整错误文本可能带有地址、端口与底层说明,遇到时先核对它发生在目标连接还是代理服务器连接阶段。

报错:connection refused

原因与解法:连接端点拒绝建立连接,常见于目标端口未监听或被主动拒绝;先在连接记录中确认失败端点,再核对相应服务器或目标服务的地址、端口,不能仅靠移动 FINAL 修复。

报错:i/o timeout

原因与解法:网络操作在等待时间内未完成;先用 Home 的 Connectivity Test 检查所选服务器,再查看该请求实际走 DIRECT 还是 PROXY,分别排查直连路径或代理路径。

例如服务商给出的服务器端口为 443,就应核对服务器设置中的端口是否确为 443;不能因为某份规则示例出现了 443,就擅自替换原有端口。DOMAIN-SUFFIX 本身不包含端口字段,服务器监听端口与域名匹配条件属于不同层次。

8. 规则配置常见问答

已经写了 DOMAIN,为什么还是走别的策略?

先到 Home → Global Routing 确认是 Config,再到 Config 核对启用文件。随后从该规则上方逐行检查,尤其关注更早的 DOMAIN-SUFFIX、DOMAIN-KEYWORD 与 FINAL;已被前面规则接住的连接不会继续往下匹配。

GEOIP,CN,DIRECT 能代替所有域名规则吗?

不能。GEOIP 根据目标 IP 的数据库归属判断,同一服务可能使用不同地区的资源。需要固定某个域名的策略时,把明确的 DOMAIN 或 DOMAIN-SUFFIX 放在 GEOIP 前面,再通过连接记录确认。

订阅刷新了,为什么规则还是旧的?

先确认更新对象。Home 中服务器订阅的更新主要作用于服务器条目;规则来自当前 Config。进入 Config 检查实际配置内容与启用状态,不要把服务器名称变化当作规则已经更新的证据。

把 FINAL 改成 DIRECT 就能修好连接吗?

这只会改变前面没有命中的连接的兜底出站,并不能修复服务器参数或 DNS 故障。先确认目标是否确实命中 FINAL;若只是一个域名需要例外,优先增加范围明确的规则,而不是改变所有未匹配连接。

App Store 正版获取核对开发者与应用 ID