从零打造 Linux TUN 全局代理客户端:sscli 架构与踩坑记录
一个轻量、原生 Linux、无 GUI 的 Shadowsocks 分流工具的诞生过程。从需求分析到架构选型,从核心实现到踩过的每一个坑。 为什么要做这个 市面上的代理工具很多,但很少有同时满足以下条件的: 纯命令行、无 GUI——跑在服务器/WSL 上,没有桌面环境 全局接管——所有应用流量自动分流,不需要每个程序单独设置代理环境变量 规则分流——国内直连、被墙的走代理,而不是一刀切全代理或全直连 轻量可控——不依赖 Clash/mihomo 那套大而全的框架,只要核心功能 Clash 系太重,simple-tun2socks 没有分流,tun2socks 只做协议转换不做路由决策。于是决定自己造一个。 架构设计 核心思路: TUN 网卡 + 用户态 TCP/IP 栈 + 规则引擎 + Shadowsocks 子进程 Linux / WSL │ 所有应用流量(无需设置任何代理环境变量) ▼ TUN 网卡 (sscli0) │ ▼ sscli 路由引擎(gvisor 用户态 TCP/IP 栈 + 规则匹配) │ ├──── DIRECT ──→ 直接出网(fwmark 防回环) │ └──── PROXY ───→ 本地 SOCKS5 → sslocal → VPS 关键选型 组件 选型 理由 TUN 设备 wireguard/tun (MIT) WireGuard 同款,稳定可靠,MIT 许可 用户态 TCP/IP 栈 gvisor netstack (Apache-2.0) sing-box/mihomo/tun2socks 同款,200 行就能桥接 TUN SOCKS5 客户端 x/net/proxy Go 标准库扩展,支持 UDP ASSOCIATE Shadowsocks 加密 shadowsocks-rust 的 sslocal 不自己实现加密,复用官方预编译二进制,安全可靠 为什么用 gvisor netstack 而不是直接处理 IP 包?因为 gvisor 提供了完整的 TCP/IP 协议栈——你只需要处理"这个连接走代理还是直连",TCP 三次握手、拥塞控制、重传这些脏活累活全由 gvisor 在用户态搞定。 ...