Shadowrocket(小火箭)的规则分流以 Global Routing 选择 Config 为前提。本文适合已经持有自己的服务商连接资料、准备编辑配置的用户:先辨认规则字段,再区分域名与 IP 匹配,最后按顺序验证命中结果。示例域名与地址用于说明语法,不是可用连接资料;修改前请保留现有配置。
1. 规则生效条件与匹配顺序
先给结论:规则按配置中的顺序自上而下检查,命中适用规则后采用该规则的策略,不会因为后面还有一条“更精确”的规则而自动重新选择。应把例外放在前面,把较宽范围放在后面,并用 FINAL 接住其余请求。只有确认当前使用的配置文件,编辑规则才有明确的作用对象。
在 Home → Global Routing 中选择 Config,才能按当前配置进行分流。Proxy 与 Direct 是全局路由姿态,不能用它们验证本文示例的规则顺序;Scene 则按场景设置工作,检查时还要核对场景对应的路由。测试单份规则文件时先使用 Config,避免把路由姿态造成的结果误认为语法问题。
这条流程说明的是规则决策关系,不代表所有请求都必须先做一次 DNS 查询。域名规则使用已知的目标域名,IP 规则使用目标地址;能否取得域名、是否需要解析,以及配置中的 DNS 设置,都会影响可参与匹配的信息。命中 PROXY 只表示选用了代理策略,不表示后续连接一定成功。
2. 规则行格式:关键字、条件与策略
常见规则行由英文逗号分隔。DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP 与 IP-CIDR 都需要匹配条件和策略;FINAL 没有匹配条件,只跟策略。规则放在配置的 [Rule] 段,不要把它们写进 [General] 或 [Host]。
[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,example,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,DIRECT
上述配置把 login.example.com 作为先行例外,其余 example.com 范围交给 PROXY。关键字规则覆盖更广,只是用来展示格式;实际配置不需要同时写入所有类型。PROXY 与 DIRECT 是策略,不是协议名。Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuard 等协议的连接参数应在已有连接配置中核对,不能填入规则行的策略位置。
- DIRECT:目标请求按直连策略处理,仍受当前网络、目标服务与 DNS 状况影响。
- PROXY:请求交给代理策略,测试时需要确认该策略对应的已有连接可用。
- REJECT:拒绝匹配的请求;若配置中存在此类规则,也应纳入顺序核对。
- 自定义策略:如果引用策略组名称,名称必须与配置中实际定义的名称一致,不能把描述性文字当成已存在的策略。
条件中只写规则需要的内容。域名规则填写域名,不加 https://、路径、查询参数或 :443。例如 https://example.com/account 的域名条件是 example.com;这六类规则不能凭 URL 路径区分同一网站的不同页面。
3. DOMAIN、DOMAIN-SUFFIX 与 DOMAIN-KEYWORD
DOMAIN 精确匹配一个完整域名;DOMAIN-SUFFIX 匹配指定域名及其子域名;DOMAIN-KEYWORD 则检查域名是否包含给定字符串。三者匹配范围依次不同,不能用“都包含 example”来理解。尤其是 DOMAIN-SUFFIX 会考虑域名边界,而 DOMAIN-KEYWORD 不是后缀边界匹配。
| 规则条件 | 会匹配 | 不会匹配 |
|---|---|---|
DOMAIN,example.com | example.com | www.example.com |
DOMAIN-SUFFIX,example.com | example.com、api.example.com | notexample.com、example.com.other.test |
DOMAIN-KEYWORD,example | example.com、myexample.test | sample.test |
只指定网站的一个主机时使用 DOMAIN;希望覆盖主域名与多级子域名时使用 DOMAIN-SUFFIX。DOMAIN-KEYWORD 适合确实需要字符串覆盖的情况,但也可能包含无关域名,因此不宜仅为少写几行就替换后缀规则。DOMAIN-SUFFIX 的条件不需要写成 *.example.com,直接写 example.com。
[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
在这一示例中,api.example.com 先命中 DOMAIN,所以走 DIRECT;www.example.com 命中第二行,所以走 PROXY。如果交换前两行,后缀规则会先接住 api.example.com,精确规则便不能作为例外生效。网页还可能加载独立的图片、登录或接口域名,需要分别检查这些请求,不能只用地址栏中的主域名代表整页流量。
4. GEOIP 与 IP-CIDR:根据目标 IP 匹配
GEOIP 根据目标 IP 在应用使用的地理信息数据库中的归属匹配,例如 GEOIP,CN,DIRECT。这里的 CN 是国家代码,不表示域名后缀或内容所属地区。数据库的归属结果也不是物理位置的实时证明,不能仅凭页面显示中文就预期它会命中 CN。
IP-CIDR 判断目标 IPv4 地址是否落在指定网段。192.168.0.0/16 表示从 192.168.0.0 到 192.168.255.255 的范围;/32 表示单个 IPv4 地址。下列地址均用于语法说明,不是服务端地址推荐。
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,203.0.113.7/32,PROXY,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
- 已有 IP:请求目标已经是 IP 时,可以直接判断网段或数据库归属,不必把它当作域名匹配。
- 域名目标:IP 类规则可能需要解析后才能判断,因此 DNS 结果会影响匹配。若域名先命中前面的域名规则,后面的 IP 规则不再改变这一结果。
- no-resolve:表示不要为了这条 IP 规则主动解析域名;它不是关闭所有 DNS,也不是忽略已经可用的目标 IP。
- 地址族:IP-CIDR 用于 IPv4,IPv6 网段使用 IP-CIDR6。仅写 IPv4 网段不会自然覆盖目标的 IPv6 地址。
示例末行采用 FINAL,PROXY,与前面 FINAL,DIRECT 的目的不同:它让未匹配请求走代理。选择哪一种兜底策略取决于自己的分流目标。实际验证时,应同时记录请求域名、目标地址和最终策略,避免将 DNS 返回了另一个地址的现象归因于 CIDR 写法。
5. FINAL 兜底与配置验证步骤
FINAL 匹配到达它的其余请求,应放在规则末尾。它不是“默认规则优先级最低”的自动设置,而是顺序中的一行:若放在前面,后面的规则就没有机会接住请求。只让指定域名走代理时,可以采用域名规则加 FINAL,DIRECT;其余请求也要走代理时,则使用 FINAL,PROXY。
-
保存原配置
进入 Config,先确认当前启用的文件,保留修改前的副本。记录原有的 [Rule] 顺序,避免只保留测试规则而丢失已有例外。
-
写入测试规则
打开这份配置的编辑入口,在 [Rule] 中添加需要的规则。把 DOMAIN 例外放在 DOMAIN-SUFFIX 之前,最后保留一条符合目标的 FINAL,并保存。
-
核对路由
回到 Home → Global Routing → Config,并在 Config 核对选中的文件。确认 Home 中代理策略使用的是自己已有且可连接的服务端。
-
发起新请求
重新建立连接后访问测试目标,避免沿用修改前建立的长连接。在应用的请求记录中核对目标与实际策略;已缓存的网页不能证明新规则生效。
-
核对兜底
再访问一个不在域名列表中的目标,检查是否进入 FINAL 指定的策略。如果结果不同,依次查看前置规则、目标 IP 和当前配置,不要立即增加更宽的关键字规则。
对第三节的三行示例,预期是 api.example.com 使用 DIRECT、www.example.com 使用 PROXY、其他未匹配目标使用 DIRECT。这些是规则推导结果,不是对示例域名进行联网实测的报告。换成自己要配置的真实域名后,再用请求记录验证;单独一次延迟测试只检查连接能力,不能证明某个网页命中了哪条规则。
6. 规则未生效与连接报错的区分
先分清两类问题:请求采用了错误策略,属于路由姿态、配置选择、规则条件或顺序的检查范围;请求已经采用预期策略却连接失败,则应检查目标服务与已有服务端的连接参数。规则只决定如何处理请求,不会修复服务端端口错误或不可达的问题。
报错:Connection refused
原因与解法:这是底层连接可能返回的拒绝错误,通常与目标端口未监听或明确拒绝连接有关。先核对请求实际使用的策略;若为 PROXY,再对照自己的服务商资料检查服务器地址与 Port,例如资料明确写 443 时应填写 443,而不是凭常见端口猜测。
报错:Operation timed out
原因与解法:这是底层操作可能返回的超时错误,表示操作未在等待时间内完成,不等于规则语法错误。先在 Home 测试已有连接,再查看请求目标与策略,分别检查当前网络、目标可达性以及服务端是否可用;应用记录的完整措辞可能随错误来源不同而变化。
写了 DOMAIN-SUFFIX,为什么还是直连?
先到 Home → Global Routing 选择 Config,再确认 Config 中启用的是刚保存的文件。然后从 [Rule] 顶部检查是否存在先命中的 DIRECT 或 FINAL;条件只保留域名,不带协议、路径和端口。
想让一个子域名直连,怎样不影响其他子域名?
把 DOMAIN,api.example.com,DIRECT 放在 DOMAIN-SUFFIX,example.com,PROXY 前面。保存后发起新请求,分别核对 api.example.com 与另一个子域名的策略,不要只测试其中一个。
网页能打开,为什么部分图片仍加载失败?
查看失败请求的真实域名,而不只看页面地址。图片可能来自独立域名,也可能已经命中 PROXY 但连接失败。确认请求记录后再决定是否添加 DOMAIN 或 DOMAIN-SUFFIX,避免用过宽的 DOMAIN-KEYWORD 覆盖无关目标。
更新订阅后,自己写的规则会一起改变吗?
先区分 Home 中连接资料的订阅与 Config 中规则文件的更新。更新已有连接订阅不等于编辑当前 [Rule];如果当前配置文件本身来自远程更新,更新后应再次核对文件内容,并把自定义修改保留在可控的副本中。
排查时一次只修改一个条件,并保留修改前后的规则行与请求结果。按“当前配置、Global Routing、命中顺序、域名或 IP、连接参数”的次序检查,可以把分流判断与网络连接问题分开。需要配置入口的完整说明时,可继续阅读站内使用教程;协议参数的核对位置见协议参考。