Stash 规则配置教程
简答:Stash 规则配置的核心是编辑 YAML 配置文件中的 rules 字段:规则按从上到下依次匹配,先命中的规则生效,最后通常用 MATCH 作为兜底。少量规则可直接写入 rules,大量域名或 IP 规则建议先声明 rule-providers,再用 RULE-SET 引用。
定义:Stash 规则配置,是通过 YAML 配置文件中的 rules、rule-providers 等字段,按照域名、IP、端口或协议把网络请求分配给代理、直连或拒绝策略。
一、Stash 规则配置的基本逻辑
Stash 使用 YAML 格式配置文件。规则通常写在 rules 字段下,每行由规则类型、匹配条件和策略组成,例如 DOMAIN-SUFFIX,example.com,Proxy。Stash 会按照配置中的顺序从上到下匹配,某个请求命中第一条符合条件的规则后,就会使用该规则指定的策略。
策略名称必须与配置中的代理组或内置策略一致。常见策略包括 DIRECT、REJECT 以及配置文件中定义的代理组名称。为了避免请求没有匹配结果,通常在规则末尾增加 MATCH,Proxy 或 MATCH,DIRECT 作为兜底规则。规则匹配顺序和常见规则类型可参考Stash 规则类型文档。
例如,下面的配置表示:局域网地址直连,指定域名后缀使用代理,最后所有未匹配请求交给代理组:
rules:
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- DOMAIN-SUFFIX,example.com,Proxy
- MATCH,Proxy
注意:如果把 MATCH 放在前面,后面的规则通常就没有机会生效。因此,兜底规则应放在列表最后。
二、常用规则类型怎么选
| 规则类型 | 适用场景 | 示例 |
|---|---|---|
DOMAIN | 只匹配一个完整域名 | DOMAIN,api.example.com,Proxy |
DOMAIN-SUFFIX | 匹配域名及其子域名 | DOMAIN-SUFFIX,example.com,Proxy |
DOMAIN-KEYWORD | 域名中包含指定关键词 | DOMAIN-KEYWORD,video,Proxy |
IP-CIDR | 匹配 IPv4 或 IPv6 网段 | IP-CIDR,192.168.0.0/16,DIRECT |
GEOIP | 按目标 IP 的国家或地区匹配 | GEOIP,CN,DIRECT |
RULE-SET | 引用大量域名或 IP 规则 | RULE-SET,proxy-domain,Proxy |
MATCH | 匹配所有尚未命中的请求 | MATCH,Proxy |
DOMAIN 只匹配完整域名,例如它不会自动匹配对应的子域名;需要同时覆盖主域名和子域名时,通常使用 DOMAIN-SUFFIX。对于网段规则,如果不希望 Stash 为匹配而触发域名解析,可以在末尾加入 no-resolve。具体规则类型和参数以Stash 用户文档为准。
三、在 Stash 中导入或修改规则配置
- 准备配置文件。配置文件可以是本地 YAML 文件,也可以是服务提供方给出的远程配置地址。Stash 文档说明,iOS 端需要先导入 Stash 或兼容格式的配置文件,才能指定代理和网络策略。
- 导入配置。打开 Stash 的设置页面,进入
Configuration File,在配置列表中选择Download from URL,粘贴远程地址并下载;如果使用本地文件,可以通过系统文件分享或云盘打开并选择 Stash。 - 确认当前选中的配置。下载或导入后,检查配置列表中实际被选中的文件,不要只确认文件已经出现在列表里。回到 Stash 首页后,再启用连接。
- 修改 rules 字段。建议先复制一份原配置,再调整规则。每次只改一处,便于判断是规则内容、缩进还是代理组名称导致问题。
- 检查 YAML 缩进。YAML 对缩进敏感,
rules:下的每条规则通常使用相同层级的列表缩进。不要混用不可见的制表符,也不要把列表项误写成普通文本。 - 重新加载并测试。保存后重新载入配置,访问一个明确属于测试规则的域名,再在 Stash 的连接记录中查看实际命中的策略。若修改没有生效,先确认是否仍选中了旧配置。
Stash 的快速开始文档给出了远程配置和本地配置的导入流程,可参考Stash Quick Start。不同版本的界面名称可能略有变化,但配置文件和规则字段应以当前文档及应用界面为准。
四、大量规则使用 Rule Set 的方法
如果把数百或数千条域名直接写入 rules,配置会难以维护,也可能增加资源占用。Stash 支持通过 rule-providers 声明规则集,再在 rules 中使用 RULE-SET 引用。官方文档建议,大量域名规则优先使用 domain 或 domain-text,大量网段规则优先使用 ipcidr 或 ipcidr-text。
一个基础示例:
rule-providers:
work-domains:
behavior: domain
format: yaml
url: https://example.com/work-domains.yaml
path: ./rules/work-domains.yaml
interval: 86400
rules:
- RULE-SET,work-domains,Proxy
- MATCH,DIRECT
behavior决定规则集内容类型,例如domain或ipcidr。format用于声明规则集格式,常见值包括yaml和text。url是远程规则集地址;如果规则需要请求头,可在headers中配置。path用于保存本地缓存,路径必须位于 Stash 管理的资源目录范围内。interval表示更新间隔,具体是否需要自动更新取决于规则集的维护方式。
Rule Set 的声明方式、缓存逻辑和格式限制可查看Stash Rule Sets 文档。对于少量自定义域名,也可以使用内联规则集;规则数量较大时,更适合使用本地或远程规则文件。
五、规则不生效或配置加载失败怎么排查
- 先看规则顺序。确认目标请求前面是否已经被更宽泛的
DOMAIN-SUFFIX、GEOIP或其他规则匹配。将更具体的规则放在更宽泛的规则之前。 - 确认策略名称存在。例如规则写成
Proxy,但配置中的代理组名称实际是其他名称,可能导致配置加载失败或策略不可用。 - 区分域名和 IP 规则。域名规则无法覆盖已经只显示为 IP 的连接;反过来,IP 规则也不能代替域名后缀规则。
- 检查 Rule Set 是否下载成功。确认
url可访问、文件格式与behavior一致,并检查本地缓存是否存在旧文件或解析错误。 - 检查 DNS 影响。如果域名解析结果异常,规则可能表现为未命中或连接失败。不要在没有明确需求时堆叠过多 DNS 服务;Stash 文档建议移动设备使用数量适中的 DNS 配置。
- 注意 iOS 的进程规则限制。Stash 的 iOS 和 tvOS 版本对部分进程相关规则存在系统限制,不能简单照搬桌面端配置。文档明确指出,相关进程规则在不支持的平台上会被忽略。
- 保留最小可用配置。先只保留一个代理组、两三条测试规则和一条
MATCH,确认基础逻辑正常后,再逐步加入规则集、DNS 或其他高级功能。
如果配置文件体积较大,优先拆分为多个 Override 或 Rule Set。Stash 文档还提醒,过于复杂的配置可能受到 iOS 网络扩展资源限制影响,因此不建议盲目堆叠大量顺序匹配的 classical 规则集,可参考高效编写 Stash 配置文件的说明。
六、推荐的入门配置结构
刚开始配置时,可以按照“局域网直连—明确域名规则—规则集—地区规则—兜底规则”的顺序组织:
rules:
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- DOMAIN,api.example.com,Proxy
- DOMAIN-SUFFIX,example.com,Proxy
- RULE-SET,private-domains,DIRECT
- GEOIP,CN,DIRECT
- MATCH,Proxy
这不是适合所有人的固定模板。你需要根据实际代理组名称、规则集内容、DNS 方案和设备平台调整。建议先用少量明确域名验证规则顺序,再加入大型规则集。若规则用于阻止请求,Stash 还提供 REJECT 和 REJECT-DROP 等内置策略,但涉及拦截时应先确认规则范围,避免误伤登录、更新或系统服务。
常见问题
Stash 规则为什么没有生效?
优先检查当前是否选中了修改后的配置,其次检查规则顺序、策略名称、YAML 缩进和域名写法。若前面已有更宽泛规则,目标请求可能已经提前命中;如果使用 Rule Set,还要检查远程文件是否成功下载并能被正确解析。
DOMAIN 和 DOMAIN-SUFFIX 有什么区别?
DOMAIN 只匹配指定的完整域名,例如 DOMAIN,api.example.com 不等同于所有子域名;DOMAIN-SUFFIX 用于匹配域名后缀,通常可以覆盖主域名及其子域名。需要精确控制时优先使用 DOMAIN,需要覆盖一组子域名时再使用 DOMAIN-SUFFIX。
Stash 的 MATCH 规则应该放在哪里?
MATCH 通常放在 rules 列表最后,用来处理前面所有规则都没有匹配的请求。如果把 MATCH 放在前面,后面的规则可能无法按预期执行。
什么时候应该使用 RULE-SET?
规则数量较少时可以直接写在 rules 中;当域名或 IP 条目较多、需要远程更新或希望降低主配置复杂度时,建议使用 rule-providers 声明 Rule Set,再用 RULE-SET 引用。大量域名和 IP 规则优先考虑 domain 或 ipcidr 类型。
iPhone 上能否直接照搬桌面端的进程规则?
不能保证。Stash 文档说明,iOS 和 tvOS 受系统网络扩展限制,部分进程相关规则可能被忽略。移动端配置应优先使用域名、IP、端口、协议或 Rule Set 等跨平台更稳定的规则类型。