在 macOS 上,Surge 的 UI 交互、Dashboard 抓包和基于 SSID 的策略切换确实好用。但它的一个痛点是协议支持太保守,目前仍不支持 VLESS (Vision/Reality) 或 Hysteria2 等协议。

如果你手头有这些高性能节点,又不想放弃 Surge 的体验,最直接的办法就是用 sing-box 做后端转发。

方案逻辑

Surge 负责策略控制(分流规则、SSID 切换、抓包),sing-box 负责底层传输。Surge 将流量通过 SOCKS5 转发给本地运行的 sing-box,再由 sing-box 建立真正的加密连接。

架构图

graph LR subgraph Surge_Control [Surge - 控制面] Rules{规则分流} Dashboard((Dashboard)) Scripts((脚本/SSID 策略)) end subgraph SingBox_Data [sing-box - 数据面] Inbound[SOCKS5 入站: 7891] Outbound[协议封装: VLESS / H2 / Reality] end App[应用流量] --> Rules Rules -- "DIRECT" --> Direct[直接出站] Rules -- "SOCKS5 转发" --> Inbound Inbound --> Outbound Outbound --> Remote[远程服务器]

核心配置

1. sing-box 配置

sing-box 仅作为本地代理运行,监听 7891 端口。

~/.config/sing-box/config.json:

{
  "inbounds": [
    {
      "type": "mixed",
      "tag": "mixed-in",
      "listen": "127.0.0.1",
      "listen_port": 7891
    }
  ],
  "outbounds": [
    {
      "type": "vless",
      "tag": "proxy-node",
      "server": "your-server.com",
      "server_port": 443,
      "uuid": "your-uuid",
      "flow": "xtls-rprx-vision",
      "tls": { "enabled": true, "server_name": "your-server.com" }
    }
  ]
}

2. Surge 配置

在 Surge 的 [Proxy] 段添加 sing-box 节点。

[Proxy]
# 桥接到本地 sing-box
SingBox = socks5, 127.0.0.1, 7891

[Rule]
# 走 sing-box 转发的规则
DOMAIN-SUFFIX, google.com, SingBox
FINAL, DIRECT

为什么不直用 sing-box?

虽然 sing-box 协议全,但它在 macOS 上的日常使用体验还是不如 Surge:

  1. Dashboard:Surge 的实时流量监控和请求审计非常直观,排查网络问题很快。
  2. 自动化:Surge 可以根据当前连接的 WiFi (SSID) 自动切换出站策略(比如在公司直连,在家里代理)。
  3. 脚本能力:Surge 的 JS 脚本可以处理很多复杂的逻辑。

总结

这种分层架构的核心优势在于解耦。底层协议更新再快,你只需要维护轻量的 sing-box 后端,而上层复杂的 Surge 规则和脚本逻辑可以保持不动。这是一种兼顾交互体验与连接能力的方案。