Shadowrocket(小火箭)的规则如何决定连接去向?先确认 Home → Global Routing 使用 Config,再理解“匹配条件、策略、先后顺序”三个要素。本文适合已有自己的服务商与订阅、准备调整配置的用户;读完可以区分域名规则和 IP 规则,写出范围明确的例外,并通过请求记录判断改动是否生效。
规则在哪种模式下生效?先核对 Global Routing
规则写对了就一定会使用吗?不一定,先检查 Home → Global Routing。本文讨论的是 Config 模式:连接按当前选中的配置进行规则匹配。若切到 Proxy 或 Direct,不能再用本文的逐条匹配结果解释全部连接;Scene 则需按所选场景的实际设置核对。
| 模式 | 基本用途 | 测试前要确认什么 |
|---|---|---|
| Config | 按当前配置中的规则分流。 | Config 中选中的文件是否就是刚修改的文件。 |
| Proxy | 以代理方式处理连接。 | 当前选择的服务器及连接参数是否有效。 |
| Direct | 以直接连接方式处理连接。 | 当前网络能否直接访问目标。 |
| Scene | 按场景设置决定连接行为。 | 正在使用哪个场景、场景中配置了什么。 |
规则能补齐服务器信息吗?不能。规则只负责选择连接策略,不生成连接服务,也不修复服务商参数。本文以已有可用连接为前提,不提供、不销售、不推荐节点、订阅或服务商资源。修改前先保留原配置,避免把连通性问题和分流问题混在一起。
一行规则怎么读?先拆开匹配条件和策略
逗号前后分别是什么?普通规则通常按照“规则关键字、匹配值、策略”的结构书写。下面第一行要求目标域名精确等于 example.com 时使用 DIRECT;第二行的 FINAL 没有匹配值,直接指定兜底策略。
[Rule]
DOMAIN,example.com,DIRECT
FINAL,PROXY
DIRECT 与 PROXY 是域名吗?不是,它们在这里是策略。DIRECT 表示直接连接;PROXY 表示使用代理策略,其实际出站还需核对当前服务器选择。若使用自己配置中的策略组名,名称必须与配置中实际定义的名称一致,不能只在规则末尾写一个未定义的名字。
这些片段能直接覆盖现有配置吗?不能把规则片段当作完整配置使用。[Rule] 是规则段标记;编辑已有文件时,应在现有规则段内调整条目,保留其他配置段。本文的 example.com 与文档示例 IP 只用于解释语法,不是可用服务地址。
DOMAIN 与 DOMAIN-SUFFIX 有什么区别?比较匹配边界
只让一个主机走指定策略该选什么?用 DOMAIN;希望主域名及其子域名一起处理,使用 DOMAIN-SUFFIX。后缀匹配遵守域名标签边界,并不是把任意包含这段字符的域名都算进去。
| 规则 | 会匹配的目标 | 不会匹配的目标 |
|---|---|---|
DOMAIN,example.com,DIRECT | example.com | api.example.com |
DOMAIN-SUFFIX,example.com,DIRECT | example.com、api.example.com | notexample.com |
DOMAIN-KEYWORD,example,DIRECT | example.com、notexample.com | sample.test |
为什么不直接用 DOMAIN-KEYWORD?它按域名中的关键字匹配,范围比域名后缀更宽,容易把名称相似但并不属于同一域名体系的目标一起处理。已知完整域名时优先选择 DOMAIN 或 DOMAIN-SUFFIX;只有确实需要字符包含关系时,才考虑关键字规则。
GEOIP 与 IP-CIDR 匹配什么?区分地区库和地址段
GEOIP,CN,DIRECT 依据什么识别地区?它依据目标 IP 在 GeoIP 数据中的归属进行匹配,不依据网页文字、域名后缀或设备所在地。数据归属可能与服务的实际部署认知不同,因此应以请求使用的目标 IP 和应用中的命中结果为准。
IP-CIDR,198.51.100.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
/24 是端口号吗?不是,它是 IPv4 前缀长度。198.51.100.0/24 覆盖从 198.51.100.0 到 198.51.100.255 的地址;198.51.100.23/32 只匹配一个 IPv4 地址。这里使用的是文档示例地址段,实际配置应填写自己明确需要匹配的目标网段。
- 已知固定网段:使用
IP-CIDR表达地址范围,不把域名写到它的第二个字段。 - 需要按地区分流:使用
GEOIP,并接受 IP 归属数据及目标地址变化带来的影响。 - 遇到 IPv6 目标:应核对
IP-CIDR6等对应规则;一条 IPv4 网段规则不会覆盖 IPv6 地址。 - 使用 no-resolve:它用于避免为了该 IP 规则主动触发域名解析;不要把它理解为关闭应用全部 DNS 功能。
为什么加上 no-resolve 后有些域名请求不命中?如果匹配阶段没有可用的目标 IP,该规则又不主动解析域名,就可能继续检查后面的规则。需要稳定按某个域名分流时,优先写域名规则;不要为了让 IP 规则命中而随意更换全部 DNS 设置。
多个规则都符合时选谁?先命中的规则优先
更精确的规则一定自动优先吗?不会。对本文这些普通规则,应按自上而下的顺序理解:先命中哪一条,就采用哪一条指定的策略。把单个主机的例外放在宽范围规则前面,才能得到预期结果。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,198.51.100.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
api.example.com先命中第一条,使用PROXY,不再由第二条改成DIRECT。www.example.com不符合第一条,但符合第二条,因此使用DIRECT。- 目标地址为
198.51.100.23且未被前面的域名规则处理时,可命中示例网段规则。 - 前面都没有匹配时,继续检查
GEOIP;仍未匹配的连接交由FINAL。
FINAL 能写在第一行吗?语法结构虽简单,但把它放到前面会提前兜底,使后面的普通规则没有匹配机会。通常应将其保留在规则段末尾。它不是“连接失败后再试另一条”的重试设置:命中规则后连接失败,不代表会自动改用下一行策略。
改完如何确认生效?一次只验证一个目标
保存后网页能打开,就证明规则正确吗?不能,直接连接和代理连接都可能成功。验证要同时检查当前配置、Global Routing、请求目标与最终策略,而不是只看网页能否加载。建议使用一个已知目标重复测试,减少多项改动之间的干扰。
-
保留原配置
进入 Config,记录当前选中的文件并保留可恢复副本。若文件来自远程配置,先确认更新是否会覆盖本地修改。
-
修改规则段
在 Config 中打开目标配置进行编辑,定位
[Rule]。先增加一条明确的DOMAIN规则,将它放在宽范围规则与FINAL前面。 -
确认模式
保存并确认选中该配置,返回 Home → Global Routing → Config。核对当前服务器仍是自己已有的可用连接。
-
新建请求
重新打开测试页面,并在应用的请求记录中查找相同时间的目标。必要时在不会中断重要任务的情况下重新连接,避免沿用已有长连接。
-
核对命中
检查记录中的目标域名或 IP、匹配规则及实际策略;具体显示字段以应用内为准。若结果不符,先找排在该规则上方的匹配项,再核对是否选错文件。
修改规则会改变已经建立的所有连接吗?不能这样假定。浏览器连接复用、页面缓存和应用长连接都可能让测试继续使用旧连接。应以新产生的连接记录为观察对象;测试结束后恢复必要设置,不要长期停留在为排错临时选择的模式。
命中正确却连不上?区分匹配问题与连接报错
请求记录显示策略正确,还需要继续改规则吗?先暂停改动,检查出站连接。下面是网络错误中常见的英文片段,完整前缀和显示位置可能不同;它们说明连接阶段的问题,不能单独证明某条域名规则写错。
报错:Connection refused
原因与解法:目标连接被拒绝,常见于地址或端口不对、服务未监听。先从请求记录确认被拒绝的是代理服务器连接还是目标连接,再核对 Home 中服务器地址、Port 与自己服务商提供的参数,不要把服务端口直接改成网页常用的 443。
报错:Operation timed out
原因与解法:连接或相关操作在限定时间内没有完成。先用 Home 中的 Connectivity Test 检查已有服务器,再核对当前网络、DNS 和请求实际采用的策略;只有记录显示误命中时,才调整相应规则。
怎样避免把故障范围越改越大?先按“服务器可用性、当前模式、目标解析、规则命中”的顺序排查,每次只改一个变量。不要同时替换 DNS、重排整段规则并更换服务器,否则即使恢复访问,也难以判断是哪项改动起了作用。
常见问答:规则更新、DNS 与 FINAL 怎么处理?
更新订阅以后,手写规则会跟着变吗?
先区分 Home 中的服务器订阅与 Config 中的远程配置。服务器订阅更新主要处理连接条目;远程配置更新可能替换配置内容。修改前在 Config 核对文件来源,更新后重新检查 [Rule] 和选中状态,不要假定两种更新作用相同。
为什么同一个网站会出现好几个域名?
页面可能分别请求主站、登录接口和资源域名。一条 DOMAIN 只覆盖指定主机;先从请求记录确认真正失败的目标,再添加必要规则。不要因为页面缺少一张图片,就直接写范围很大的 DOMAIN-KEYWORD。
FINAL,PROXY 是所有请求都走代理吗?
不是。它只处理到达该行、尚未命中前面规则的连接。若前面已有 DOMAIN-SUFFIX,example.com,DIRECT,对应域名会先采用 DIRECT。要判断实际去向,应从规则段顶部顺序检查。
IP-CIDR 命中不了,应该删掉域名规则吗?
先看是否已有更靠前的域名规则命中,再核对目标实际使用 IPv4 还是 IPv6,以及 no-resolve 是否使该行不主动解析。只有确认需要让网段规则优先时才调整顺序,不要为了单次测试删除所有域名规则。