云梯VPN 免费版 CloudPN - 云梯回国VPN 免费版 BackChina

sing-box 规则不生效怎么办?按 8 步定位配置与分流问题

更新于 2026-11-13 · yunti.online

简答:sing-box 规则不生效,先不要急着改 DNS 或换节点:先确认请求确实进入 sing-box、客户端处于规则模式,再用一个明确的 domain 规则测试命中情况。若规则已经命中但仍无法连接,问题通常在 outbound、DNS、TUN 或节点连接,而不是规则本身。

定义:sing-box 规则不生效,是指请求没有按 route.rules、DNS rules 或 rule_set 预期匹配,或者已经匹配但最终出站连接失败。

先试这一步:用最小规则判断是“未命中”还是“出站失败”

本文是边界云加速整理的第三方使用指南,不代表 sing-box 或任何客户端官方。以下步骤适用于使用 sing-box 核心的图形客户端和命令行环境,具体菜单名称以当前客户端显示为准。

症状与优先检查项
现象优先检查结果判断
所有网站都不按规则分流客户端模式、TUN 或系统代理没有进入 sing-box 时,规则不会执行
只有某个域名不生效domain、domain_suffix、sniff 和 DNS日志中的目标域名与规则文本不一致时,属于匹配条件问题
国内站点也走代理规则顺序、final 和宽泛规则前面的规则先匹配时,后面的直连规则不会接管
rule_set 规则全部失效URL、format、缓存和下载路径规则集未加载时,引用它的规则无法按预期工作
规则命中但页面打不开outbound 标签、DNS、节点连接这是命中后的连接问题,不应继续只改规则
  1. 确认模式:把客户端切换到 Rule、规则或等效模式,暂时不要使用 Global、全局或 Direct、直连模式。若客户端没有规则模式入口,需查看该客户端对 clash_mode 或路由规则的支持情况。
  2. 确认流量入口:系统代理模式只接管遵循系统代理的应用;TUN 模式才可能接管更多系统流量,但通常需要系统权限。假如浏览器没有设置系统代理,也没有启动 TUN,浏览器请求可能根本不会进入 sing-box。
  3. 检查配置:在配置文件所在环境执行 sing-box check。若需要整理格式,可先备份,再执行 sing-box format -w -c config.json;参数和配置路径以当前核心帮助信息为准。官方配置说明将 check 和 format列为配置检查、格式化命令,见sing-box 配置说明。
  4. 做最小测试:先用一个明确域名替换复杂的 geosite、geoip 或远程 rule_set。下面的 test.example、proxy-out 和 direct 只是占位值,必须改成配置里真实存在的标签。

{"route":{"rules":[{"domain":["test.example"],"action":"route","outbound":"proxy-out"}],"final":"direct"}}

测试结果这样判断:如果日志显示请求命中 test.example,但连接失败,继续检查 proxy-out;如果日志中完全没有该域名,先检查流量是否进入 sing-box、域名是否被识别,以及客户端是否实际加载了这份配置。

按 8 步排查 route.rules、DNS 和出站标签

  1. 确认客户端加载的是当前文件:修改配置后重新载入或重启核心。图形客户端可能使用本地、远程或 iCloud 配置,编辑的文件不一定就是正在运行的文件。
  2. 核对 outbound 标签:规则中的 outbound 必须与 outbounds[].tag 完全一致,包括大小写、短横线和下划线。标签不存在时,配置检查或启动日志通常会出现错误;若配置能启动但行为异常,也要重新核对实际引用的标签。
  3. 检查规则顺序:把用于单域名测试的具体规则放在宽泛规则之前。不要把覆盖范围很大的 domain_suffix、rule_set 或兜底规则放在测试规则前面。route.final是没有其他规则接管时使用的默认出站;如果为空,官方说明会使用第一个 outbound。
  4. 区分 route.rules 和 DNS rules:route.rules主要决定连接走哪个出站;DNS rules 决定 DNS 查询使用哪个 DNS server 或执行什么 DNS 动作。DNS 规则匹配成功,不等于网页连接已经走了目标 outbound。需要同时检查两套规则。
  5. 检查域名识别:对 TUN 流量,目标可能先表现为 IP。若规则依赖域名,检查是否启用了适合当前流量的 sniff 或域名解析流程。官方规则动作文档说明,sniff用于协议识别,resolve用于将域名解析为 IP;二者用途不同,不能互相替代。
  6. 检查 IPv4 与 IPv6:如果只测试了 IPv4,而应用优先使用 IPv6,可能出现“看起来规则不生效”的现象。可在日志中确认实际连接地址,必要时分别测试 IPv4、IPv6 或使用配置支持的网络策略。
  7. 检查 TUN 路由:TUN 开启后,如果网卡、默认路由、DNS 劫持或自动探测网卡异常,流量可能绕过规则或形成回环。Windows、macOS 和 Linux 的权限、网卡名称和路由行为不同,不能直接照搬其他平台的设置。
  8. 最后验证节点:先用一个已确认命中的域名,再测试该 outbound 是否能建立连接。TCP 测试不能代表 UDP 或 QUIC;如果目标应用使用 UDP,需在日志中观察实际协议和错误类型。

官方 Route Rule 文档列出了 domain、domain_suffix、rule_set、network、process_name、package_name 等匹配字段;不同字段有版本和平台限制,配置不能只根据别的客户端写法推断。可查阅sing-box Route Rule。

remote rule_set 下载失败:检查 URL、格式与缓存

如果复杂规则依赖远程 rule_set,先暂时换成上面的单域名规则。这样可以确认核心路由本身正常,再单独处理规则集。

  1. 确认类型:远程规则集应使用 type: remote,并填写唯一的 tag、format 和 url。官方文档支持 source 与 binary 两种格式,不能把普通 Clash YAML、Base64 订阅或任意文本链接直接当作 rule_set。
  2. 确认 URL 返回内容:在浏览器或命令行查看响应是否为预期的规则集文件,而不是登录页、HTML 错误页、JSON 错误信息或需要人工验证的页面。不要在公开日志、截图或文章中暴露带密钥的订阅链接。
  3. 确认下载路径:远程规则集可能需要通过指定 HTTP client 或默认出站下载。若下载必须经过代理,检查 http_client、默认 HTTP client 和下载出站是否存在;官方文档显示旧的 download_detour 已进入弃用路径,新配置应按当前版本文档核对。
  4. 检查缓存:官方说明远程 rule_set 在启用 experimental.cache_file.enabled时可以缓存。首次下载失败时,缓存中没有可用内容,引用规则集就可能无法按预期工作。
  5. 核对标签:route.rules[].rule_set引用的标签,必须与 route.rule_set[].tag一致。标签写错、格式写错、缓存路径不可读,都会让规则集排查变得混乱。

官方 rule-set 文档对本地、远程、source、binary、缓存和 HTTP client 有明确字段说明,见sing-box rule-set 配置。假如你仍在使用旧的 geosite 或 geoip字段,不要把“配置能启动”理解为“迁移完成”;官方迁移文档说明相关功能已经转向 rule-set,具体支持范围需按核心版本核对。

迁移说明见sing-box Migration。截至 2026 年 11 月 13 日,文章不替读者判断某个客户端内置核心的具体版本;请在客户端信息页或核心日志中核对实际版本。

日志与跨平台验证:把“规则不生效”拆成四类结果

建议把日志级别临时调整为 debug,复现一次后立即恢复为 info,避免长期输出过多信息。官方日志配置支持 trace、debug、info、warn、error等级别,参考sing-box Log。

日志中应关注什么
观察结果说明下一步
没有任何请求记录流量未进入当前核心,或配置未运行查系统代理、TUN、应用代理和当前配置
有请求但没有域名可能只有 IP,或 sniff、DNS 识别不足查协议识别、DNS 和 Fake-IP 相关设置
命中规则并选择目标 outbound路由逻辑已经执行查 outbound、节点、DNS 和协议连接
rule_set 下载或解析报错规则数据没有正常加载查 URL、format、HTTP client、缓存和标签
  • Windows:先确认系统代理端口与 sing-box 入站监听端口一致;PowerShell 可用 Get-NetTCPConnection -LocalPort 端口查看端口是否被监听。若使用 TUN,另查虚拟网卡和管理员权限。
  • macOS/Linux:可用 ss -lntup | grep 端口查看监听情况;macOS 也可用 lsof -nP -iTCP:端口 -sTCP:LISTEN。Linux 使用 systemd 时,可查看 journalctl -u sing-box --output cat -e。
  • Android/Apple 图形客户端:重点核对当前 Profile、当前核心状态、系统 VPN 权限和规则模式。移动端的 package_name、网络类型等条件不适合直接复制到桌面端。

不要把订阅链接、远程 rule_set URL 中的密钥、节点密码、UUID 或完整日志直接发到公开平台。分享日志前至少打码域名、地址、端口、用户标识和认证字段。

最小自查清单:改完一项就重新验证

  • 客户端不是 Global、Direct 或其他绕过 route.rules 的模式。
  • 测试应用确实经过系统代理或 TUN,不是直接联网。
  • sing-box check可以通过,JSON 结构和字段类型没有错误。
  • 规则引用的 outbound tag 与实际 outbounds 标签完全一致。
  • 具体 domain 规则位于宽泛规则之前,route.final只是兜底。
  • route.rules 与 DNS rules 分开检查,没有把 DNS 动作当成网页出站选择。
  • 日志能看到目标域名、匹配结果和最终 outbound。
  • 远程 rule_set 的 URL、format、缓存和下载路径都能核实。
  • 旧 geosite、geoip 配置已按当前核心文档检查迁移状态。

如果只想快速定位,优先完成三件事:切换规则模式、加入一个明确的 domain最小规则、查看 debug 日志。三步之后仍无法判断,再检查 TUN、DNS、IPv6 和节点连接。

常见问题

sing-box 规则不生效,应该先改 DNS 吗?

不建议一开始就改 DNS。先确认客户端处于规则模式、流量确实经过 sing-box,并用单个 domain 规则观察日志。只有出现域名无法识别、DNS 查询失败或解析结果异常时,再单独排查 DNS。

为什么 route.rules 写了规则,但网页还是走 final?

常见原因是请求没有进入当前配置、域名没有被识别、规则条件与实际域名不一致,或规则字段不被当前核心支持。先用明确的 domain 规则测试,再核对日志和核心版本。

rule_set 能下载,但规则仍然不生效怎么办?

下载成功不代表引用正确。检查 rule_set 的 tag 是否与 route.rules 完全一致,format 是否对应文件内容,规则集是否真的包含目标域名,并确认前面没有更宽泛的规则提前匹配。

TUN 开启后规则反而不生效,怎么判断?

先关闭 TUN,使用系统代理测试同一个域名。如果系统代理能命中而 TUN 不能,再检查虚拟网卡、默认路由、DNS 劫持、自动探测网卡和系统权限。TUN 与系统代理是不同的流量入口,不能混为一谈。

旧 geosite 或 geoip 配置还能继续使用吗?

不能只凭配置能启动来判断兼容性。官方文档将 geosite、geoip 标为弃用并提供迁移到 rule_set 的说明;请根据当前 sing-box 核心版本检查字段是否仍受支持,并逐项迁移。

相关阅读

参考资料

  1. sing-box 配置说明|检查、格式化与合并
  2. Route Rule - sing-box
  3. Rule Action - sing-box
  4. rule-set - sing-box
  5. Migration - sing-box
  6. Log - sing-box