Shadowrocket 规则怎么写:DOMAIN-SUFFIX、GEOIP、IP-CIDR、FINAL 匹配范围入门

用真实规则片段解释 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP、IP-CIDR、FINAL 各自匹配什么,以及自上而下的匹配顺序。

本文速览

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,DIRECTexample.comapi.example.com
DOMAIN-SUFFIX,example.com,DIRECTexample.com、api.example.comnotexample.com
DOMAIN-KEYWORD,example,DIRECTexample.com、notexample.comsample.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 地址。这里使用的是文档示例地址段,实际配置应填写自己明确需要匹配的目标网段。

为什么加上 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
  1. api.example.com 先命中第一条,使用 PROXY,不再由第二条改成 DIRECT。
  2. www.example.com 不符合第一条,但符合第二条,因此使用 DIRECT。
  3. 目标地址为 198.51.100.23 且未被前面的域名规则处理时,可命中示例网段规则。
  4. 前面都没有匹配时,继续检查 GEOIP;仍未匹配的连接交由 FINAL。

FINAL 能写在第一行吗?语法结构虽简单,但把它放到前面会提前兜底,使后面的普通规则没有匹配机会。通常应将其保留在规则段末尾。它不是“连接失败后再试另一条”的重试设置:命中规则后连接失败,不代表会自动改用下一行策略。

改完如何确认生效?一次只验证一个目标

保存后网页能打开,就证明规则正确吗?不能,直接连接和代理连接都可能成功。验证要同时检查当前配置、Global Routing、请求目标与最终策略,而不是只看网页能否加载。建议使用一个已知目标重复测试,减少多项改动之间的干扰。

  1. 保留原配置

    进入 Config,记录当前选中的文件并保留可恢复副本。若文件来自远程配置,先确认更新是否会覆盖本地修改。

  2. 修改规则段

    在 Config 中打开目标配置进行编辑,定位 [Rule]。先增加一条明确的 DOMAIN 规则,将它放在宽范围规则与 FINAL 前面。

  3. 确认模式

    保存并确认选中该配置,返回 Home → Global Routing → Config。核对当前服务器仍是自己已有的可用连接。

  4. 新建请求

    重新打开测试页面,并在应用的请求记录中查找相同时间的目标。必要时在不会中断重要任务的情况下重新连接,避免沿用已有长连接。

  5. 核对命中

    检查记录中的目标域名或 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 是否使该行不主动解析。只有确认需要让网段规则优先时才调整顺序,不要为了单次测试删除所有域名规则。

App Store 正版核验开发者与应用 ID