
sing-box 是开源代理软件内核,服务端和客户端(手机、电脑、软路由)共用同一份 JSON 配置。跑起来之后最头疼的一步通常是分流:哪些流量走代理,哪些走直连。今天这篇只讲 route 段——决定流量去向的规则表。
核心逻辑只有一条:route.rules 从上到下依次匹配,第一条命中就生效;一条都没命中的走 final 指定的出站。顺序就是优先级,特例写前面、大网写后面。改完先跑 sing-box check -c config.json 校验再启动。
准备升级 1.14 的读者可以先看这篇:sing-box 升级 1.14 必看:6 个旧配置字段新版直接删了,先把旧写法修掉再折腾分流。
写法 1:域名直连(domain_suffix)
最直观的用法。银行、政府网站、校园网这类站点走代理容易抽风,直接用域名后缀匹配让它直连:
{
"domain_suffix": [".edu.cn", ".gov.cn", "10086.cn"],
"outbound": "direct"
}
domain_suffix 匹配后缀,开头的点不能省。单域名精确匹配用 domain,模糊匹配用 domain_keyword 或 domain_regex(正则烧脑,非必要别用)。
写法 2:远程规则集(rule_set)——现代写法
手动列域名永远列不完,大陆用户常用的"国内直连、国外走代理"需要上千条规则。现代做法是引入远程规则集:一份维护在 GitHub 上的规则文件,sing-box 启动时下载并定期更新:
"route": {
"rule_set": [
{
"tag": "geosite-cn",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs",
"download_detour": "proxy"
}
],
"rules": [
{ "rule_set": "geosite-cn", "outbound": "direct" }
],
"final": "proxy"
}
几点说明:
- 规则集来自 SagerNet 官方维护的 sing-geosite,
.srs是 sing-box 专用的二进制格式。下载规则集本身可能需要走代理,用download_detour指定。 - 旧教程常见的
geosite/geoip字段从 1.8 起已废弃,请迁移到rule_set(见 sing-box 迁移指南)。规则集启动时自动下载、默认每天自动更新,无需手动维护。
写法 3:局域网与私有地址直连(ip_is_private)
TUN 模式下(接管整机流量),局域网设备、路由器管理页、NAS 内网地址必须直连,否则走代理就断联了。ip_is_private 一条规则全包:
{ "ip_is_private": true, "outbound": "direct" }
这条匹配所有非公网地址(192.168.x.x、10.x.x.x、fd00::/8 等),建议放在规则表最前面——局域网流量是高频的,放前面还能省下后面的域名嗅探开销。
写法 4:拦截 UDP 443,逼网站降级(action: reject)
一个流传很广的实战技巧:很多网站默认走 QUIC(UDP 443),而 QUIC 的分流和嗅探兼容性差,常出现"网页半天打不开"的诡异问题。直接在路由层把 UDP 443 掐掉,浏览器会自动回落到 TCP 443:
{ "network": "udp", "port": 443, "action": "reject" }
这里不写 outbound,用 action: reject 丢弃连接。对 TUN 客户端效果最明显,服务端一般不需要。
写法 5:逻辑组合(type: logical)——多条件叠加
单条规则默认是"组内 OR、组间 AND",但"在公司 Wi-Fi 下、且访问内网域名才直连"这种需求要显式组合:
{
"type": "logical",
"mode": "and",
"rules": [
{ "wifi_ssid": "CompanyWiFi", "outbound": "direct" },
{ "domain_suffix": ".internal.company.com", "outbound": "direct" }
],
"outbound": "direct"
}
mode 支持 and / or 且可嵌套。wifi_ssid、按 App 包名的 package_name 这类字段只在 Android/iOS 图形客户端上有效,桌面核心用不上。
写法 6:反选(invert)——"除了这些,其他全走代理"
大陆用户最常用的全局模式其实是反过来的:国内直连、其他全部走代理。配合 final 即可,不需要写"国外规则集":
"route": {
"rules": [
{ "ip_is_private": true, "outbound": "direct" },
{ "rule_set": "geosite-cn", "outbound": "direct" }
],
"final": "proxy"
}
final: "proxy" 就是"没被上面规则命中的,全部走 proxy 出站"。如果你想做"仅代理名单"的反向模式(只代理指定域名、其余直连),把两条规则的 outbound 换成 proxy、final 换成 direct 就行,骨架不变。
顺序模板:直接抄的规则表骨架
把上面几条按优先级排好,一份能直接用的 route 段长这样:
"route": {
"rule_set": [
{
"tag": "geosite-cn",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs",
"download_detour": "proxy"
}
],
"rules": [
{ "action": "sniff" },
{ "protocol": "dns", "action": "hijack-dns" },
{ "ip_is_private": true, "outbound": "direct" },
{ "network": "udp", "port": 443, "action": "reject" },
{ "rule_set": "geosite-cn", "outbound": "direct" }
],
"final": "proxy",
"auto_detect_interface": true
}
前两条是通用开场:sniff 嗅探流量中的域名(供后续域名规则匹配),hijack-dns 接管 DNS 查询防泄露。然后按"局域网 → 特殊处理 → 国内直连 → 兜底代理"收尾。auto_detect_interface 让出站自动绑默认网卡,避免 TUN 模式下的路由环路。
排查"分流不生效":先 sing-box check 看语法,再看日志命中的是哪条规则——多数情况是大网写在了特例前面,把特例往上挪一格就好。
