sing-box 路由规则入门:出站、规则与 DNS 规则
sing-box 的分流由 route 与 dns 两段完成:route 规则把连接交给某个出站,dns 规则把域名查询交给某个 DNS 服务器,两者都按顺序匹配并以 final 兜底。本文说明匹配字段的组合逻辑、规则集声明、嗅探的作用和排查方法。
两段配置、两次决定:连接去哪,域名找谁解析
sing-box 的分流由两段配置分别完成:route 决定每条连接交给哪个出站,dns 决定每次域名查询交给哪个 DNS 服务器;两段都是自上而下按顺序匹配,未命中的分别落到各自的 final。 与 Clash 系把 DNS 当作全局设置不同,sing-box 让 DNS 也拥有一套完整的规则,这是它灵活的地方,也是新手最容易写错的地方。
整份 JSON 的顶层结构、入站和出站类型,已在 sing-box JSON 配置入门 中讲过,本文不重复骨架,只讲路由与 DNS 两段的写法。sing-box 的字段在不同时期有过调整,以下片段为通用示意,请以你所用版本的官方文档为准。
route 段:规则、规则集与兜底
一个典型的 route 段由三部分组成:
"route": {
"rules": [
{ "protocol": "dns", "action": "hijack-dns" },
{ "ip_is_private": true, "outbound": "direct" },
{ "rule_set": ["example-local"], "outbound": "direct" },
{ "domain_suffix": ["example.org"], "outbound": "proxy" }
],
"rule_set": [
{
"tag": "example-local",
"type": "remote",
"format": "binary",
"url": "https://rules.example.com/local.srs",
"download_detour": "proxy"
}
],
"final": "proxy"
}
- rules:规则列表,每条是一个对象,前半部分写匹配条件,后半部分写去向;
- rule_set:规则集声明,供规则通过 tag 引用;
- final:所有规则都未命中时使用的出站。
规则的去向在较早的写法里是直接写出站 tag,较新的写法引入了“动作”的概念,例如路由到某个出站、拒绝、劫持 DNS、嗅探等。两种写法在不同版本中的支持情况不同,这是旧教程照抄后加载失败的常见原因之一。
匹配字段:同类为“或”,异类为“且”
一条规则可以同时写多个字段。常见的组合逻辑是:
| 字段类别 | 示例字段 | 同类之间 | 与其他类别之间 |
|---|---|---|---|
| 域名类 | domain、domain_suffix、domain_keyword | 任一命中即可 | 需同时满足 |
| IP 类 | ip_cidr、ip_is_private | 任一命中即可 | 需同时满足 |
| 端口类 | port、port_range | 任一命中即可 | 需同时满足 |
| 来源类 | process_name、inbound | 任一命中即可 | 需同时满足 |
| 规则集 | rule_set | 视为对应类别的条件 | 需同时满足 |
举例:一条规则同时写了 domain_suffix 和 port,那么连接必须“域名后缀命中”且“端口命中”才算匹配。如果你的本意是“二者满足其一”,应拆成两条规则。组合细节以官方文档为准,不确定时拆开写更稳妥。
此外还有逻辑规则,可以用“与、或”把多个子规则组合起来,并支持取反,适合少数复杂条件。
嗅探:让 IP 连接也能按域名分流
在 TUN 模式下,内核收到的往往只是一个目标 IP。如果规则依赖域名,就需要嗅探:内核从连接的前几个数据包中读出访问的域名,再参与规则匹配。没有开启嗅探时,常见现象是“域名规则写对了却从不命中”。嗅探在较早写法中是入站的一个开关,在较新写法中是一条路由动作,具体位置以文档为准。
dns 段:服务器、规则与兜底
"dns": {
"servers": [
{ "tag": "remote-dns", "address": "https://dns.example.net/dns-query", "detour": "proxy" },
{ "tag": "local-dns", "address": "https://dns.example.cn/dns-query", "detour": "direct" }
],
"rules": [
{ "rule_set": ["example-local"], "server": "local-dns" },
{ "outbound": "any", "server": "local-dns" }
],
"final": "remote-dns"
}
这个片段表达了三件事:本地服务的域名交给本地 DNS;用于连接节点服务器的域名查询(由“任意出站”条件匹配)交给本地 DNS,避免“先要连上节点才能解析节点”的循环;其余查询交给经由代理的远端 DNS。服务器的声明格式在不同版本间同样有调整,请按文档书写。
DNS 规则与路由规则宜保持一致的分组思路:路由规则让某类域名直连,DNS 规则也让它在本地解析;路由规则让某类域名走代理,DNS 规则就交给远端解析。两者不一致时,常见结果是解析出的地址与出口地区不匹配。虚拟地址与真实解析两种思路的取舍,见 代理客户端的 DNS 设置。
与 Clash 规则的写法对照
| 概念 | Clash 系 | sing-box |
|---|---|---|
| 规则格式 | 一行文本,逗号分隔 | JSON 对象,字段组合 |
| 兜底 | 最后一条 MATCH | route 的 final |
| 规则集 | rule-providers | route.rule_set |
| DNS 分流 | DNS 段内的按域名指定服务器 | 独立的 dns.rules |
| 去向 | 策略组名 | 出站 tag 或动作 |
熟悉 Clash 写法的读者,可以对照 Clash 规则怎么写 理解两者的映射关系。
在机场配置上做小改动的思路
多数读者并不需要从零写一份 sing-box 配置,而是在机场下发的配置上加几条规则。这时有三条建议:
- 只在 rules 的前部插入:你新增的规则代表明确意图,放在前面才能优先命中;不要改动原有规则的顺序,以免打乱机场预设的分流逻辑。
- 引用已有的出站 tag:先在 outbounds 里找到机场定义的选择组或直连出站名称,直接复制使用,不要自己新造一个同名或近似名称的出站。
- 保存为独立副本:订阅更新可能覆盖整份配置,把改动记录在单独的文本里,或使用客户端提供的覆盖功能,更新后再核对一次。
如果机场下发的是通用分享链接而不是 sing-box 配置,客户端会自动生成一份默认路由,此时可修改的范围由客户端界面决定。
常见报错与对应原因
| 现象 | 常见原因 | 处理方向 |
|---|---|---|
| 提示未知字段 | 照抄了其他时期的写法 | 对照所用版本文档改写 |
| 提示找不到某个出站 | 规则里的 tag 与出站 tag 不一致 | 从 outbounds 中复制准确名称 |
| 规则集加载失败 | 地址不可达或格式声明与文件不符 | 检查下载出站和格式字段 |
| 域名规则从不命中 | TUN 下未开启嗅探 | 按文档开启嗅探 |
| 解析出的地址地区不对 | DNS 规则与路由规则分组不一致 | 让同类域名的解析与出站对应 |
| 启动后完全无法联网 | DNS 未被正确劫持或节点域名解析形成循环 | 检查 hijack 设置与节点域名的解析服务器 |
遇到报错时,先看日志里指出的字段名和位置,多数问题都能定位到具体某一行。
改完路由后的检查步骤
- 用 sing-box 自带的配置检查命令校验 JSON,确认没有语法和字段错误;
- 把日志级别临时调到较详细的一档,访问目标网站;
- 在日志中找到这次连接,看它命中了哪条规则、交给了哪个出站;
- 同时查看对应的 DNS 查询交给了哪个服务器;
- 确认无误后把日志级别调回,避免日志文件膨胀。
图形界面客户端通常提供连接列表,可以替代第 2~4 步。客户端安装与选择见 桌面端客户端:Windows 与 macOS,更多排错主题见 规则分流与故障排查专题页。修改配置时请遵守所在地法律法规与相关服务条款。
常见问题
sing-box 一条规则里写了多个字段,是“且”还是“或”?
常见理解是:同一类字段之间是“或”,例如多个域名后缀任意命中即可;不同类字段之间是“且”,例如域名类条件与端口条件要同时满足。具体分组方式以官方文档为准,不确定时可以拆成多条规则。
为什么 sing-box 的 DNS 规则要单独写?
因为“查询域名交给哪个 DNS 服务器”和“连接交给哪个出站”是两次独立的决定。单独的 DNS 规则可以让本地服务的域名交给本地服务器解析,海外域名交给远端服务器,避免解析结果与出口地区不一致。
旧教程里的 geosite、geoip 写法为什么加载失败?
sing-box 的配置字段在不同时期有过调整,较早的地理数据写法已逐步被规则集取代。遇到旧写法报错时,应查阅所用版本的官方文档和迁移说明,把对应条件改写为规则集引用。
来源与更新
品牌字段来自本站品牌数据文件(整理自 2026-09-04 品牌清单,Vendor Data,官网待核实);测速截图为 2026-10-18 复核后发布的单次 Measured Data;AI 与流媒体均为 Not Tested。发布 2026-10-18,最近更新 2026-10-18。本页不承诺任何平台的收录、排名或引用。