sing-box:大陆服务器上的透明分流利器

问题:大陆服务器上的"防火墙"

大陆机房服务器的日常痛点,每个运维都懂:

  • git clone GitHub 仓库,克隆到一半断连、超时
  • docker pull 官方镜像仓库,进度条卡死
  • pip install / npm install 海外源,慢如蜗牛
  • 想连 Google 系 API,直接不可达
  • 更隐蔽的:DNS 污染/劫持,域名解析到错误 IP,业务流量被"换包"

常规方案为什么不彻底

最常见的做法是 http_proxy / socks5 环境变量:

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

它有几个硬伤:

  • 只对显式支持代理协议的程序生效。docker daemon 要单独配 proxy 配置、git 要单独配、很多 CLI 工具根本不认环境变量,漏一个程序就裸连被墙
  • 环境变量是全局侵入。curl 一个内网地址也会先走代理,日志里到处都是代理 IP,还可能误伤内网流量
  • DNS 不处理。环境变量代理只代理 TCP 数据,域名解析还是本地 DNS 做——污染/劫持问题依旧存在
  • 按进程粒度配置。服务器上跑着几十个进程,不可能每个都去配

sing-box:TUN 透明分流

sing-box 的思路完全不同:它创建一张虚拟网卡(TUN),在内核层面接管整个系统的流量。所有应用的流量先进这张虚拟网卡,进入用户态后由 sing-box 按规则路由,应用完全无感知——不配任何环境变量,所有程序(包括 docker daemon、包管理器、任意 CLI)自动被分流。

配合DNS 分流和规则集,可以做到:

  • 国内域名(geosite-cn)→ 大陆 DNS(如 223.5.5.5)解析,大陆出口直连
  • 海外域名 → 海外 DNS(如 8.8.8.8,通过代理链路转发)解析,从源头杜绝污染
  • 流量按 geosite/geoip 规则自动分流,无需逐进程配置

单机双 IP + 远端代理的典型架构

很多大陆服务器有双出口(一条大陆线路、一条香港/海外线路),或者有一台海外 VPS 做代理。sing-box 可以把这两者组合成一套完整的分流体系:

"outbounds": [
  { "type": "direct", "tag": "direct-mainland", "bind_interface": "eth2" },
  { "type": "direct", "tag": "direct-hongkong", "bind_interface": "eth1" },
  {
    "type": "vless",
    "tag": "proxy-hk",
    "server": "你的香港VPS地址",
    "server_port": 443,
    "uuid": "...",
    "tls": { "enabled": true }
  }
],
"route": {
  "rules": [
    { "rule_set": ["geoip-cn", "geosite-cn"], "action": "route", "outbound": "direct-mainland" }
  ],
  "final": "proxy-hk"
}

要点:

  • 国内流量:geoip-cn / geosite-cn 命中 → direct-mainland 直连,延迟最低,不浪费代理带宽
  • 海外流量:未命中规则 → final: proxy-hk,走香港 VPS 的 vless/trojan 隧道,彻底翻墙
  • DNS:国内域名走大陆 DNS,海外域名走香港 DNS(detour 到代理链路),双保险防污染
  • 单机只有一根出口线的场景也一样:把 direct-mainland 换成默认直连,海外流量全部走代理即可

为什么比 tproxy 更现代

Linux 上做透明代理,老派方案是 tproxy + iptables/nftables。tproxy 本身没错,但用它搭一套完整分流要面对:

  • iptables/nftables 规则繁琐,REDIRECT vs TPROXY 的区别、IPv4/IPv6 双栈规则、UDP 处理,边界情况极多
  • DNS 劫持要自己用 dnsmasq/iptables 拼装
  • 规则更新(geoip 数据库)要自己下载、转换、重载 iptables
  • 换一台机器就要重新调一遍,可迁移性差

sing-box 把这些全部收敛进一个配置文件:路由规则、DNS 分流、出站选择都是声明式配置,规则集(geosite/geoip)自动从远端更新,配置即代码,迁移成本几乎为零。它还自带 sniff(流量探测)、直连/代理健康检查、负载均衡等能力,生态比 tproxy 时代完整得多。

小结

在无法直接访问 GitHub、Docker Registry、Google 的大陆服务器上,sing-box 用一张虚拟网卡 + 声明式规则,把"国内直连、海外代理"的分流做到了系统级透明:不需要为每个程序配代理,不污染环境变量,不依赖脆弱的 DNS,配置可版本化、可迁移。相比 http_proxy/socks5 的"半吊子代理"和 tproxy 的"手工拼装",它是更彻底、更现代、更好维护的答案。

发表评论