自定义规则需要同时满足三个条件:当前使用正确的 Config、Global Routing 采用 Config、例外规则位于宽泛规则与 FINAL 之前。本文适合已经有自己的服务器或订阅、需要调整分流行为的用户;按顺序完成备份、编辑、启用和验证,即可区分“规则没有命中”与“命中后连接失败”。
01 先确认 Config 模式,再修改规则
Shadowrocket(小火箭)的规则不是独立于运行模式的开关。在 Home 检查 Global Routing:要验证配置文件中的分流规则,应使用 Config。Proxy 与 Direct 分别用于整体采用代理或直接连接的路由姿态,不能用它们的访问结果判断自定义规则是否按预期生效。若当前使用 Scene,应先核对场景对应的实际路由安排,再进行规则测试。
Home 用于检查连接与服务器选择,Config 用于管理配置文件,Settings 用于查看应用设置。先在 Config 确认当前启用的文件,再进入该文件的编辑入口。不要只修改一个同名副本,却继续运行另一个配置。
- 保存当前配置的副本,记录原来的 Global Routing 和服务器选择。
- 在 Config 打开需要修改的配置,定位
[Rule]段。 - 先增加一条可辨认的测试规则,不同时替换整份规则。
- 保存并确认使用修改后的配置,回到 Home 将 Global Routing 设为 Config。
- 保持连接开启,再发起新的访问;旧连接不适合用于验证刚修改的路由。
02 规则自上而下执行,例外必须放在前面
一条规则通常由匹配类型、匹配值、策略组成,字段使用英文逗号分隔。例如 DOMAIN-SUFFIX,example.com,PROXY 表示将匹配到的域名交给 PROXY。规则按配置中的顺序检查,第一次匹配成功后就采用该条策略,不会继续寻找后面的“更精确”规则。
因此,“越精确越优先”是排列建议,不是自动排序机制。若希望 status.example.com 直接连接,而同一域名下的其他请求采用代理,精确的 DOMAIN 规则应排在 DOMAIN-SUFFIX 前面。
[Rule]
DOMAIN,status.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,PROXY
status.example.com命中第一条,采用 DIRECT。www.example.com不符合第一条,命中第二条,采用 PROXY。example.com本身也能命中第二条。- 不符合前两条的请求由最后的 FINAL 处理。
如果把前两条交换位置,status.example.com 会先命中 DOMAIN-SUFFIX,后面的 DOMAIN 规则就没有机会执行。示例中的域名仅用于解释语法,不能用它们是否提供网页来判断代理服务是否可用。
03 DOMAIN-SUFFIX、IP-CIDR 与 GEOIP 分别匹配什么
域名规则与 IP 规则处理的对象不同。DOMAIN-SUFFIX 按域名后缀匹配,不是任意字符串包含:example.com 与 img.example.com 符合条件,notexample.com 不符合。只想匹配一个完整主机名时,应使用 DOMAIN。
| 关键字 | 匹配对象 | 语法示例 | 检查重点 |
|---|---|---|---|
DOMAIN | 完整域名 | DOMAIN,status.example.com,DIRECT | 不包含协议、路径或端口 |
DOMAIN-SUFFIX | 域名及其子域名 | DOMAIN-SUFFIX,example.com,PROXY | 宽泛后缀应排在具体例外之后 |
IP-CIDR | IPv4 地址段 | IP-CIDR,192.0.2.0/24,DIRECT,no-resolve | 核对地址段与解析条件 |
GEOIP | IP 地理归属数据 | GEOIP,CN,DIRECT | 不是按域名后缀判断地区 |
FINAL | 前面均未命中的请求 | FINAL,PROXY | 放在全部例外之后 |
192.0.2.0/24 是文档示例地址段,覆盖 192.0.2.0 至 192.0.2.255,不是可直接使用的服务器地址。no-resolve 表示不为了这条 IP 规则主动发起域名解析;已有可用于匹配的目标 IP 时仍可进行判断。不要把它理解为关闭全部 DNS,也不要期望它在只有域名且没有可用 IP 的情况下强行命中。
GEOIP 依赖目标 IP 与归属数据,不能保证某一语言的网站、某一地区的域名后缀一定采用同一策略。使用共享基础设施的网站可能解析到不同地址。若需求是固定某个域名的路由,应优先写明域名规则,而不是依赖它当时解析到的地区。
04 PROXY、DIRECT、REJECT 与 FINAL 的职责
PROXY、DIRECT、REJECT 是规则执行的策略,FINAL 是规则类型,二者不是同一个层级。FINAL,PROXY 的含义是“没有前置规则命中时采用 PROXY”,并不表示 FINAL 自带代理能力。
- PROXY:交给代理策略处理。基础配置中需要确认 Home 中选择的服务器;使用策略组的配置还需核对组内实际选择,单独写 PROXY 不会创建服务器。
- DIRECT:直接连接目标,不经代理服务器转发;连接仍可能经过应用的隧道与规则处理,不能将 DIRECT 等同于关闭连接开关。
- REJECT:拒绝匹配的请求。它适用于明确需要阻断的目标,不应作为修复连接失败的通用设置。
按代理兜底的基础示例
- DOMAIN
- status.example.com,DIRECT
- DOMAIN-SUFFIX
- blocked.example.com,REJECT
- FINAL
- PROXY
先处理明确的直接连接与拒绝例外,其余请求采用代理策略。
按直接连接兜底的基础示例
- DOMAIN
- status.example.com,DIRECT
- DOMAIN-SUFFIX
- example.com,PROXY
- FINAL
- DIRECT
只有列出的匹配对象采用代理;未列出的请求直接连接。
以上是两种不同的路由目标,不应将两张卡合并复制。选择 FINAL 的策略之前,先回答“未写进规则的请求应该怎样处理”。如果将 FINAL 放在规则段前部,后面的例外规则将无法正常参与匹配;保留一条明确的末尾兜底规则,更便于检查。
结论:先确定默认路由,再增加例外
先用 FINAL 写明未匹配请求的去向,再把需要改变去向的域名或 IP 规则放到它前面;验证时一次只调整一条例外,避免无法判断是哪项修改改变了结果。
05 完整示例:从精确域名到末尾兜底
下面的配置片段用于阅读顺序练习,只展示 [Rule] 段。它不包含服务器定义,也不应覆盖已有配置中的其他段落。所有示例域名与地址均为文档用途,实际使用时应填写自己已确认的匹配对象。
[Rule]
DOMAIN,status.example.com,DIRECT
DOMAIN-SUFFIX,blocked.example.com,REJECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
FINAL,PROXY
- 先判断是否为
status.example.com,符合就直接连接。 - 再判断是否属于
blocked.example.com或其子域名,符合就拒绝。 - 接着处理其余
example.com域名请求,采用代理。 - 对于尚未命中且有可用目标 IP 的请求,检查示例地址段。
- 剩余请求采用最后的 PROXY 兜底。
第二条必须位于第三条之前,因为 blocked.example.com 同时符合这两条后缀规则。IP-CIDR 即使匹配范围不同,也不能推翻前面已经命中的域名策略。排列规则时应按“先处理明确例外,再处理宽泛集合”的思路阅读,而不是简单把所有同类关键字集中在一起。
06 验证规则:分开记录命中结果与连接结果
网页能否打开不是判断规则命中的唯一依据。命中 PROXY 后,仍可能因服务器不可达而失败;命中 DIRECT 后,也可能受当前网络限制;命中 REJECT 时,访问失败则可能正是预期结果。排查时应分别记录“使用了什么策略”和“策略执行后发生了什么”。
- 准备目标:选一个自己能够核对的真实完整域名,先记录修改前的访问情况,不使用示例地址做可用性测试。
- 固定环境:保持同一网络、同一服务器和同一 Config,确认 Global Routing 为 Config。
- 新建请求:保存规则后关闭旧页面或旧连接,再重新发起访问,避免连接复用影响观察。
- 查看记录:在应用的请求记录中核对实际域名、目标 IP、规则和策略等可见信息;记录项名称与展示内容以当前应用界面为准。
- 逐项调整:若命中错误,调整规则顺序;若命中正确却失败,再检查 DNS、代理服务器或直接连接路径。
一个页面可能请求多个域名:主文档、图片、接口与媒体资源可能分别命中不同规则。只为主站域名增加一条规则,并不保证所有相关资源采用同一策略。应从失败请求的实际主机名开始检查,不要仅根据浏览器地址栏中的域名扩大规则范围。
07 自定义规则常见问题
明明写了 DIRECT,为什么还是走 PROXY?
先在 Home 核对 Global Routing 是否为 Config,再确认 Config 中启用的是修改后的文件。随后从规则第一行向下检查:如果更靠前的 DOMAIN-SUFFIX 已经命中 PROXY,后面的 DIRECT 就不会执行。将精确例外移到宽泛规则之前,再用新请求测试。
FINAL,PROXY 会自动选择可用服务器吗?
不会。FINAL 只负责兜底匹配,PROXY 只指定代理策略。先确认已有服务器可连接;配置使用策略组时,还要检查组内选择与相应设置。仅修改末尾这一行不能修复错误的地址、认证信息或服务器状态。
加了 IP-CIDR,为什么访问域名时没有命中?
检查是否已被前面的域名规则命中,再核对目标实际解析出的 IP 是否属于该网段。若带有 no-resolve,这条规则不会为了匹配而主动解析域名。先根据请求记录确认目标 IP,再判断规则条件,不要仅根据网站名称推测地址。
订阅刷新后,自定义规则会一直保留吗?
先区分更新对象:服务器订阅主要管理服务器条目,远程配置更新可能替换配置内容。修改前保存副本,更新后到 Config 核对规则和启用状态。若自定义内容消失,先比较备份与当前文件,再恢复需要的条目,不要反复覆盖整份配置。