装好 sing-box、导入订阅就能上网,但用一段时间总会遇到"这个网站想直连、那个 App 想走代理"的需求。这时候就要动分流规则了。本文假设你已经会用 sing-box(没装的先看 sing-box 入门),直接讲规则怎么写。

规则到底在决定什么#
sing-box 的路由(route)是一张"按条件分流"的表:每个请求进来,按顺序匹配规则,第一条命中的规则决定它走直连、走代理,还是被拦截。顺序就是一切——规则按从上到下匹配,命中即停,后面的规则再对也不会生效。
常见的匹配条件分四类:
- 域名类:
domain(精确域名)、domain_suffix(后缀,如.google.com)、domain_keyword(关键词)、domain_regex(正则)。 - IP 类:
ip_cidr(IP 段,如192.168.0.0/16)、ip_is_private(内网地址)。 - 端口与协议类:
port、protocol(如dns、quic)。 - 来源类:
source_ip_cidr、inbound(入站标识),用来区分不同设备或入口。
一个典型的个人配置思路是三层:先写"特殊处理"(广告拦截、直连的国内服务),再写"分流"(国外走代理、国内直连),最后写一条 final 兜底(没命中的默认走代理或直连,二选一,别留空)。
远程规则集:不用手写几万条#
国内直连、国外代理这种大名单,没人会手写。sing-box 支持 rule_set,可以引用别人维护好的规则集:
- geosite:按域名分类,如
geosite-cn(国内网站集合)、geosite-geolocation-!cn(非国内网站集合)。 - geoip:按 IP 归属分类,如
geoip-cn(国内 IP 段)、geoip-private(内网 IP 段)。
引用方式是先在 route.rule_set 里声明来源(本地文件或远程 URL),再在规则里用 rule_set: geosite-cn 这样的写法。远程规则集会定期更新,适合"一次配置、长期省心"的场景;缺点是更新时间不受你控制,某天规则集变了可能影响分流,介意的话可以下载到本地固定版本。
一个能直接用的骨架#
下面是一份精简骨架(JSON 格式,写进 sing-box 配置的 route.rules),按"拦截→直连→代理→兜底"的顺序排:
{
"route": {
"rules": [
{ "protocol": "dns", "outbound": "dns-out" },
{ "rule_set": "geosite-ads", "outbound": "block" },
{ "rule_set": ["geosite-cn", "geoip-cn"], "outbound": "direct" },
{ "rule_set": "geosite-geolocation-!cn", "outbound": "proxy" },
{ "ip_is_private": true, "outbound": "direct" }
],
"final": "proxy"
}
}读法:DNS 查询先走 DNS 出站;广告域名直接拦截;国内域名和国内 IP 直连;国外域名走代理;内网地址直连;其余没命中的,默认走代理。这份骨架里的 direct、proxy、block、dns-out 是出站(outbound)的名字,要和你配置里的出站名对应上,否则 sing-box 会报错启动失败。
五个最常见的坑#
1. 规则顺序写反了。
把"国外走代理"写在"广告拦截"前面,广告域名先命中了代理规则,就永远不会被拦截。记住:越特殊的规则越靠前,越通用的越靠后。
2. final 没设或设错。
没命中的请求走到 final,如果你设的是直连,某些国外小众网站就会裸连;设的是代理,国内小众服务可能变慢。根据你的主要用途二选一,没有标准答案。
3. 只分域名、不分 DNS。
规则按域名分流,但 DNS 查询本身也要分流:直连域名的 DNS 应该走国内 DNS,代理域名的 DNS 应该走远程加密 DNS,否则会出现"域名走了代理、DNS 查询却泄露了"的情况。DNS 部分的设置见 小火箭 DNS 设置 里的分工思路,sing-box 同理。
4. 规则改完没生效。
sing-box 改配置后要重启核心或重新加载才生效。改完先检查配置格式(JSON 少个逗号是最常见的启动失败原因),再用日志看有没有报错。
5. 规则配错导致打不开网页。
比如把某个常用域名误写进拦截规则,或者出站名写错。排查时先把可疑规则临时注释掉,恢复上网后再逐条加回去。更完整的断网排查流程见 代理已连接却没网排查 8 步。
和 Clash 规则的区别#
概念上两家是相通的:都是"条件→动作"的表。写法上 sing-box 用 JSON,Clash 用 YAML 的 rules: 列表;Clash 的 GEOSITE、GEOIP、MATCH 对应 sing-box 的 rule_set 和 final。如果你两边都用,可以参考 Clash Verge 全指南 里的规则章节对照着看,思路迁移过去就行,不用重新学。

