写规则先确定匹配对象,再确定出站策略,最后检查顺序。本文适合已经在 Shadowrocket(小火箭)中添加自己已有服务器、准备编辑 Config 的用户;读完可以区分域名规则与 IP 规则,写出带 FINAL 的最小规则段,并按连接记录验证是否命中预期条目。所有示例域名和保留地址仅用于解释语法,不是可用的连接服务。
一、规则的生效前提与匹配顺序
规则写在配置文件的 [Rule] 段中。对本文列出的普通规则,按自上而下的顺序检查,命中后采用该条指定的策略,不会继续寻找后面“更精确”的条目。因此,例外条目应放在宽泛条目前,FINAL 应放在末尾。
开始测试前,在 Home → Global Routing 选择 Config,并确认 Config 中当前启用的文件就是刚修改的文件。选择 Proxy 或 Direct 时,不应再用本文的逐条规则结果解释所有请求;Scene 涉及场景选择,也不适合作为最小规则测试的起点。
规则负责决定流量如何处理,不负责补齐服务器参数,也不保证目标可达。即使命中了 PROXY,自己的服务器仍可能因地址、端口或认证参数不正确而连接失败。测试时应分别记录“匹配了什么”与“连接是否成功”。
二、DOMAIN、DOMAIN-SUFFIX 与 DOMAIN-KEYWORD
域名规则的基本形式是 规则类型,匹配内容,策略,使用半角逗号分隔。这里的匹配内容是主机名,不是完整 URL;不要把 https://、路径、查询参数或 :443 填进域名字段。连接到同一主机的不同网页路径,不能靠这三种规则区分。
| 规则 | 匹配范围 | 不匹配的例子 |
|---|---|---|
DOMAIN,example.com,DIRECT | 仅完整主机名 example.com | www.example.com |
DOMAIN-SUFFIX,example.com,PROXY | example.com 及其子域名,例如 img.example.com | notexample.com |
DOMAIN-KEYWORD,example,REJECT | 域名中含有 example 字符串的目标 | sample.test |
DOMAIN-SUFFIX 按域名层级匹配,通常最适合表达“这个域名及其全部子域名”。不要写成 *.example.com;此处直接填写 example.com。DOMAIN-KEYWORD 的范围更宽,例如也可能匹配 myexample.test,应确认不会误伤无关目标。
[Rule]
DOMAIN,account.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
在这个独立示例中,account.example.com 先命中第一条而使用 DIRECT;img.example.com 命中第二条而使用 PROXY。若调换前两行,账户子域名会先命中后缀规则,后面的精确规则便没有机会生效。这是“规则顺序”问题,不是 DOMAIN 的优先级低于 DOMAIN-SUFFIX。
结论:先写例外,再写范围
同一域名体系内需要不同策略时,把具体主机的 DOMAIN 放在 DOMAIN-SUFFIX 前面;只有明确需要字符串匹配时才使用 DOMAIN-KEYWORD。
三、IP-CIDR、GEOIP 与 no-resolve
IP-CIDR 匹配目标 IPv4 地址所属的网段,不匹配网页名称。斜杠后的数字是前缀长度:/32 表示单个 IPv4 地址,/24 表示一个包含 256 个地址的网段。这里的地址数包含网络地址等,并不等于可用服务器数量。
IP-CIDR,192.0.2.8/32,DIRECT,no-resolve
IP-CIDR,198.51.100.0/24,REJECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
上面的 192.0.2.8 与 198.51.100.0/24 是文档保留地址,仅演示格式。no-resolve 表示不为匹配这条 IP 规则额外触发域名解析;如果匹配阶段已经有可用目标 IP,仍可据此判断。它不是关闭全部 DNS,也不是“域名和 IP 都自动匹配”的开关。
- 直接访问 IP:目标地址可直接参与 IP 规则匹配,不需要先从域名取得地址。
- 访问域名:是否能命中 IP 规则与匹配时可用的 IP 信息、DNS 行为和
no-resolve有关,不能只看域名后缀推断。 - GEOIP:
GEOIP,CN,DIRECT根据所用地理数据库对目标 IP 的归类匹配,不表示所有中文网站,也不表示所有以.cn结尾的域名。 - 地址变化:同一域名可能解析到不同地址;使用固定
IP-CIDR时,需要确认网段仍覆盖实际目标。
如果目的是让某个确定的站点采用指定策略,优先写明确的域名规则通常更容易验证。若目的是管理某个已知地址或网段,再使用 IP 规则。地理数据库的归类与服务实际部署可能有差异,不能把 GEOIP 当成网站身份的证明。
四、PROXY、DIRECT、REJECT 与 FINAL 的区别
规则末尾的策略回答“命中之后怎么处理”。PROXY 表示使用代理出站,实际服务器还取决于当前选择及相关配置;DIRECT 表示直接连接目标;REJECT 表示拒绝该请求。它们不是三种协议,不能用来替代服务器中的 Type、地址或端口。
| 写法 | 含义 | 验证重点 |
|---|---|---|
DOMAIN,example.com,PROXY | 该主机使用代理出站 | 命中规则后,核对实际使用的服务器 |
DOMAIN,example.com,DIRECT | 该主机使用直接连接 | 当前网络能否直接访问目标 |
DOMAIN,example.com,REJECT | 拒绝该主机的请求 | 拒绝是否符合原本意图 |
FINAL,PROXY | 前面未命中的请求使用 PROXY | 兜底策略是否符合预期 |
FINAL 没有“匹配内容”字段,形式是 FINAL,策略,不要写成 FINAL,example.com,PROXY。放在中间会提前承接剩余请求,使后面的普通条目无法按预想工作。兜底选 DIRECT 还是 PROXY 取决于自己的使用目标,不存在适合所有配置的固定答案。
五、在 Config 中保存并验证最小配置
先保留原配置副本,再修改本地测试文件。不要把下面的规则段直接覆盖到完整配置文件的所有内容上;它只展示 [Rule] 部分。若原文件已有该段,应在同一段内调整,避免重复创建多个 [Rule] 段造成理解混乱。
-
保留副本
进入
Config,确认当前启用的文件,先备份其内容,再准备单独的本地测试配置。记录原来的 Global Routing 选择,便于测试后恢复。 -
编辑规则
在
Config打开测试文件的编辑入口,定位[Rule],填入下方最小示例。检查逗号、字段数量以及 FINAL 的位置,然后保存。 -
启用配置
在
Config选用已保存的测试文件,再到Home → Global Routing → Config。确认 Home 中选中的是自己已有且参数正确的服务器。 -
新建请求
重新发起目标连接,在应用的连接记录中核对目标、匹配规则和使用的策略。已有长连接不适合用来验证刚修改的规则,必要时关闭目标应用后重新打开。
-
逐条增加
确认最小配置行为符合预期后,每次只增加一条规则并重复验证。若结果发生变化,先回退刚增加的一条,而不是同时改动 DNS、服务器和多组规则。
[Rule]
DOMAIN,account.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.8/32,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
这个示例的预期顺序是:账户子域名先走 DIRECT,其余 example.com 子域名走 PROXY,之后才检查地址规则和 GEOIP,最终由 FINAL 兜底。示例域名用于推演匹配;做实际连接测试时,应换成自己有权访问、且明确知道主机名的目标。
- 保留测试记录:至少写下目标主机、命中条目、实际策略与连接结果四项。
- 区分主机:一个页面可能同时请求图片、登录和接口等不同主机;主页命中预期不等于所有附属请求都使用同一策略。
- 检查覆盖:如果配置来自远程更新,确认更新是否会替换本地修改,并单独保留自定义内容。
六、规则不生效与 timeout 的排查顺序
“页面打不开”不是规则语法错误的充分证据。先核对当前文件与 Global Routing,再看实际目标和命中规则,最后检查出站连接。不要看到连接失败就立即把全部规则改为 PROXY,否则会失去区分匹配问题与连接问题的依据。
报错:timeout
原因:连接测试或请求在等待时间内没有完成;仅凭这个结果,无法判断是规则、目标网络还是所用服务器造成。
解法:先核对该请求实际命中的策略;若为 PROXY,再用 Home → Connectivity Test 检查当前服务器,并核对自己的地址、端口与认证参数。
| 现象 | 优先检查 | 调整方式 |
|---|---|---|
| 所有请求都使用同一种出站 | Home → Global Routing 是否为 Config | 回到 Config 姿态,再检查当前启用的文件 |
| 精确域名条目没有命中 | 前面是否有后缀或关键字规则 | 将需要优先执行的精确条目前移 |
| 后半段规则始终没有效果 | FINAL 是否被放在中间 | 将 FINAL 移到普通规则之后 |
| 主页面正常,图片或接口失败 | 失败请求是否属于另一个主机名 | 按实际目标补充规则,不只依据地址栏判断 |
| IP 规则没有按预期命中 | 实际目标地址、网段及 no-resolve | 核对匹配时可用的地址信息,不把域名归属当成 IP 归属 |
最后检查文本本身:使用半角逗号,保留 DOMAIN-SUFFIX 等关键字原文,不把说明文字粘进规则行。DOMAIN 等三字段规则与 FINAL 的字段数量不同;如果增加了命名策略,还要确保引用名称在当前配置中确实存在。恢复原配置后行为恢复正常,可以作为缩小修改范围的线索,但仍应通过逐条回退定位具体原因。