本文适合已经在 Shadowrocket(小火箭)中配置好自己已有服务、准备调整规则分流的用户。先确认 Global Routing 使用 Config,再区分域名规则与 IP 规则,最后用命中记录验证顺序。文中配置片段只说明语法,不替代完整配置,也不提供节点或订阅。
先确认规则是否参与路由
规则决定某条连接采用哪种策略,不负责创建可用的代理服务。即使写好了 DOMAIN-SUFFIX,example.com,PROXY,也仍需已有可用的代理配置。本文以用户已经有自己的服务商与订阅为前提,重点是检查配置中的 [Rule] 部分。
在 Home → Global Routing 中,Proxy、Direct、Config、Scene 不是同一种工作方式。Proxy 与 Direct 适合临时对照测试;验证当前配置中的规则时,应选择 Config。Scene 用于按场景切换路由行为,不能仅凭显示 Scene 就断定某份规则正在生效。
-
备份配置
进入 Config,确认当前正在使用的配置文件,先保存副本。记录原来的 Global Routing 选择,避免测试后无法恢复。
-
选择规则模式
回到 Home → Global Routing → Config。随后检查 Config 中启用的文件是否就是准备修改的那一份。
-
修改单条规则
在 Config 中打开该文件的编辑功能,定位
[Rule],一次只新增或调整一条规则。保留原有其他配置段。 -
保存后验证
保存配置,重新建立测试连接,查看连接记录中的目标、命中规则与采用的策略。若旧连接仍在复用,先关闭对应页面再重新访问。
域名规则:完整匹配、后缀匹配与子串匹配
常见规则按“类型、匹配值、策略”书写,字段之间使用英文逗号。域名匹配值只写主机名,不带 https://、路径、查询参数或端口。访问 https://api.example.com:443/v1 时,域名规则处理的是 api.example.com,不是整段地址。
| 关键字 | 示例 | 匹配范围 |
|---|---|---|
DOMAIN | DOMAIN,api.example.com,PROXY | 只匹配 api.example.com,不包括其子域名。 |
DOMAIN-SUFFIX | DOMAIN-SUFFIX,example.com,DIRECT | 匹配 example.com 及其子域名,不匹配 notexample.com。 |
DOMAIN-KEYWORD | DOMAIN-KEYWORD,example,PROXY | 匹配域名中包含 example 的目标,覆盖范围比后缀规则更宽。 |
DOMAIN-SUFFIX 通常不需要在前面加点,也不需要写成 *.example.com。后缀匹配已经包含域名本身与其子域名。把星号写进普通后缀字段,并不能按预期创建一个通配表达式。
DOMAIN-KEYWORD 适合明确需要子串匹配的场合,不能当作精确域名规则的简写。例如关键字 example 也可能匹配 example-news.test。若只希望覆盖一个站点及其子域名,优先使用 DOMAIN-SUFFIX;只处理一个主机时使用 DOMAIN。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
DOMAIN-KEYWORD,example,PROXY
FINAL,DIRECT
上例中,api.example.com 使用 PROXY;www.example.com 使用 DIRECT;example-news.test 才会继续命中关键字规则。这些保留域名只用于讲解语法,不保证对应网页可访问。
IP-CIDR 与 GEOIP:匹配地址,不匹配网址
IP-CIDR 按 IPv4 地址段匹配。192.168.0.0/16 表示覆盖从 192.168.0.0 到 192.168.255.255 的地址范围。单个 IPv4 地址可用 /32 表示。这里的前缀长度描述网络范围,不是端口号。
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
IP-CIDR,203.0.113.8/32,PROXY,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
片段中的 203.0.113.8 是文档示例地址,不是可用服务地址。no-resolve 表示不要仅为了匹配这条 IP 规则而主动进行域名解析;它不表示整个应用停止 DNS,也不表示所有经过该规则的请求都不需要解析。如果目标地址已经可用,仍可参与地址匹配。
| 写法 | 判断依据 | 需要注意 |
|---|---|---|
IP-CIDR,192.168.0.0/16,DIRECT | 目标 IPv4 地址是否落在该地址段。 | 不要将网页路径或端口写入地址段字段。 |
GEOIP,CN,DIRECT | 目标 IP 在所用地理数据库中的归属。 | 不以网页内容、域名后缀或用户所在位置为判断依据。 |
FINAL,PROXY | 此前规则均未命中。 | 没有匹配值字段,直接填写策略。 |
GEOIP 的结果取决于 IP 地理数据库。一个域名可能因 CDN、DNS 应答或网络环境变化而对应不同地址,因此同一域名的 GEOIP 结果可能变化。如果目标必须固定采用某种策略,通常应在 GEOIP 前写清楚域名规则,而不是仅依赖地址归属。
从上到下匹配,FINAL 放在最后
对本文这些常规规则,同一条连接按规则排列顺序检查,命中后采用对应策略,并不会继续寻找“看起来更精确”的下一条。规则类型本身没有自动优先级;把精确的 DOMAIN 写在宽泛的 DOMAIN-SUFFIX 之后,可能导致它永远没有机会生效。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
- 先写例外:
api.example.com是 example.com 下需要单独处理的主机,所以放在后缀规则前。 - 再写范围:其余 example.com 及子域名采用 DIRECT,不再进入后面的 IP 判断。
- 最后写兜底:
FINAL,PROXY接住尚未匹配的连接。若把它移到第一行,后面的常规规则就失去匹配机会。
DIRECT 表示直接连接目标,不等于“绕过所有系统网络条件”;PROXY 表示交给代理路径,也不等于“连接一定成功”。如果策略位置填写自定义策略组名称,该名称必须与配置中已有定义完全一致。本文只使用 DIRECT 与 PROXY,避免引入未定义的组名。
规则不生效时,分开检查匹配与连接
“网页打不开”不能直接证明规则写错。先看请求是否命中预期规则,再看该策略能否建立连接。若命中记录已经显示 PROXY,但请求仍然失败,应检查已有代理服务及其连接参数;继续增加同类域名规则通常不会解决传输问题。
- 确认 Home → Global Routing → Config,且编辑文件与 Config 当前启用文件一致。
- 使用同一个完整地址发起新请求,记录实际主机名。网页跳转、图片和接口可能使用不同域名,应逐条检查。
- 检查命中行是否被更靠前的 DOMAIN-SUFFIX、DOMAIN-KEYWORD 或 FINAL 截住。
- 若命中正确,临时对照 Proxy 与 Direct 的访问结果,测试完恢复 Config。一次只改一个条件。
下面的错误标识来自 Apple 网络错误体系,只在诊断信息确实出现相应原文时使用。它们表示网络请求失败的类别,不是 Shadowrocket 规则解析器的语法报错,也不能单凭错误码确定责任环节。
报错:NSURLErrorDomain Code=-1001
原因与解法:请求在时限内未完成。先核对命中规则与实际采用的策略,再用同一目标对照 Proxy、Direct,并检查本地网络;不要把超时直接等同于 FINAL 写错。
报错:NSURLErrorDomain Code=-1003
原因与解法:系统无法找到指定主机。先检查请求域名拼写与 DNS 解析结果,再核对 DOMAIN 字段是否误填了网址路径;新增 GEOIP 规则不能替代域名解析排查。
常见文本误写还包括中文逗号、把 FINAL,PROXY 写成三字段格式、将 https://example.com 放进 DOMAIN-SUFFIX,以及使用不存在的策略组名。保存前逐行对照字段,不要一次替换整份配置。若配置由远程来源维护,还应确认后续更新是否会覆盖本地修改,并保留可恢复的副本。
常见问题:改一条规则后如何确认结果
已经写了 DOMAIN,为什么子域名没生效?
DOMAIN 只匹配完整主机名。要同时覆盖 example.com 和 api.example.com,使用 DOMAIN-SUFFIX,example.com,DIRECT;若 api.example.com 需要例外策略,把对应 DOMAIN 放到它前面。
只想处理 HTTPS,域名后面加 :443 可以吗?
不要在本文的域名规则字段中加 :443。DOMAIN 与 DOMAIN-SUFFIX 依据主机名匹配,不区分该主机使用 80 还是 443 端口。先用纯域名规则验证,再按实际需求查阅端口相关规则说明。
改成其他协议后,规则也要重写吗?
Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuard 描述的是代理连接方式,不是域名匹配类型。若策略引用仍然有效,通常不必因协议变更重写 DOMAIN-SUFFIX;应单独核对对应服务的地址、端口和认证参数。
更新已有订阅,会自动得到正确规则吗?
不要将代理列表更新与 Config 规则更新混为一谈。更新已有订阅后,回到 Config 检查当前文件,再到 Home → Global Routing 确认 Config。是否包含规则、是否覆盖本地内容,取决于导入内容的类型与更新方式。
最终验收应包含三个结果:请求的真实主机名正确、命中的规则行正确、采用的策略符合预期。随后再验证页面与接口能否完成请求。这样可以将“规则选择错误”与“选中路径不可用”分开处理,避免靠反复切换来碰运气。