快柠檬Falemon - 网络加速服务

sing-box rule set 设置不生效?按 1.15.x 配置、编译与排错

更新于 2026-10-26 · falemon.site

简答:sing-box rule set 要在 route.rule_set 中声明,再由 route.rules[].rule_set 引用 tag,并在 action 中指定 outbound。按本文最小配置执行 check,再看运行日志,能区分字段错误、下载失败和规则未命中。

定义:sing-box rule set 是一组可复用的匹配规则,先在 route.rule_set 中声明资源,再由 route.rules 中的 rule_set 标签引用,最后通过 action route 指定出站。

先照抄最小配置:声明、引用、出站一次验证

如果你只想确认 sing-box rule set 设置是否正确,先使用 inline 规则集,不要一开始就加入远程下载、缓存或复杂 DNS。下面示例按 sing-box 1.15.x 及后续文档结构编写,核心变化是把出站写在 action:"route" 对应的动作中,而不是继续使用已弃用的规则级 outbound 字段。字段可分别对照Route 官方文档和Rule Action 官方文档。

rule set 最小闭环速查
配置位置作用必须注意
route.rule_set声明规则集资源它位于 route 对象内,不是根级字段
route.rules[].rule_set引用已声明的 tag统一写成字符串数组
route.rules[].action定义匹配后的动作路由时使用 action:"route" 与 outbound

将下面内容保存为 JSON 配置文件:

{ "outbounds": [ {"type": "direct", "tag": "direct"}, {"type": "block", "tag": "block"} ], "route": { "rule_set": [ { "type": "inline", "tag": "blocked-example", "rules": [ {"domain_suffix": ["example.com"]} ] } ], "rules": [ { "rule_set": ["blocked-example"], "action": "route", "outbound": "block" } ], "final": "direct" } }

  1. 将 example.com 替换为你用于测试的域名规则。
  2. 在 PowerShell、终端或服务所在环境执行 sing-box check -c 配置文件路径。
  3. check 通过后启动 sing-box,再查看运行日志。
  4. 命中规则时,应能看到目标域名与 block 出站的对应关系;其他请求使用 direct。

这里的 route.rule_set 和 route.rules 是同一层级下的“声明”和“引用”,不能把规则集对象直接塞进 route.rules[].rule_set。

inline、local、remote 怎么选:按资源来源决定

三种 rule set 类型与最低版本
类型最低版本适用场景关键字段是否依赖下载
inline1.10.0少量自定义域名、快速验证层级tag、rules否
local1.8.0;inline 能力为 1.10.0本机维护 JSON 或 SRS 文件format、path否
remote1.8.0;http_client 与 initial_path 为 1.14.0定期拉取远程规则集format、url、update_interval是

官方规则集文档说明,inline 直接携带规则;local 从本地路径加载;remote 从 URL 获取规则。正式配置中建议显式写出 format,不要只依赖文件扩展名判断。

本地 source JSON 的声明示例:

{"type":"local","tag":"office","format":"source","path":"rules/office.json"}

本地 binary SRS 的声明示例:

{"type":"local","tag":"office","format":"binary","path":"rules/office.srs"}

route.rules 引用的始终是 tag,例如 "rule_set":["office"],不是文件名、文件路径或远程 URL。

source JSON 编译为 SRS:从文件到命中完成闭环

source 格式是可读的 JSON 规则文件,binary 格式是编译后的 SRS。规则集源文件的版本不是简单的“sing-box 版本号”,而是规则集格式版本;官方源文件格式文档列出的关系是:version 1 为 1.8.0 的初始格式,version 2 在 1.10.0 优化了 binary 规则集中的 domain_suffix,version 3 在 1.11.0 增加网络类型规则项,version 4 在 1.13.0 增加接口地址规则项,version 5 在 1.14.0 增加 package_name_regex。

如果只使用域名和 IP 规则,不需要为了“匹配 1.15.x”而强行使用 version 5。下面的示例使用基础结构:

{ "version": 1, "rules": [ { "domain_suffix": ["office.example", "intranet.example"] }, { "ip_cidr": ["192.168.0.0/16"] } ] }

  1. 将内容保存为 rules/office.json。
  2. 在该文件所在目录执行 sing-box rule-set compile --output office.srs office.json。
  3. 将生成的 office.srs 放到配置指定的 rules/ 目录。
  4. 把 route.rule_set 的格式改为 binary,路径改为 rules/office.srs。
  5. 在 route.rules 中引用 ["office"],再执行 sing-box check -c 配置文件路径。

这条链路需要逐项对应:source JSON 能解析、compile 成功、SRS 路径真实存在、tag 与引用完全一致。只要其中一项不一致,就可能出现启动失败或配置通过但规则不命中。

remote 规则集:1.14+ 用 http_client,不再首选 download_detour

从 sing-box 1.14.0 起,remote rule set 支持 http_client 和 initial_path;download_detour 已弃用,并计划在 1.16.0 移除。官方文档还明确说明,http_client 可以填写共享 HTTP Client 的 tag,也可以直接填写对象;共享客户端定义在根级 http_clients 数组中。可查看HTTP Client 官方文档和规则集远程字段说明。

下面是一份结构完整的 remote 示例。它使用共享 HTTP Client 字符串写法,避免同时混用多个下载字段:

{ "http_clients": [ { "tag": "rule-fetch", "headers": { "User-Agent": "sing-box-rule-fetch" } } ], "outbounds": [ {"type": "direct", "tag": "direct"}, {"type": "block", "tag": "block"} ], "route": { "rule_set": [ { "type": "remote", "tag": "remote-rules", "format": "binary", "url": "https://规则集地址/remote.srs", "initial_path": "rules/remote.srs", "http_client": "rule-fetch", "update_interval": "1d" } ], "rules": [ { "rule_set": ["remote-rules"], "action": "route", "outbound": "block" } ], "final": "direct" } }

将示例中的“规则集地址”替换为你已确认返回内容确实是 SRS 的地址;如果 URL 返回 source JSON,就把 format 改为 source。initial_path 是没有可用缓存时的初始文件,不是远程 URL。

如果不想在每个 remote 规则集中填写 http_client,也可以在 route 中设置 default_http_client,由它指定顶层 http_clients 中的 tag。不要再把旧的 download_detour 作为 1.15.x 配置的首选。

规则不生效、下载失败、旧缓存:按顺序排查

  1. 先查 JSON 和字段:执行 sing-box check -c 配置文件路径。出现 JSON decode、unknown field 或类型错误时,先检查逗号、层级,以及 rule_set 是否使用数组。
  2. 再查声明和引用:确认 route.rule_set[].tag 与 route.rules[].rule_set 中的 tag 逐字符一致。引用的是 tag,不是 path、URL 或文件名。
  3. 再查格式:format:"source" 必须对应 JSON 源文件,format:"binary" 必须对应 SRS。两者不匹配时,常见表现是规则集解析失败。
  4. 再查顺序:路由规则按列表顺序处理。把需要优先处理的自定义规则放在宽泛规则前面;前面的规则已经执行动作后,后面的 rule set 不会重新覆盖结果。官方路由规则说明还指出,多个 rule set 在组合匹配时保留 OR 语义,但外层规则的其他匹配条件仍会参与组合。
  5. 最后查运行日志:check 通过只代表配置结构可解析,不代表运行时已经命中。命令行查看启动终端输出;系统服务查看服务日志目录;图形客户端则打开其日志面板,搜索规则集 tag、目标域名和 outbound。
  6. 远程下载失败:检查 URL 的 HTTP 状态、证书、返回格式,以及 http_client 的 tag 是否存在。需要自检时使用 GET 请求,并带上与客户端接近的 User-Agent,例如 curl -L -A "sing-box-rule-fetch" -o /tmp/remote.srs "规则集地址";不要用 HEAD 代替内容检查。
  7. 更新后仍像旧内容:只有启用 experimental.cache_file.enabled 时,远程规则集才会写入缓存。缓存路径由 experimental.cache_file.path 指定,留空时使用 cache.db,具体字段见缓存文件官方文档。先通过客户端的更新或清缓存功能处理;只有在确认该文件由当前 sing-box 实例维护、并已备份配置数据时,才停止进程后移动缓存文件进行重新获取。

排查结果可以按三类判断:check 失败是配置结构问题;下载失败是 URL、HTTP Client、证书或网络问题;check 和下载都正常但未分流,通常应继续检查 tag、规则内容、规则顺序和实际日志。

最后核对:2026-10-26

  • route.rule_set 是否位于 route 对象内。
  • route.rules[].rule_set 是否统一写成数组。
  • 声明的 tag 与引用的 tag 是否完全一致。
  • source JSON、SRS 文件与 format 是否匹配。
  • 规则动作是否使用 action:"route" 与对应的 outbound。
  • remote 配置是否优先使用 1.14.0 引入的 http_client,而非已弃用的 download_detour。
  • 是否分别执行过 sing-box check,并在运行日志中确认实际命中。

本站是第三方使用指南站,不是 sing-box 官方站点;版本和字段结论以本文列出的官方文档为准。配置通过并确认规则命中后,下一步只需要针对实际连接结果继续排查网络质量。

常见问题

sing-box 的 rule_set 应该写字符串还是数组?

在 route.rules 中建议统一写成数组,例如 <code>"rule_set":["blocked-example"]</code>。顶层的 route.rule_set 则是规则集对象数组,二者不是同一种结构。

sing-box 1.15.x 还能使用 outbound 字段吗?

官方路由规则文档将规则级 outbound 标记为 sing-box 1.11.0 起弃用,并说明它已移动到 Rule Action。新配置应使用 <code>"action":"route","outbound":"目标标签"</code>,不要继续把 outbound 当作旧规则字段使用。

inline、local 和 remote 哪个适合排查配置?

先用 inline 验证声明、引用和动作;需要维护文件时改用 local;需要定期拉取资源时再使用 remote。这样可以先排除下载和缓存因素。

source 格式的 version 应该填多少?

按实际使用的规则项选择。官方文档列出 version 1 为初始格式,version 3、4、5 分别在 1.11.0、1.13.0、1.14.0 增加对应规则项。只使用基础域名和 IP 规则时,不必为了版本号强行使用 version 5。

remote 规则集的 http_client 应该怎么写?

1.14.0 起可以在顶层 http_clients 中定义共享客户端,再在规则集的 http_client 中填写其 tag;也可以直接填写 HTTP Client 对象。本文示例使用共享客户端 tag,避免混用旧的 download_detour。

sing-box check 通过了,为什么规则还是不生效?

check 主要验证配置结构。继续检查规则集 tag、format 与文件类型、规则顺序、目标域名是否匹配,并在运行日志中确认实际 outbound。

远程规则集更新后仍然使用旧内容怎么办?

先确认是否启用了 experimental.cache_file,再查看 cache_file.path。优先使用客户端的更新或清缓存功能;只有确认缓存文件由当前实例维护并完成备份后,才停止进程并移动该文件重新获取。

相关阅读

参考资料

  1. sing-box 规则集官方文档
  2. sing-box Route 官方文档
  3. sing-box 路由规则官方文档
  4. sing-box Rule Action 官方文档
  5. sing-box HTTP Client 官方文档
  6. sing-box 源文件格式官方文档
  7. sing-box 缓存文件官方文档
  8. sing-box.sagernet.org