Shadowrocket 规则写法入门:DOMAIN、DOMAIN-SUFFIX、GEOIP、IP-CIDR 与 FINAL 各匹配什么

逐个讲解 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP、IP-CIDR、FINAL 的匹配范围与书写格式,并说明规则从上往下命中的顺序。

本文速览

Shadowrocket(小火箭)的规则用于决定连接走 PROXY、DIRECT 还是 REJECT。本文面向已有自己的服务商与订阅、准备调整 Config 的用户,从域名与 IP 匹配讲到首条命中、FINAL 兜底和修改后的验证。示例域名与地址仅用于解释语法,不是连接资源;读完可以判断一条规则为何生效,以及应将例外规则放在哪里。

一、先区分匹配条件与连接动作

一条规则通常由“类型、匹配值、动作”组成,字段之间使用英文逗号。例如 DOMAIN,example.com,DIRECT 表示:当可用于匹配的目标域名恰好是 example.com 时,选择 DIRECT。规则不负责创建可用的代理连接;选择 PROXY 后,仍需要已有连接条目的地址、端口和协议参数正确。

目标连接 获取匹配信息 顺序检查规则 首条命中 执行连接动作

PROXY 表示使用代理出站,DIRECT 表示直接连接目标,REJECT 表示拒绝连接。它们不是 Shadowsocks、VMess、VLESS、Trojan、Hysteria2 或 WireGuard 这样的协议名。协议决定代理连接如何建立,规则决定哪些目标使用哪一种出站策略,二者处于不同层次。

6 类
本文讲解的规则关键字
3 种
示例动作:PROXY / DIRECT / REJECT
1 条
一次匹配以首条命中结果为准

以下内容以 iPhone / iPad 的 Home、Config 和 Global Routing 界面词说明操作。测试配置规则前,在 Home → Global Routing 选择 Config;Proxy 或 Direct 是全局路由姿态,不能用来验证同一套 Config 规则是否按预期逐条命中。Scene 涉及场景设置,也不应直接当作 Config 的同义项。

二、DOMAIN、DOMAIN-SUFFIX 与 DOMAIN-KEYWORD

这三类都以域名为匹配对象,但覆盖范围不同。DOMAIN 是完整域名匹配;DOMAIN-SUFFIX 包含指定域名本身及其子域名;DOMAIN-KEYWORD 检查域名中是否包含指定字符串。规则里的域名不写 https://、路径、查询参数或端口。

写法会匹配不会匹配
DOMAIN,example.com,DIRECT example.com api.example.com
DOMAIN-SUFFIX,example.com,PROXY example.com、api.example.com notexample.com
DOMAIN-KEYWORD,example,REJECT example.com、myexample.net sample.net

DOMAIN-SUFFIX 的边界是域名层级,不是任意字符结尾,因此 notexample.com 不属于 example.com 的子域名。与之不同,DOMAIN-KEYWORD 没有这个层级边界。使用 ads 等短字符串可能覆盖原本不想处理的域名,不能把“名称里包含某个词”直接等同于“连接用途已经确定”。

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

上例中,api.example.com 先命中 DOMAIN,所以走 DIRECT;www.example.com 没有命中第一条,会在第二条选择 PROXY。这里的 telemetry 只是字符串匹配演示,不能据此判定实际连接的内容或用途。若要拒绝某个已确认的域名,优先使用范围更明确的 DOMAIN 或 DOMAIN-SUFFIX。

三、GEOIP 与 IP-CIDR:按目标 IP 判断

GEOIP 依据 IP 数据库中的归属信息匹配目标地址,常见写法是 GEOIP,CN,DIRECT。CN 是数据库使用的地区代码,不是域名后缀;同一个域名也可能因为 DNS 返回不同地址而得到不同的 IP 匹配结果。

IP-CIDR 用网段描述地址范围。/24 表示前 24 位固定;/32 表示单个 IPv4 地址。下面使用文档示例网段解释语法,不代表可访问的服务器,也不要求把这些条目加入日常配置。

[Rule]
IP-CIDR,192.0.2.8/32,DIRECT,no-resolve
IP-CIDR,198.51.100.0/24,PROXY,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

IP-CIDR 不检查端口。同一个目标 IP 的 TCP 443 与 TCP 8443 都可能命中同一条网段规则;若 443 可用而 8443 连接失败,不能仅靠改动网段掩码解决。IPv6 地址应使用对应的 IPv6 规则类型,不要把 IPv6 地址直接套进本文的 IPv4 示例。

四、从上往下匹配,FINAL 放在最后

规则顺序不是按关键字“精确程度”自动排序。DOMAIN 并不会天然优先于 DOMAIN-SUFFIX:如果较宽的后缀规则已经先命中,后面的精确域名规则就没有机会执行。编排原则是把确实需要优先处理的例外放在前面,较宽范围放在后面。

[Rule]
DOMAIN,download.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY
  1. 目标是 download.example.com:第一条命中,选择 DIRECT,不继续检查第二条。
  2. 目标是 docs.example.com:第一条不命中,第二条命中,选择 PROXY,不再检查 GEOIP。
  3. 目标不属于上述域名,但目标 IP 被数据库归类为 CN:在 GEOIP 处选择 DIRECT。
  4. 此前规则全部没有命中:使用 FINAL,PROXY,把剩余连接交给代理出站。

FINAL 没有域名或网段字段,格式是 FINAL,动作,不是 FINAL,example.com,PROXY。它匹配此前未处理的连接,通常放在规则末尾。把 FINAL 放在前面会使后面的普通规则失去匹配机会。

五、在 Config 中修改并验证一条规则

规则试验以用户已有自己的服务商与订阅为前提。Home 中的 Subscribe 连接条目与 Config 中的分流配置不是同一份内容:刷新连接订阅不能证明新规则已经加载,修改 Config 也不能修复错误的协议密码或服务器端口。修改前先保留原配置,避免同时更新连接参数与路由规则。

  1. 备份配置

    打开 Config,定位当前使用的配置,通过该条目的操作菜单导出备份。记录原先选中的配置,测试时使用副本,保留可恢复的原件。

  2. 编辑规则

    在 Config 打开测试配置的编辑入口,找到 [Rule]。已有该段时不要重复添加段名,把一条明确的 DOMAIN 规则插入 FINAL 之前并保存。

  3. 选中配置

    回到 Config,确认选中的是刚修改的配置;再到 Home → Global Routing 选择 Config,检查 Home 中当前使用的连接条目。

  4. 新建连接

    关闭目标页面后重新访问,必要时断开再连接。已有长连接可能沿用原来的连接状态,不能把保存规则后的旧会话当作新规则的验证结果。

  5. 核对记录

    检查连接记录或日志中的目标域名、目标 IP 与实际策略。每次只调整一处;若结果异常,恢复备份,再比较修改前后的规则顺序。

验证时先用可控的完整域名做 DOMAIN 试验,再扩大到 DOMAIN-SUFFIX。不要一开始添加很短的 DOMAIN-KEYWORD,否则难以判断是哪一批目标受到影响。若应用的请求只呈现为 IP,也不能假定域名规则一定有足够信息参与匹配。

六、连接错误与规则错误分开排查

“网页打不开”本身不能证明规则语法错误。先检查实际出站是否符合预期,再沿连接层排查。以下是可能在连接诊断或底层日志中出现的错误文本;不同平台和系统的完整提示可能不同,它们都不是固定的规则解析报错。

报错:Connection refused

原因与解法:目标端口未接受连接或被主动拒绝;先看日志确认失败的是代理服务器还是目标网站,再向自己的服务商核对已有连接的地址与端口,不要把命中 PROXY 误认为代理端口已经可用。

报错:Operation timed out

原因与解法:连接在期限内未完成,可能涉及网络路径、服务端或防火墙;先比较同一目标在当前规则下的实际出站与预期是否一致,再检查网络及已有连接参数,超时本身不指向某一个规则关键字。

七、规则写法常见问题

写了 DOMAIN,为什么子域名还是走代理?

DOMAIN 只匹配完整域名。若希望 example.com 和它的子域名都走 DIRECT,可使用 DOMAIN-SUFFIX,example.com,DIRECT,并将其放在会覆盖它的宽泛规则之前。修改后在 Home → Global Routing 确认使用 Config,再建立新连接。

精确规则放后面,不是应该优先吗?

不会自动优先。把 DOMAIN,api.example.com,DIRECT 移到 DOMAIN-SUFFIX,example.com,PROXY 前面,才会让这个子域名先命中例外。保存后检查当前选中配置,避免编辑了副本却仍在使用原配置。

更新订阅后,手写规则会不会消失?

先区分更新对象:Home 的连接订阅与 Config 的远程配置不同。远程配置更新可能覆盖该配置里的本地改动。测试规则应先备份并保存为独立副本,更新后重新检查 [Rule] 内容,不要假定所有手写条目都会保留。

FINAL 用 DIRECT 还是 PROXY?

取决于未被前面规则覆盖的连接应如何处理。FINAL,DIRECT 让剩余连接直连,FINAL,PROXY 让剩余连接走代理。先明确兜底目标,再检查必要的例外是否位于 FINAL 之前;两者都不能替代可用的网络与正确连接参数。

下载 Shadowrocket