send proxy2
send-proxy 和 send-proxy-v2 都是 PROXY Protocol,用于代理在 TCP 转发时把客户端连接信息(主要是 client IP/port)传给后端。区别主要在协议格式、扩展能力和适用场景。
1. PROXY Protocol v1 (send-proxy)
格式:
PROXY TCP4 <src_ip> <dst_ip> <src_port> <dst_port>\r\n
示例:
PROXY TCP4 192.168.1.100 10.0.0.20 54321 443\r\n
特点:
| 项目 | v1 |
|---|---|
| 格式 | 纯文本 ASCII |
| 解析 | 简单 |
| 调试 | 方便(tcpdump 可直接看到) |
| IPv4 | 支持 |
| IPv6 | 支持(TCP6) |
| TLV 扩展 | 不支持 |
| 长度 | 较长 |
2. PROXY Protocol v2 (send-proxy-v2)
格式:
+----------------+
| Signature |
+----------------+
| Version/Command|
+----------------+
| Family/Protocol|
+----------------+
| Length |
+----------------+
| Address |
+----------------+
| TLV |
+----------------+
固定签名:
0d0a0d0a000d0a515549540a
特点:
| 项目 | v2 |
|---|---|
| 格式 | 二进制 |
| 解析 | 更快 |
| 长度 | 更紧凑 |
| IPv4 | 支持 |
| IPv6 | 支持 |
| TLV 扩展 | 支持 |
| SSL 信息 | 支持 |
| ALPN | 支持 |
| SNI/Authority | 支持 |
3. TLS 场景区别
两者都可以用于 TLS passthrough。
正确顺序:
TCP connect
|
v
PROXY header
|
v
TLS ClientHello
|
v
TLS handshake
例如:
v1:
PROXY TCP4 1.2.3.4 10.0.0.1 50000 443\r\n
<ClientHello>
v2:
(binary PROXY v2 header)
<ClientHello>
TLS 本身不知道 v1/v2 的区别。
关键是:
后端必须先解析 PROXY,再启动 TLS。
4. 后端支持要求
v1:
后端需要支持:
PROXY TCP4 ...
例如:
read line until \r\n
parse client ip
start TLS
v2:
后端需要支持:
0d0a0d0a000d0a515549540a
然后解析:
address block
TLV
start TLS
5. v2 的优势:TLV
例如 v2 可以携带:
PP2_TYPE_SSL
PP2_TYPE_ALPN
PP2_TYPE_AUTHORITY
PP2_TYPE_UNIQUE_ID
可以传:
client IP
SNI=example.com
ALPN=h2
TLS version
connection id
v1 无法做到。
6. HAProxy 配置区别
HAProxy:
v1
server app 10.0.0.10:443 send-proxy
发送:
PROXY TCP4 ...
v2
server app 10.0.0.10:443 send-proxy-v2
发送:
binary PROXY v2
7. nginx 对应关系
nginx stream:
proxy_protocol on;
表示发送 PROXY Protocol。
但 nginx 没有 HAProxy 的:
send-proxy-v2
这种配置开关。
如果后端明确要求 PROXY v2:
-
使用 HAProxy/Envoy
-
或修改 nginx stream 模块
8. 如何选择
| 场景 | 推荐 |
|---|---|
| 只需要传 client IP | v1 足够 |
| 普通 TCP 服务 | v1 |
| 云 LB / Service Mesh | v2 |
| 需要 SNI/ALPN/TLS 信息 | v2 |
| IPv6 大规模环境 | v2 |
| 后端只支持某版本 | 必须匹配 |
对于你的场景(nginx stream -> SSL backend),核心不是 v1/v2 本身,而是:
-
后端支持哪一个版本;
-
后端是否在 TLS handshake 前解析 PROXY header。
如果后端只支持 send-proxy-v2,nginx 原生 stream 通常无法直接替代 HAProxy 的 send-proxy-v2。
浙公网安备 33010602011771号