Loading... # TLS Shunt TLS流量分流器技术分析 # 一、概述 ## 1. 项目背景 TLS Shunt Proxy 是一个专门用于分流 TLS 流量的工具,由 liberal-boy 开发并开源。该项目主要解决在同一端口上处理多种协议流量的需求,特别适用于 vmess + TLS + Web 方案实现,同时支持与 Trojan 共享端口。 ## 2. 核心功能 ### A. SNI 分流 根据 TLS Server Name Indication 扩展将流量分发到不同的虚拟主机 ### B. HTTP 和无特征流量分流 识别并分流 HTTP 流量和无特征的加密流量 ### C. 静态网站服务 内置静态网站服务器功能 ### D. 自动证书管理 支持从 LetsEncrypt 自动获取证书 # 二、技术架构 ## 1. 工作原理 ```mermaid graph LR A[客户端] -->|TLS 握手| B[TLS Shunt Proxy] B -->|SNI: vmess.example.com| C[VMess 后端] B -->|SNI: trojan.example.com| D[Trojan 后端] B -->|HTTP 流量| E[静态网站/代理] B -->|无特征流量| F[默认后端] ```  ## 2. 核心组件 ### A. 监听模块 - 支持 443 端口监听(HTTPS) - 支持 80 端口监听并重定向到 HTTPS - 可配置入站和出站缓冲区大小 ### B. TLS 处理模块 - TLS 卸载:可选择是否解密 TLS 流量 - 支持多种 TLS 协议版本(TLS 1.2、TLS 1.3) - 支持多种密钥类型(ed25519、p256、p384、rsa2048、rsa4096、rsa8192) ### C. 路由模块 - 按 SNI 分流 - 按 HTTP Path 分流 - 按 ALPN 协议分流(HTTP/1.1、HTTP/2、h2c) ### D. 处理器模块 - proxyPass:流量转发 - fileServer:静态文件服务 ## 3. 流量识别流程 ```mermaid sequenceDiagram participant C as 客户端 participant T as TLS Shunt participant V as VMess participant H as HTTP处理 participant S as 静态文件 C->>T: TLS 握手(携带 SNI) T->>T: 解析 SNI alt SNI = vmess.example.com T->>T: TLS 卸载 alt 流量是 HTTP T->>H: Path 匹配 H->>V: 转发到后端 H->>S: 静态文件服务 else 流量是 VMess T->>V: 直接转发 end else SNI = trojan.example.com T->>V: 不卸载 TLS,直接转发 end ```  # 三、配置详解 ## 1. 基础配置 ```yaml # 监听地址 listen: 0.0.0.0:443 # HTTP 到 HTTPS 重定向 redirecthttps: 0.0.0.0:80 # 入站缓冲区大小(KB) inboundbuffersize: 4 # 出站缓冲区大小(KB) outboundbuffersize: 32 ``` ## 2. 虚拟主机配置 每个虚拟主机对应一个 SNI,包含以下配置: ### A. TLS 卸载设置 ```yaml tlsoffloading: true # 是否解密 TLS ``` ### B. 证书配置 ```yaml managedcert: false # 是否自动管理证书 keytype: p256 # 密钥类型 cert: /path/to/cert # 证书路径 key: /path/to/key # 私钥路径 ``` ### C. 协议配置 ```yaml alpn: h2,http/1.1 # ALPN 协议 protocols: tls12,tls13 # TLS 版本范围 ``` ## 3. HTTP 流量处理 ```yaml http: paths: - path: /vmess/ws/ handler: proxyPass args: 127.0.0.1:40000 - path: /static/ trimprefix: /static handler: fileServer args: /var/www/static handler: fileServer args: /var/www/html ``` ## 4. HTTP/2 流量处理 ```yaml http2: - path: / handler: fileServer args: /var/www/rayfantasy - path: /vmess handler: proxyPass args: h2c://localhost:40002 ``` ## 5. 其他流量处理 ```yaml default: handler: proxyPass args: 127.0.0.1:40001 ``` # 四、部署方案 ## 1. 安装方法 ### A. Linux AMD64 自动安装 ```bash bash <(curl -L -s https://raw.githubusercontent.com/liberal-boy/tls-shunt-proxy/master/dist/install.sh) ``` ### B. 配置文件位置 /etc/tls-shunt-proxy/config.yaml ### C. 其他平台 需自行编译安装 ## 2. 系统服务配置 ### A. 赋予权限 ```bash sudo setcap "cap_net_bind_service=+ep" /usr/local/bin/tls-shunt-proxy ``` ### B. 运行用户 程序以 tls-shunt-proxy 用户身份运行 ### C. 调试运行 ```bash sudo -u tls-shunt-proxy /usr/local/bin/tls-shunt-proxy -config /etc/tls-shunt-proxy/config.yaml ``` ## 3. 典型部署场景 ### A. VMess + TLS + WebSocket ```yaml vhosts: - name: vmess.example.com tlsoffloading: true http: paths: - path: /vmess/ws/ handler: proxyPass args: 127.0.0.1:40000 handler: fileServer args: /var/www/html ``` ### B. Trojan 共享端口 ```yaml vhosts: - name: trojan.example.com tlsoffloading: false default: handler: proxyPass args: 127.0.0.1:8443 ``` ### C. 混合部署 ```yaml vhosts: - name: vmess.example.com tlsoffloading: true http: paths: - path: /vmess/ws/ handler: proxyPass args: 127.0.0.1:40000 - path: / handler: fileServer args: /var/www/html default: handler: proxyPass args: 127.0.0.1:40001 ``` # 五、技术特点 ## 1. 性能优化 ### A. 缓冲区配置 - 入站缓冲区:默认 4KB - 出站缓冲区:默认 32KB - 可根据吞吐量调整 ### B. 内存与 CPU 权衡 - 相同吞吐量和连接数下,缓冲区越大,内存消耗越大,CPU 消耗越少 - 低吞吐量场景,过大的缓冲区可能增加延迟 ## 2. 协议支持 ### A. TLS 协议 - TLS 1.2(仅支持 FS 且 AEAD 加密套件) - TLS 1.3 ### B. HTTP 协议 - HTTP/1.1 - HTTP/2 - h2c(HTTP/2 Cleartext) ### C. 密钥类型 - Ed25519 - P-256(默认) - P-384 - RSA 2048 - RSA 4096 - RSA 8192 ## 3. 高级功能 ### A. Proxy Protocol 支持 ```yaml args: 127.0.0.1:40001;proxyProtocol ``` ### B. Unix Socket 支持 ```yaml args: unix:/path/to/ds/file ``` ### C. Path 前缀修剪 ```yaml path: /static/ trimprefix: /static ``` # 六、故障排查 ## 1. 常见问题 ### A. 服务启动失败 **症状**:service 无法启动 **解决方案**: ```bash sudo setcap "cap_net_bind_service=+ep" /usr/local/bin/tls-shunt-proxy sudo -u tls-shunt-proxy /usr/local/bin/tls-shunt-proxy -config /etc/tls-shunt-proxy/config.yaml ``` ### B. 证书权限错误 **错误信息**:fail to load tls key pair for xxx.xxx: open /xxx/xxx.key: permission denied **解决方案**:确保 tls-shunt-proxy 用户有读取证书的权限 ### C. 流量未正确分流 **排查步骤**: 1. 检查 SNI 是否正确配置 2. 检查 tlsoffloading 设置是否正确 3. 检查 Path 匹配规则 4. 查看日志获取详细错误信息 ## 2. 调试技巧 ### A. 配置验证 使用测试配置文件运行,检查语法错误 ### B. 流量抓包 使用 tcpdump 或 Wireshark 分析流量特征 ### C. 日志分析 关注以下信息: - 连接建立日志 - SNI 解析结果 - 路由匹配结果 - 错误信息 # 七、最佳实践 ## 1. 安全配置 ### A. 证书管理 - 生产环境建议使用 managedcert 自动获取证书 - 确保 443 端口可被公网访问以满足 LetsEncrypt 要求 - 定期检查证书有效期 ### B. TLS 配置 - 优先使用 TLS 1.3 - 禁用不安全的加密套件 - 合理选择密钥类型(P-256 平衡性能和安全性) ## 2. 性能优化 ### A. 缓冲区调优 根据实际流量特征调整缓冲区大小: - 高吞吐量场景:增大缓冲区 - 低延迟场景:减小缓冲区 ### B. 连接复用 - 启用 HTTP/2 - 合理设置 keep-alive 超时 ## 3. 监控告警 ### A. 关键指标 - 连接数 - 流量分布 - 错误率 - 响应时间 ### B. 告警规则 - 连接数异常 - 证书即将过期 - 后端服务不可用 # 八、应用场景 ## 1. 科学上网服务 - VMess + TLS + WebSocket - Trojan 共享端口 - 多用户隔离 ## 2. Web 服务 - HTTPS 静态网站 - 反向代理 - 负载均衡 ## 3. 流量管理 - 按 SNI 分流 - 按 Path 分流 - 协议识别和分类 # 九、对比分析 ## 1. 与 Nginx 对比 | 特性 | TLS Shunt | Nginx | |------|-----------|-------| | SNI 分流 | 支持 | 支持 | | TLS 卸载 | 支持 | 支持 | | 无特征流量分流 | 支持 | 不支持 | | 配置复杂度 | 简单 | 较复杂 | | 性能 | 优秀 | 优秀 | ## 2. 与 HAProxy 对比 | 特性 | TLS Shunt | HAProxy | |------|-----------|---------| | 协议识别 | 精细化 | 基础 | | 配置方式 | YAML | 配置文件 | | 静态文件服务 | 内置 | 需配合后端 | | 学习曲线 | 平缓 | 陡峭 | # 十、总结 TLS Shunt Proxy 是一个功能强大、配置简单的 TLS 流量分流工具,特别适合需要在一个端口上处理多种协议的场景。其核心优势在于: 1. 精细化的流量识别和分流能力 2. 灵活的配置选项 3. 良好的性能表现 4. 简单的部署方式 对于需要实现 VMess + TLS + WebSocket、Trojan 或混合部署的用户来说,TLS Shunt Proxy 是一个理想的选择。 *** ## 参考资料 1. [TLS Shunt Proxy GitHub 仓库](https://github.com/liberal-boy/tls-shunt-proxy) 最后修改:2026 年 01 月 18 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏