本文速览

本文适合已经在 Shadowrocket(小火箭)中导入自有服务、准备调整 Config 分流的用户。先确认当前配置与 Global Routing,再用一组保留域名示例理解规则顺序、策略动作和 FINAL,最后按请求记录验证命中结果。示例只说明语法,不提供连接服务。

一、规则生效前,确认 Config 与 Global Routing

自定义规则写在配置文件的 [Rule] 段中。开始编辑前,在底部 Config 页面确认当前使用的配置;打开另一份文件查看内容,不等于已经切换到该配置。先保留一份原配置,再编辑副本,便于出现解析错误或误拦截时恢复。

回到 Home,检查 Global Routing。按本文验证配置规则时使用 Config。Proxy 与 Direct 是全局路由选择,不能拿这两种状态下的访问结果判断某条自定义规则是否生效。如果当前使用 Scene,先确认其实际路由选择,排查期间可暂时固定为 Config,减少额外变量。

  1. 进入 Config,记录当前使用的配置名称,并保存原始内容。
  2. 编辑该配置的 [Rule] 段,保留其他段落的标题和必要设置。
  3. 保存后确认实际选中的仍是刚编辑的配置。
  4. 进入 Home → Global Routing,选择 Config,再建立新的测试请求。

二、自上而下匹配:位置先于“精确程度”

在同一份配置的规则列表中,请求按顺序检查;遇到第一条符合条件的规则,就采用它指定的策略,不再继续寻找后面的“更精确”规则。因此,精确域名通常放在较宽的后缀规则之前,例外规则放在通用规则之前,FINAL 放在最后。

请求信息 首条规则 逐条检查 首次命中 执行策略

下面是一个顺序错误的示例。访问 api.example.com 时,第一行的 DOMAIN-SUFFIX 已经命中,结果是 PROXY;后面的 DOMAIN 不会因为匹配范围更窄而自动获得更高优先级。

[Rule]
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN,api.example.com,DIRECT
FINAL,PROXY

如果目标是让该子域名单独直连,应交换前两行。这里的 example.com 是保留示例域名;请根据自己的实际目标编写规则,不要把示例当作可用性测试服务。

[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,PROXY

结论:把例外移到覆盖它的规则之前

修改策略后仍不生效时,先向上查找更宽的 DOMAIN-SUFFIX、地址网段规则或提前出现的 FINAL,而不是继续在列表末尾追加同一个域名。

三、DOMAIN-SUFFIX、IP-CIDR 与 GEOIP 分别匹配什么

域名规则与 IP 规则检查的对象不同。DOMAIN 检查完整域名,DOMAIN-SUFFIX 检查域名后缀,IP-CIDR 检查目标 IPv4 地址是否落在指定网段,GEOIP 则依据 IP 地理数据库判断目标地址所属地区。GEOIP 的 CN 指目标 IP 的归属判断,不是设备所在地,也不是所选服务器的所在地。

关键字语法示例匹配含义
DOMAINDOMAIN,api.example.com,DIRECT仅匹配该完整域名。
DOMAIN-SUFFIXDOMAIN-SUFFIX,example.com,PROXY匹配 example.com 及其子域名,不匹配 notexample.com。
IP-CIDRIP-CIDR,192.168.0.0/16,DIRECT,no-resolve匹配指定 IPv4 网段;此处为一个私有地址范围。
GEOIPGEOIP,CN,DIRECT依据目标 IP 的地理数据库结果匹配 CN。
FINALFINAL,PROXY处理此前规则均未匹配的请求。

no-resolve 表示不要仅为了尝试匹配这条 IP 规则而触发域名解析。它不等于关闭全局 DNS,也不会阻止应用访问域名时所需的正常解析。请求已有可用目标 IP 时仍可能参与地址匹配;不要据此认定所有域名请求都会跳过或命中该规则。

IP-CIDR 中的 /16 是前缀长度,不是端口。示例范围覆盖 192.168.0.0 至 192.168.255.255,并不代表全部私有地址。需要直连其他本地网段时,应按实际网络分别设置;域名规则本身也不区分 HTTPS 的 443 端口与 HTTP 的 80 端口。

3 种
本文策略动作:PROXY / DIRECT / REJECT
/16
示例私有网段的 IPv4 前缀长度
443
HTTPS 常用目标端口,不属于域名规则字段

四、PROXY、DIRECT、REJECT 与 FINAL 的关系

PROXY、DIRECT、REJECT 是规则命中后采取的策略。PROXY 交给当前代理选择处理;如果配置使用了自定义策略组,还需要核对组内选择。DIRECT 使用直连路径,不等于关闭系统 VPN。REJECT 拒绝该请求,适合明确需要阻断的目标,不应作为解析失败时的修复手段。

FINAL 是规则类型,不是第四种出站方式。它没有域名或网段条件,写法是 FINAL,策略,而不是照搬普通规则的三个字段。把 FINAL 提前放入列表,会让它之后的普通规则没有匹配机会。

按目标指定策略

PROXY
交给当前代理选择,需已有可用服务。
DIRECT
目标使用直连路径,仍受本地网络条件影响。
REJECT
拒绝请求;误命中会造成访问失败。

先确定目标应走哪条路径,再选择策略。

安排末尾兜底

FINAL,PROXY
未命中此前规则的请求交给代理处理。
FINAL,DIRECT
未命中此前规则的请求直连。
放置位置
置于规则列表末尾,前面保留明确的例外与通用规则。

兜底选择取决于预期路径,不是固定答案。

若希望“列出的域名走代理,其他请求直连”,可以让这些域名规则使用 PROXY,并用 FINAL,DIRECT 收尾。若希望“明确允许直连的目标直连,其余交给代理”,则反过来安排。两种结构都应先处理必要的本地访问例外,不能仅根据规则数量多少判断哪一种更合适。

五、一份可逐行推演的规则示例

下面的示例同时包含精确例外、拒绝项、域名后缀、私有网段、地区判断与兜底。它只展示排序,不是一份完整配置;已有配置中的 [General] 等内容应保留。使用前按实际目标调整,不要用这一段覆盖整份配置文件。

[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN,telemetry.example.com,REJECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
  • api.example.com:第一行命中,使用 DIRECT,不再检查后缀规则。
  • telemetry.example.com:第二行命中,使用 REJECT;这是语法演示中的人为选择,不表示对该域名用途的判断。
  • www.example.com:前两行未命中,第三行命中,使用 PROXY。
  • 目标 IP 为 192.168.1.20:在没有先命中域名规则的前提下,第四行可匹配该私有地址。
  • 其他目标:若 GEOIP 判断目标地址属于 CN,则 DIRECT;否则继续到 FINAL,使用 PROXY。

域名后缀规则位于 GEOIP 之前,意味着 example.com 的普通子域名会先按 PROXY 处理,不会再由目标 IP 的地区决定路径。这正是排序表达的意图:域名策略优先于后面的地区通用策略。若希望表达另一种意图,需要重新安排顺序,并检查是否影响已有例外。

六、用新请求与命中记录验证,而不只看页面能否打开

网页打开成功,只能说明这次访问完成,不能单独证明它使用了预期策略。网页还可能同时请求多个域名:主文档命中 DIRECT,静态资源却命中 PROXY 或 REJECT。检查时应在请求记录中定位具体目标,核对命中规则与最终策略,而不是只看 Home 中的连接开关。

  1. 固定环境:记录当前 Config、Global Routing 与所选代理,测试期间不要同时切换网络和策略。
  2. 发起新连接:保存配置后重新建立测试请求。已建立的长连接可能继续使用原路径,不宜拿它判断新规则。
  3. 核对目标:按真实请求的完整域名检查,不要只记录地址栏中的主站名称。
  4. 查第一条命中:如果结果不符,从列表顶端寻找先命中的规则,特别检查宽泛后缀与提前出现的 FINAL。
  5. 分离路径与可用性:命中 PROXY 后失败,继续检查所选服务与解析;命中 DIRECT 后失败,检查本地网络能否访问目标。
  6. 一次只改一项:只调整一条规则的位置或策略,保存并再次验证,最后记录生效结果。

结论:先证明命中正确,再排查连接失败

若记录显示目标已经命中预期规则,就暂时停止修改排序,把排查转向 DNS、目标地址与所选出站路径;只有命中不符时,才继续调整条件和位置。

如果规则来自远程维护的配置,更新后还应检查自定义行是否保留。服务器订阅更新与配置规则更新是不同操作,不能把“服务列表已刷新”理解成“当前规则已替换”。保留修改前后的内容和测试目标,可以在下次更新后重复验证同一组预期行为。

七、常见边界:改了规则仍然不符合预期

把规则加在 FINAL 后面,为什么没有作用?

FINAL 已经接住所有此前未命中的请求,后续普通规则没有机会执行。把自定义规则移动到 FINAL 之前,并继续检查它上方是否还有覆盖该目标的规则。

域名写了 DIRECT,为什么资源仍走 PROXY?

先确认资源是否请求了另一个域名。DOMAIN 只覆盖完整域名,DOMAIN-SUFFIX 也只覆盖对应后缀,不会自动包含页面引用的其他站点。根据实际请求记录分别判断,不要为解决单个资源问题直接放宽到过大的范围。

使用 REJECT 后页面空白,应该如何恢复?

先定位被拒绝的目标,临时移除对应规则或恢复备份,再用新请求复测。登录、验证码与静态资源可能依赖不同域名;只有确认阻断目标和影响范围后,才重新启用 REJECT。

切换 Shadowsocks、VMess 或其他协议,会改变规则优先级吗?

出站协议与规则列表的匹配顺序是两个层面。更换协议不会让靠后的 DOMAIN 自动超越靠前的 DOMAIN-SUFFIX。先确认规则选择了哪种策略,再检查该策略对应服务的连接条件。