问题:大陆服务器上的"防火墙"
大陆机房服务器的日常痛点,每个运维都懂:
git cloneGitHub 仓库,克隆到一半断连、超时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 规则繁琐,
REDIRECTvsTPROXY的区别、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 的"手工拼装",它是更彻底、更现代、更好维护的答案。
发表评论