Shadowrocket(小火箭)的规则先决定“匹配谁”,再决定“交给哪种策略”。本文适合已经有可用配置、希望修改分流范围的用户:先区分域名与 IP 规则,再按从上到下的顺序排列例外,最后用新的连接记录核对结果。示例只展示规则语法,不提供连接服务;涉及代理连接时,以用户已有自己的服务商与订阅为前提。
1. 规则基本格式:类型、匹配值、策略
普通匹配规则通常由三个字段组成,使用英文半角逗号分隔:规则类型、匹配值、策略。规则放在配置文件的 [Rule] 段中;FINAL 不需要匹配值,因此只写两个字段。先核对结构,再检查匹配范围,比直接堆叠规则更容易定位问题。
[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
DIRECT 表示直接连接,PROXY 表示走代理策略,REJECT 表示拒绝匹配的连接。策略字段也可以引用配置中实际存在的策略名称,但名称必须一致。本文统一使用内置策略词,避免把未定义的策略名称带入示例。
2. DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD 匹配什么
这三类规则检查的是域名,不是整个网页地址。需要填写 example.com,而不是带有 https://、端口或路径的 URL。网页中的主页面、图片和接口可能分别访问不同域名,一条域名规则不会因为它们显示在同一页面上就自动覆盖全部连接。
| 规则 | 匹配范围 | 不匹配的例子 |
|---|---|---|
DOMAIN,example.com,DIRECT | 仅匹配 example.com | www.example.com |
DOMAIN-SUFFIX,example.com,DIRECT | 匹配 example.com 及其子域名,例如 a.b.example.com | notexample.com |
DOMAIN-KEYWORD,example,DIRECT | 匹配域名中包含 example 的请求 | 域名为 sample.test、仅 URL 路径含 example 的请求 |
DOMAIN-SUFFIX 按域名层级边界匹配,不是任意字符串的尾部匹配。通常直接写 example.com,不写 *.example.com。如果只想单独处理 api.example.com,使用 DOMAIN 能明确表达范围,也不会顺带匹配它下面的其他子域名。
DOMAIN-KEYWORD 范围更宽:example 既可能命中目标站点,也可能命中包含同一字符串的其他域名。它不是正则表达式;不要把正则符号当作匹配语法。只处理一个明确域名及其子域名时,优先用能准确表达需求的后缀规则。
[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,telemetry,REJECT
FINAL,DIRECT
此处 api.example.com 命中第一行,其他 example.com 子域名命中第二行。第三行只检查尚未匹配请求的域名是否包含 telemetry;它不会回头覆盖前两行已经确定的策略。
3. IP-CIDR 与 GEOIP:检查目标 IP,不检查网址文字
IP-CIDR 按 IPv4 网段匹配,斜杠后的数字是网络前缀长度,不是端口号。192.168.1.0/24 覆盖 192.168.1.0 至 192.168.1.255 这个地址范围;/32 则只表示一个 IPv4 地址。IPv6 网段使用对应的 IP-CIDR6 类型。
[Rule]
IP-CIDR,192.168.1.0/24,DIRECT,no-resolve
IP-CIDR,192.0.2.8/32,DIRECT,no-resolve
IP-CIDR6,2001:db8::/32,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
其中 192.0.2.8 和 2001:db8::/32 是文档示例地址,不是可用服务入口。访问 192.168.1.20:8080 时,网段规则检查的是 192.168.1.20,不会只匹配端口 8080。把端口号写入 CIDR 匹配值会混淆两种不同条件。
| 字段或类型 | 含义 | 核对重点 |
|---|---|---|
IP-CIDR | 目标 IPv4 是否落入指定网段 | 填写网络地址与前缀长度,不填写 URL |
GEOIP,CN | 目标 IP 在所用地理数据库中是否归为 CN | 不是按域名后缀、网页语言或设备位置判断 |
no-resolve | 不为检查该 IP 规则而主动触发域名解析 | 不是关闭所有 DNS,也不代表域名请求必定命中 |
域名请求要参与 IP 类匹配,需要有可供判断的目标地址;是否为规则匹配触发解析,与规则选项及请求上下文有关。加入 no-resolve 后,如果当前没有可用目标 IP,就不能把这条网段规则当作域名覆盖规则。需要稳定覆盖某个域名时,直接添加明确的域名规则更便于核对。
GEOIP 的结果依赖所用 IP 地理数据库。一个域名可能解析到多个地址,地址归属也可能变化,因此它与 DOMAIN-SUFFIX 表达的需求不同。要让指定域名始终采用某个策略,应把它的域名例外放在通用 GEOIP 规则前面。
4. 从上到下匹配:FINAL 为什么要放最后
普通规则按顺序检查,先命中的规则决定策略;并不存在“越精确就自动越优先”的排序机制。具体例外放在前面,范围较大的规则随后,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:先命中DOMAIN,使用DIRECT,不再被下一行改成PROXY。www.example.com:第一行不匹配,第二行匹配,使用PROXY。- 直接访问
192.168.1.20:前两条域名规则不匹配,由局域网网段规则处理。 - 其他目标:继续检查
GEOIP;仍未命中才由FINAL,PROXY接手。
如果把后缀规则移到第一行,api.example.com 会先被它覆盖,下面的精确域名例外就失去作用。同样,如果把 FINAL,DIRECT 放在顶部,后续规则便没有正常参与匹配的机会。调整顺序后,要用新的连接复核,而不是只刷新已经建立连接的页面。
5. 在 Config 修改后,按四步核对结果
排查时一次只改变一个条件。先确认修改的是当前使用的配置,再确认 Home 的路由姿态,最后查看新连接的目标与策略。只看到顶部连接开关打开,不能说明指定规则已被命中。
-
保存原配置
进入 Config,确认当前使用的文件,先保存副本。打开该文件的文本编辑入口,在
[Rule]段中修改;不要把规则追加到[Host]或其他分段里。 -
插入精确规则
把需要的
DOMAIN例外放在对应DOMAIN-SUFFIX前面,保留文件末尾的FINAL。保存后确认 Config 中使用的是修改后的文件。 -
选择 Config
回到 Home → Global Routing → Config,再确认连接状态。如果需要使用
PROXY,先用 Home → Connectivity Test 检查已有服务的连通情况;测试结果本身不等于规则命中证明。 -
核对新连接
重新发起目标请求,在应用内连接记录中对照实际域名、目标 IP 与使用的策略。若页面同时访问多个域名,应分别核对;不要把某个图片请求的结果当成主页面请求的结果。
记录中若显示的目标不是预期域名,先检查重定向、接口域名或直接 IP 访问,而不是立即扩大规则范围。若请求仍沿用旧连接,可关闭相关页面或应用后重新发起请求,必要时重新建立 Shadowrocket 连接。用可重复的新请求验证,才能区分“规则没有命中”和“旧连接尚未变化”。
6. 常见写错点与非规则类报错
语法错误、匹配范围错误、服务不可用是三类问题。规则只负责决定策略,不会修复订阅地址或代理连接参数。下面先检查可直接从文本发现的问题,再处理与规则无关的获取失败提示。
| 错误写法或现象 | 问题 | 修正方向 |
|---|---|---|
DOMAIN,https://example.com/a,DIRECT | 把完整 URL 当作域名 | 改为 DOMAIN,example.com,DIRECT;不检查路径 |
DOMAIN-SUFFIX,*.example.com,DIRECT | 把通配符带入后缀匹配值 | 改为 DOMAIN-SUFFIX,example.com,DIRECT |
IP-CIDR,192.168.1.20:8080,DIRECT | 混入端口,且没有 CIDR 前缀 | 单个地址写作 192.168.1.20/32,该规则不限定端口 |
FINAL,example.com,PROXY | FINAL 多写了匹配值 | 改为 FINAL,PROXY,并放在规则末尾 |
| 中文逗号分隔字段 | 字段分隔符不正确 | 替换为英文半角逗号,并检查规则是否位于 [Rule] 内 |
报错:Failed to load subscription
原因与解法:这是订阅加载失败提示,可能涉及地址失效或访问失败,不是某条 DOMAIN-SUFFIX 规则的语法诊断。先向自己的服务商确认已有订阅地址有效,再在 Home 对该订阅执行更新;规则排查应在条目可用、配置已启用后单独进行。
如果修改的是由远程来源维护的配置,还要注意再次更新可能覆盖本地改动。先确认文件来源与更新方式,保留本地副本,避免刚验证完规则又被更新内容替换。订阅条目的更新与 [Rule] 段的修改不是同一件事,不要用反复更新订阅代替规则检查。
7. 规则匹配常见问答
写了 DOMAIN,为什么子域名没跟着生效?
DOMAIN 只做完整域名匹配。要覆盖 example.com 与其子域名,使用 DOMAIN-SUFFIX,example.com,DIRECT;若某个子域名例外,把对应的 DOMAIN 规则放在它前面。
GEOIP,CN 能保证所有中文网站都直接连接吗?
不能按网页语言作这种判断。GEOIP 检查 IP 数据库归属。先从连接记录确认实际目标 IP;需要明确处理某个域名时,添加域名规则,并放在 GEOIP 前面。
规则写对了,为什么仍然全部走同一种策略?
先检查 Home → Global Routing 是否为 Config,再到 Config 核对启用的文件。然后检查前面是否有过宽的 DOMAIN-KEYWORD,或提前出现的 FINAL,最后用新连接记录核对。
no-resolve 会让所有域名都不解析吗?
不会。它限制的是为检查对应 IP 规则而触发的解析。若需求是让某个域名直接连接,使用明确的 DOMAIN 或 DOMAIN-SUFFIX,不要依靠 no-resolve 代替域名匹配。