很多人切到 Hiddify、Karing 或 sing-box 官方客户端,是因为想用同一套内核覆盖手机和桌面。问题在于,Clash 系配置的思路和 sing-box 不一样。直接找在线转换器,常见结果是「节点能连,分流乱了」。

迁移前先看这张表

Clash/Mihomosing-box迁移注意
proxiesoutbounds单个节点基本可映射
proxy-groupsselector/urltest outbounds选择器也算 outbound
rulesroute.rules字符串规则改对象数组
rule-providersroute.rule_set.mrs 不能直接当 .srs
dns.nameserverdns.servers服务器要先定义 tag
nameserver-policydns.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 里很多人只写 nameserverfallback;sing-box 里更推荐给 DNS server 打 tag,然后用 dns.rules 分派。迁移时检查三件事:

  1. 解析代理服务器域名的 DNS 不能依赖代理本身。
  2. dns.rules 的命中顺序是否和原 nameserver-policy 一致。
  3. 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,排错会变得很乱。

相关阅读