很多人切到 Hiddify、Karing 或 sing-box 官方客户端,是因为想用同一套内核覆盖手机和桌面。问题在于,Clash 系配置的思路和 sing-box 不一样。直接找在线转换器,常见结果是「节点能连,分流乱了」。
迁移前先看这张表
| Clash/Mihomo | sing-box | 迁移注意 |
|---|---|---|
proxies | outbounds | 单个节点基本可映射 |
proxy-groups | selector/urltest outbounds | 选择器也算 outbound |
rules | route.rules | 字符串规则改对象数组 |
rule-providers | route.rule_set | .mrs 不能直接当 .srs 用 |
dns.nameserver | dns.servers | 服务器要先定义 tag |
nameserver-policy | dns.rules | 域名匹配逻辑要重写 |
最关键的一点:sing-box 的配置更像「组件注册 + 引用」。先定义 DNS server、outbound、rule_set,再在 route 或 dns 里引用 tag。
一个最小映射例子
Clash 写法:
proxies:
- name: us-1
type: trojan
server: example.com
port: 443
proxy-groups:
- name: Proxy
type: select
proxies: [us-1, DIRECT]
rules:
- DOMAIN-SUFFIX,example.org,Proxy
- MATCH,DIRECT
sing-box 需要把节点和选择器都放进 outbounds:
{
"outbounds": [
{ "type": "trojan", "tag": "us-1", "server": "example.com", "server_port": 443, "password": "xxx" },
{ "type": "selector", "tag": "Proxy", "outbounds": ["us-1", "direct"] },
{ "type": "direct", "tag": "direct" }
],
"route": {
"rules": [
{ "domain_suffix": ["example.org"], "outbound": "Proxy" }
],
"final": "direct"
}
}
不要照抄这个片段到生产配置,它只是说明结构差异。
DNS 是迁移失败重灾区
Clash 里很多人只写 nameserver 和 fallback;sing-box 里更推荐给 DNS server 打 tag,然后用 dns.rules 分派。迁移时检查三件事:
- 解析代理服务器域名的 DNS 不能依赖代理本身。
dns.rules的命中顺序是否和原nameserver-policy一致。- IPv6 是否需要开启;不确定时先关闭,减少变量。
如果切换后网页偶发打不开,别只看节点延迟,看 DNS 日志,确认域名被哪个 resolver 处理。
什么时候可以用转换工具
适合转换:纯节点列表、少量域名规则、没有 provider 和脚本覆写。
不适合转换:
- 多层
proxy-groups互相引用。 - 远程规则集很多,且格式为
.mrs或自定义.list。 - DNS 分流依赖
nameserver-policy。 - Clash 配置里有 JavaScript parser/override。
需要换订阅时,优先让服务商直接导出 sing-box/Hiddify 格式;如果后台只有 Clash 格式,再考虑转换。也可以准备配套订阅线路作为多客户端测试源,但仍要确认当前客户端选的是 sing-box 导出。
迁移验收清单
- 节点列表存在,selector 能手动切换。
- 自动测速组不会把
direct当成远端节点。 route.final符合你的预期。- DNS 日志里没有循环解析。
- 常用 App 的域名命中正确 outbound。
- 重启客户端后远程 rule_set 能正常更新。
完成这些再把旧 Clash 客户端停掉。否则两个客户端同时开系统代理或 TUN,排错会变得很乱。