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. 工作原理
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. 流量识别流程
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. 基础配置
# 监听地址
listen: 0.0.0.0:443
# HTTP 到 HTTPS 重定向
redirecthttps: 0.0.0.0:80
# 入站缓冲区大小(KB)
inboundbuffersize: 4
# 出站缓冲区大小(KB)
outboundbuffersize: 322. 虚拟主机配置
每个虚拟主机对应一个 SNI,包含以下配置:
A. TLS 卸载设置
tlsoffloading: true # 是否解密 TLSB. 证书配置
managedcert: false # 是否自动管理证书
keytype: p256 # 密钥类型
cert: /path/to/cert # 证书路径
key: /path/to/key # 私钥路径C. 协议配置
alpn: h2,http/1.1 # ALPN 协议
protocols: tls12,tls13 # TLS 版本范围3. HTTP 流量处理
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/html4. HTTP/2 流量处理
http2:
- path: /
handler: fileServer
args: /var/www/rayfantasy
- path: /vmess
handler: proxyPass
args: h2c://localhost:400025. 其他流量处理
default:
handler: proxyPass
args: 127.0.0.1:40001四、部署方案
1. 安装方法
A. Linux AMD64 自动安装
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. 赋予权限
sudo setcap "cap_net_bind_service=+ep" /usr/local/bin/tls-shunt-proxyB. 运行用户
程序以 tls-shunt-proxy 用户身份运行
C. 调试运行
sudo -u tls-shunt-proxy /usr/local/bin/tls-shunt-proxy -config /etc/tls-shunt-proxy/config.yaml3. 典型部署场景
A. VMess + TLS + WebSocket
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/htmlB. Trojan 共享端口
vhosts:
- name: trojan.example.com
tlsoffloading: false
default:
handler: proxyPass
args: 127.0.0.1:8443C. 混合部署
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 支持
args: 127.0.0.1:40001;proxyProtocolB. Unix Socket 支持
args: unix:/path/to/ds/fileC. Path 前缀修剪
path: /static/
trimprefix: /static六、故障排查
1. 常见问题
A. 服务启动失败
症状:service 无法启动
解决方案:
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.yamlB. 证书权限错误
错误信息:fail to load tls key pair for xxx.xxx: open /xxx/xxx.key: permission denied
解决方案:确保 tls-shunt-proxy 用户有读取证书的权限
C. 流量未正确分流
排查步骤:
- 检查 SNI 是否正确配置
- 检查 tlsoffloading 设置是否正确
- 检查 Path 匹配规则
- 查看日志获取详细错误信息
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 流量分流工具,特别适合需要在一个端口上处理多种协议的场景。其核心优势在于:
- 精细化的流量识别和分流能力
- 灵活的配置选项
- 良好的性能表现
- 简单的部署方式
对于需要实现 VMess + TLS + WebSocket、Trojan 或混合部署的用户来说,TLS Shunt Proxy 是一个理想的选择。