Shadowrocket 规则类型详解:DOMAIN、DOMAIN-SUFFIX、GEOIP、IP-CIDR、FINAL 的匹配范围

用 example.com 等示例逐条说明 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP、IP-CIDR 和 FINAL 分别匹配什么。同时解释规则自上而下、首条命中即生效的顺序逻辑。

本文速览

本文适合已在 Shadowrocket(小火箭)中配置好连接、需要自行调整分流规则的用户。先在 Home → Global Routing 选择 Config,再检查当前配置的 [Rule]:域名规则决定名称匹配范围,IP 规则检查目标地址,FINAL 处理剩余流量。阅读后可区分六类规则,安排顺序,并用单个请求验证结果;涉及代理连接时,以用户已有自己的服务商与订阅为前提。

1. 规则生效条件:Config 与首条命中

规则类型描述“用什么条件匹配”,行末策略描述“匹配后怎样处理”。两者必须分开看:DOMAIN,example.com,DIRECT 的条件是完整域名等于 example.com,结果是直连,并不是把该域名加入某个固定的代理名单。

本文讨论 Home → Global Routing → Config 下的分流。Proxy 与 Direct 分别用于全局代理、全局直连,不能用它们验证这里的规则顺序;Scene 属于按场景选择路由的另一种姿态,也不纳入本次测试。Config 页中还需要选用实际修改的配置,仅保存一个未被选用的文件不会改变当前分流。

请求进入隧道读取当前配置自上而下匹配首条命中生效执行出站策略

在本文的普通规则示例中,匹配到第一条满足条件的规则后就执行该策略,不会继续寻找“更精确”的下一条。精确匹配没有自动高于宽泛匹配的优先级,优先级由排列位置决定。

6 类
本文覆盖的规则关键字,不代表全部类型
第 1 条
首条命中的普通规则决定本次策略
32 位
IPv4 地址位数,/32 表示单个地址

2. DOMAIN、DOMAIN-SUFFIX 与 DOMAIN-KEYWORD

三种规则都以域名为匹配对象,不用于匹配网页路径或查询参数。访问 https://example.com/docs?q=test 时,域名是 example.com,不能把 /docs 或 ?q=test 填进 DOMAIN 来筛选页面。

规则写法会匹配不会匹配
DOMAIN,example.com,PROXYexample.comwww.example.com
DOMAIN-SUFFIX,example.com,PROXYexample.com、api.example.comnotexample.com、example.com.test
DOMAIN-KEYWORD,example,PROXYexample.com、myexample.testsample.test

DOMAIN:限制到一个完整名称

只希望 api.example.com 走代理,而其他子域名保持原策略时,优先使用 DOMAIN。规则值只写域名,不加协议头、不加端口号,也不加通配符。HTTPS 常用的目标端口 443 不属于域名字符串,因此 DOMAIN,example.com:443,PROXY 不是本文所需的写法。

DOMAIN-SUFFIX:覆盖主域名及其子域名

需要覆盖整个域名树时使用 DOMAIN-SUFFIX。它按域名层级边界匹配,不是任意字符后缀比较;example.com 能覆盖 static.example.com,却不会把 notexample.com 算进来。值中通常直接写 example.com,不要写成 *.example.com。

DOMAIN-KEYWORD:按域名中的片段匹配

DOMAIN-KEYWORD 的范围比后缀规则更难控制,因为字符串出现在域名任意位置都可能命中。只有确实需要按名称片段归类、并接受误匹配风险时才使用。若真实目标只有一个主域名及其子域名,DOMAIN-SUFFIX 更容易审核。

3. GEOIP 与 IP-CIDR:检查目标 IP

域名规则检查名称,GEOIP 与 IP-CIDR 检查地址。GEOIP 按本地 IP 地理数据库分类,例如 GEOIP,CN,DIRECT 表示对数据库归入 CN 的目标 IP 使用直连。它不检查网页语言、域名注册地,也不保证识别出服务器的物理所在地。

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

IP-CIDR 用网络前缀描述 IPv4 地址范围。192.168.50.0/24 覆盖 192.168.50.0 至 192.168.50.255;若只针对一台设备,可使用 192.168.50.10/32。示例中的局域网地址不是远程服务地址,应按实际网络修改。

同一域名可能有多个解析地址,地址也可能随网络环境变化。若需求是“这个网站始终走某策略”,通常先考虑域名规则;只有明确需要按目标网段或地址归属分类时,再使用 IP 类规则。

4. FINAL 与顺序:先例外,再一般,最后兜底

FINAL 不填写域名或网段,它负责接住前面都未命中的流量。FINAL,DIRECT 表示剩余请求直连,FINAL,PROXY 表示剩余请求走代理。两者适用于不同目标,没有一种能脱离配置目的被称为固定正确答案。

[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,DIRECT

这份规则实现“只有接口域名走代理,同站其他域名直连”。请求 api.example.com 会先命中 DOMAIN;请求 www.example.com 不满足第一条,但会命中 DOMAIN-SUFFIX;请求 example.net 则落到 FINAL。

排列方式请求 api.example.com原因
DOMAIN 在前PROXY精确例外先命中
DOMAIN-SUFFIX 在前DIRECT宽泛规则提前覆盖接口域名
FINAL 在最前DIRECT兜底提前接住请求,后面的普通规则没有机会

如果加入 DOMAIN-KEYWORD,example,PROXY,还要检查它是否提前覆盖了原本需要直连的域名。审核规则时不要只搜索有没有目标域名,还要从文件前部往后检查所有可能抢先命中的条件。

5. 在 Config 中修改并验证规则

以下片段只演示 [Rule] 段,不是可直接替代现有配置的完整文件。PROXY 使用现有代理选择;若配置引用了自定义策略组名称,还必须确认对应组确实存在。客户端买断 ≠ 线路套餐,购买应用不会自动补齐代理连接参数。

  1. 保留原配置:进入 Config,先保留当前文件副本或导出备份,记录当前选用的是哪一份配置。
  2. 编辑目标文件:打开需要修改的配置进行编辑,找到现有 [Rule] 段,把一条明确的 DOMAIN 测试规则放在可能覆盖它的规则之前,不要再追加一个重复段落。
  3. 保存并选用:确认 Config 当前选用的是修改后的文件,再回到 Home → Global Routing → Config。
  4. 准备连接:确认 Home 已选择用户已有的可用连接。若目标策略为 PROXY,可先运行 Connectivity Test,但测试通过不等于网站全部资源可访问。
  5. 建立新请求:关闭旧网页后重新打开目标页面;必要时在允许中断连接的情况下重连。已建立的长连接不适合验证刚修改的规则。
  6. 核对记录:查看本次请求对应的连接记录,核对目标域名、目标 IP、命中规则及实际策略;每次只改一项,再发起新请求进行比较。

本文使用 example.com 说明语法边界,表格展示的是规则逻辑推演,不是实际网络测速。正式测试应换成用户有权访问且确实使用的目标域名。不要根据页面打开快慢单独判断分流,网络延迟不能证明命中了哪条规则。

6. 访问失败:先分清 DNS、连接与规则

网页报错不等于规则语法错误。先看请求是否命中了预期策略,再检查该策略对应的解析与连接路径。下面两项是 DNS 响应中的标准错误标识,不是 Shadowrocket 固定弹窗文案;应在实际诊断结果出现它们时按相应分支处理。

DNS 响应:NXDOMAIN

原因:解析器返回所查询的域名不存在,可能是名称拼写错误或域名本身不可用。

解法:先核对请求主机名及 DNS 记录,再检查解析器返回;不要仅把 DOMAIN 改成 DOMAIN-SUFFIX,扩大匹配范围不会创建缺失的 DNS 记录。

DNS 响应:SERVFAIL

原因:解析器未能完成查询,可能涉及上游解析失败或验证问题,单凭此错误不能认定域名不存在。

解法:检查当前 DNS 设置与上游可达性,使用同一域名复查响应;域名取得地址后,再验证 GEOIP 或 IP-CIDR 的匹配结果。

若已经解析到 IP,连接却超时,应继续区分 DIRECT 与 PROXY 两条路径。命中 DIRECT 时,检查当前网络到目标的可达性;命中 PROXY 时,先确认当前代理可连接,再检查它到目标的路径。把 FINAL 来回切换只能作为受控对照,不能替代定位。

7. 规则写法常见问题

已经写了 DOMAIN,为什么子域名没一起走代理?

DOMAIN 只匹配完整名称。若主域名及全部子域名都需要相同策略,把规则改为 DOMAIN-SUFFIX,example.com,PROXY,再检查它前面有没有更早命中的规则。

规则写着 PROXY,记录里却是直连,要先改哪里?

先核对 Home → Global Routing 是否为 Config,再核对 Config 当前选用的文件。随后从 [Rule] 顶部检查,是否有更早的 DOMAIN-SUFFIX、IP 类规则或 FINAL 抢先匹配。

GEOIP,CN,DIRECT 能保证所有中文网站直连吗?

不能。GEOIP 按目标 IP 的数据库分类,不识别页面文字。若已知某个域名应直连,可在 GEOIP 前加入明确的 DOMAIN 或 DOMAIN-SUFFIX,并用新连接核对。

只想少数网站走代理,FINAL 应该怎么写?

先将目标域名写为 PROXY,把需要的例外排在前面,最后使用 FINAL,DIRECT。测试时同时检查目标域名和一个非目标域名,确认前者命中域名规则、后者落到直连兜底。

Settings → On Demand 会改变规则的匹配范围吗?

On Demand 管理按条件建立连接,不会把 DOMAIN 变成后缀匹配。先确认隧道已连接,再在 Config 姿态下检查规则;不要将“是否连接”和“连接后如何分流”混为一项设置。

App Store 正版入口购买前核对开发者与应用 ID