本文适合已经在 iPhone 或 iPad 上使用 Shadowrocket、拥有自己的服务器信息或订阅,但不清楚规则为什么命中或失效的用户。先核对 Global Routing 与当前配置,再区分域名匹配、IP 匹配和 FINAL 兜底;读完可以写出一份最小规则片段,并按请求记录检查实际去向。所有示例域名与保留地址仅用于说明,不提供连接服务。
一、规则生效的前提:Global Routing 与当前配置
Shadowrocket(小火箭)的规则不是服务器列表。Home 中选择的服务器决定代理连接所用的出口,Config 中的配置承载规则等设置;导入或更新自己的订阅,并不等于已经切换到预期的规则配置。排查前需要分别核对这两部分。
在 Home 查看 Global Routing。本文讨论的是选择 Config 后,由当前配置逐条判断请求的情况。Proxy 与 Direct 是全局路由姿态,不能拿它们的访问结果直接证明某一条配置规则已经命中。Scene 按所选场景设置工作,也不应当作 Config 的同义项。
| 设置项 | 核对含义 | 本文测试方式 |
|---|---|---|
Config | 按当前配置执行规则分流。 | 选择此项,再检查当前配置是否正确。 |
Proxy | 采用全局代理路由姿态。 | 可用于隔离出口问题,不作为逐条规则验证结果。 |
Direct | 采用全局直连路由姿态。 | 可对照直连表现,测试结束后恢复 Config。 |
Scene | 按场景配置决定相应行为。 | 先确认场景设置;初次测试规则时改用 Config。 |
二、规则语法与顺序:先命中,先执行
常见规则由英文关键字、匹配内容和策略组成,字段之间使用半角逗号。FINAL 不需要匹配内容,因此只有关键字和策略两个主要字段。DIRECT 表示直接连接;下文的 PROXY 表示交给代理出站,使用前仍须确认当前代理选择有效。如果填写自定义策略组名称,该名称必须能在配置中找到。
[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,example,PROXY
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
这只是说明语法的片段,不是可直接连接的完整配置。Shadowrocket 按从上到下的顺序检查规则,遇到第一条满足条件的规则便采用对应策略,不会继续寻找“更具体”的另一条。因此,精确规则并不会自动获得比宽泛规则更高的优先级。
以上例为例,当请求带有域名 login.example.com 时,第一行已经命中,结果为 DIRECT。若把 DOMAIN-SUFFIX 放到 DOMAIN 前面,login.example.com 会先被后缀规则命中并交给 PROXY,下面的精确规则便没有机会处理这次请求。
- 需要优先处理的少量例外放前面,例如某个登录域名。
- 覆盖整个域名及其子域的常规规则放在例外之后。
- 范围很宽的关键字、地址地区判断应检查是否遮挡后续规则。
- FINAL 放在所有需要参与匹配的规则之后,不在它下面追加有效例外。
三、DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD 的边界
这三种关键字都针对域名,但覆盖范围不同。规则里填写的是主机名或关键字,不是完整网址:不要附上 https://、网页路径、查询参数或端口。访问 login.example.com 的 443 端口,并不意味着 DOMAIN 的匹配内容要写成 login.example.com:443。
| 规则示例 | 能够命中 | 不会命中 |
|---|---|---|
DOMAIN,example.com,DIRECT | example.com | www.example.com、example.com.test |
DOMAIN-SUFFIX,example.com,PROXY | example.com、www.example.com、a.b.example.com | notexample.com、example.com.test |
DOMAIN-KEYWORD,example,PROXY | example.com、myexample.test、example.net | 不包含 example 的域名 |
DOMAIN:只处理一个完整主机名
需要把 api.example.com 与 www.example.com 分开时,使用 DOMAIN 最容易审阅。它不会隐含覆盖子域,DOMAIN,example.com,DIRECT 不会顺带处理 api.example.com。为一个应用写规则时,还应注意应用可能同时请求登录、接口、图片等多个主机名,不能只凭首页域名推断所有请求的去向。
DOMAIN-SUFFIX:按域名层级覆盖
DOMAIN-SUFFIX,example.com,PROXY 同时覆盖根域和其下各级子域,不需要添加通配符。它不是任意字符串后缀搜索:notexample.com 虽然末尾包含相同字母,但缺少域名层级边界,不属于 example.com 的子域。
DOMAIN-KEYWORD:按包含关系扩大范围
DOMAIN-KEYWORD 不要求关键字位于某一层域名边界,适合确实需要覆盖包含某字符串的多个域名的情况,也更容易产生意外命中。例如 example 会匹配 myexample.test。只想处理 example.com 这一组域名时,应优先使用 DOMAIN-SUFFIX,而不是用更宽的关键字代替。
四、GEOIP 与 IP-CIDR:匹配的是目标地址
GEOIP 按目标 IP 在地址数据库中的地区归属进行判断。GEOIP,CN,DIRECT 的含义是:目标 IP 被数据库归类为 CN 时使用 DIRECT。它不检查域名注册地或用户所在地区,也不保证某个品牌的所有服务始终使用同一地区地址。
IP-CIDR 则针对明确的 IPv4 网段。IP-CIDR,192.0.2.0/24,DIRECT 覆盖 192.0.2.0 到 192.0.2.255;其中 /24 表示前 24 位为网络前缀,不是端口号。192.0.2.0/24 是文档保留地址范围,此处只用来解释匹配,不能当作可用服务器。
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
IP 规则是否需要先解析域名,会影响排查过程。可选参数 no-resolve 表示不要仅为这条 IP 规则主动发起域名解析;若已经掌握目标 IP,仍可按地址判断。因此它不是“关闭 DNS”,也不表示网页从此不再需要解析。若尚无目标 IP,该条规则可能跳过,让后续规则继续判断。
- 域名例外优先:明确要按域名处理的服务,通常把对应 DOMAIN 或 DOMAIN-SUFFIX 放在宽泛的 GEOIP 前面。
- 数据库并非业务分类:CDN 地址、解析结果和地址数据库归属都可能影响 GEOIP 的结果,应核对实际目标 IP。
- 地址族分开核对:IP-CIDR 的 IPv4 网段不会覆盖 IPv6;涉及 IPv6 地址时需另行使用对应的 IP-CIDR6 规则。
- 端口不是 CIDR:目标端口 443 与网段 /24 是不同维度,不能把端口附在 IP-CIDR 的地址字段后面。
五、FINAL 为什么必须放在最后
FINAL 是兜底规则:前面的规则都没有命中时,采用它指定的策略。它没有域名或网段限制,因此把它放到中间,会截住所有走到这一行的请求,使下面的规则无法再参与判断。“最后”指整个有效规则序列的末尾,不只是当前编辑窗口里看起来的最后一段。
[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY
FINAL,PROXY 与 FINAL,DIRECT 都是明确的兜底选择,不存在适合所有人的固定答案。前者让未分类请求交给代理,后者让未分类请求直连。采用前者需要有效代理出口;采用后者则要接受未知目标直接连接的结果。修改前应先确认自己的使用目标,而不是只看能否打开一个网页。
“规则写得更精确,为什么还是没命中?”
先查看它上方是否已有 DOMAIN-SUFFIX、DOMAIN-KEYWORD 或 FINAL。把需要优先处理的 DOMAIN 例外移到宽泛规则前,再重新发起连接核对。
“FINAL 后面能再补一条规则吗?”
文本可以继续添加,但该规则不会处理已经被 FINAL 接住的请求。把新增规则移到 FINAL 前,并保留一条清晰的最终兜底。
“把 FINAL 改成 DIRECT 就算修好了吗?”
不一定。这可能只是绕开了不可用的代理出口。回到 Home 核对当前服务器,再检查预期域名是否应由更具体的规则处理。
“订阅更新后,规则也会一起变吗?”
服务器订阅更新与规则配置更新是不同操作。先在 Config 确认当前配置,再检查更新的到底是服务器列表还是配置文件;不要把列表刷新成功当作规则已更新的证据。
六、最小验证步骤:一次只改一条规则
验证要同时记录“预期策略”和“实际请求”。网页能打开只能说明某次请求成功,不能单独证明它走了 DIRECT 还是 PROXY。以下步骤不要求更换自己的订阅,也不要求调整协议参数;Shadowsocks、VMess、VLESS 等出口协议与规则关键字属于不同层面。
-
保留原配置
在 Config 确认当前配置,修改前保留可恢复的副本或原始文本。记录原来的 FINAL 策略,不直接覆盖唯一可用配置。
-
确认路由姿态
在 Home → Global Routing 选择 Config,再回到 Config 确认启用的是准备测试的配置,而不是另一份同名或远程配置。
-
添加精确例外
在当前配置的规则部分,为自己能够核对的真实目标添加一条 DOMAIN 规则,放在宽泛规则与 FINAL 前。本文的 example.com 仅作语法说明,不作为代理连通性测试目标。
-
重新发起请求
保存并确保配置生效后,结束目标应用已有连接,再发起新请求。保持 Home 中选择的服务器不变,避免连接复用或出口变化干扰判断。
-
核对请求记录
在请求记录或日志中核对主机名、目标 IP、命中规则及实际策略,以界面提供的字段为准。记录不足时先启用相应记录功能,再重复同一请求,不凭延迟数值推断出口。
七、规则命中后仍失败:按错误层次排查
规则负责选择去向,不保证目标、DNS 与代理服务器始终可用。请求记录已经显示预期规则命中时,应继续检查后面的连接环节。下列是网络诊断中可能遇到的错误原文,不是规则语法错误提示;具体显示形式取决于错误来自哪一层,不能只凭一行文字认定是规则问题。
报错:Connection refused
原因:某一连接端点拒绝了连接,可能是目标端口或代理服务器端口没有对应服务。
解法:先从记录确认被连接的地址与端口,再核对 Home 中该服务器的端口是否与自己已有的服务信息一致;若失败发生在目标端,检查目标服务而不是扩大域名规则。
报错:Operation timed out
原因:相关操作没有在等待时间内完成,可能涉及网络链路、代理连接或目标响应,单凭超时无法确定是哪一段。
解法:结合错误前后的连接记录定位阶段,在 Home → Global Routing 临时切换 Proxy 或 Direct 作对照,完成后恢复 Config,并保持测试目标相同。
报错:No route to host
原因:连接使用的网络路径无法到达目标地址,不等于 DOMAIN 或 FINAL 的字段写错。
解法:核对当前网络是否可用、实际目标 IP 与地址族是否符合预期,再检查请求最终走的是 DIRECT 还是代理出口,按对应路径处理。
如果是域名解析阶段失败,应先核对 DNS 请求是否成功;如果是服务器认证失败,应核对自己的服务器参数。不要通过把所有请求都改成 DIRECT 来掩盖这些问题,也不要为了某一个报错同时重写整份规则。保留对照条件,才能确定修复是否真正生效。
- 配置核对:Home → Global Routing 为 Config,Config 中启用的文件正确。
- 语法核对:使用半角逗号,域名字段不含网址路径,策略名称有效。
- 顺序核对:精确例外在宽泛匹配之前,FINAL 位于有效规则序列末尾。
- 结果核对:新请求的主机名、目标 IP 与实际策略符合预期,而不只是网页可以打开。