四层代理透传客户端真实IP需代理侧启用PROXY Protocol v1、后端侧配置可信网段并解析头部;ESA中选TCP协议并开启PROXY传递,Nginx Stream需listen proxy_protocol且set_real_ip_from指定可信地址段。

要在四层代理中正确透传客户端原始 IP,核心是两端协同:代理侧开启 PROXY Protocol 封装,后端服务侧启用解析并信任来源。单独配置任一侧都会失败。
代理侧:在 ESA 或类似平台开启 PROXY Protocol
以阿里云边缘安全加速(ESA)为例:
- 进入站点管理 → 四层代理 → 配置 → 创建应用
- 在“代理规则”中,协议选 TCP(UDP 不支持 PROXY v1/v2 透传真实 IP)
- “客户端 IP 传递”选项必须设为 PROXY Protocol v1(ESA 当前仅支持 v1;CLB 等产品用 v2,注意区分)
- 保存后,ESA 会在每个 TCP 连接建立时,在数据流最开头插入一行形如
PROXY TCP4 192.0.2.1 198.51.100.1 12345 80\r\n的协议头
后端侧:Nginx Stream 层解析 PROXY 头
若后端使用 Nginx 做四层转发或直接承接流量,需在 stream { } 块中配置:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
listen 指令必须带
proxy_protocol,例如:listen 80 proxy_protocol; - 用
set_real_ip_from明确声明可信代理网段(如 ESA 的出口 IP 段、内网 SLB 地址或 CIDR),只允许来自这些地址的连接才替换源地址 - 推荐同时设置 IPv4 和 IPv6 可信段,例如:
set_real_ip_from 100.64.0.0/10;(阿里云私有地址段)、set_real_ip_from 2408:4000::/32; - 后续模块(如
proxy_pass、日志变量)将自动使用$realip_remote_addr替代$remote_addr
验证与常见问题
配置完成后需验证是否生效:
- 检查 Nginx error 日志,若出现
client sent invalid PROXY header,说明收到非 PROXY 流量或头部格式错误——确认前端代理已开启且未被中间设备(如防火墙、另一层 LB)截断或重写 - 在 access_log 中使用
$proxy_protocol_addr(HTTP 模块)或$realip_remote_addr(Stream 模块)输出,对比$remote_addr是否不同 - 若后端是自研服务(非 Nginx),需自行集成 PROXY Protocol v1 解析逻辑;不支持解析的服务开启该功能会导致连接异常甚至中断
- 注意:PROXY Protocol 是二进制/文本混合协议,不能通过 HTTP Header(如 X-Forwarded-For)方式传递,也不适用于七层场景
透传不是打开一个开关就能完成的事,关键是代理与后端对协议版本、信任边界和解析时机的理解保持一致。

















