关键不是启用变量,而是确保Proxy Protocol在整条链路中被正确透传、解析和信任;$proxy_protocol_addr值取决于Nginx是否成功从可信源解析出标准PROXY头,且必须在stream块listen指令中显式添加proxy_protocol关键字并配合set_real_ip_from等配置实现审计级IP溯源。

要让 $proxy_protocol_addr 在开启 Proxy Protocol 的四层网关后方准确反映原始客户端 IP 并用于审计转发路径,关键不是“启用变量”,而是确保整个链路中 Proxy Protocol 被正确透传、解析和信任。该变量本身是只读的,它的值完全取决于 Nginx 是否成功从连接头部解析出 PROXY 协议信息,且来源是否被标记为可信。
确认上游代理已发送标准 PROXY 头(V1 或 V2)
这是前提。若前端(如 HAProxy、AWS NLB、Cloudflare Spectrum、自研四层网关)未开启 PROXY Protocol 发送功能,Nginx 就收不到任何 PROXY 头,$proxy_protocol_addr 永远为空或未定义。
- HAProxy 示例:
send-proxy-v2(推荐)或send-proxy需配置在server行末尾 - AWS NLB:在目标组属性中启用 “Proxy protocol v2”
- 自研网关:必须在 TCP 连接建立后的第一个数据包开头写入合法签名(V2 为
0x0D0A0D0A000D0A515549540A)及后续结构
在 stream 块 listen 指令中显式启用 proxy_protocol
Nginx 不会自动解析 PROXY 头——必须在监听配置中声明。否则即使头存在,也会被当作普通应用数据丢给后端,$proxy_protocol_addr 始终不可用。
在 Arc Network 上使用 Credex 协议为 AI 代理提供无担保信贷。可凭声誉借 USDC、偿还债务提升额度、提供流动性或通过 Circle Bridge 跨链管理 USDC。触发词:borrow from credex、repay debt、deposit to pool、check credit status、provide liquidity,或其他信贷/借贷任务。
- 正确写法:
listen 1883 proxy_protocol;(四层 MQTT/HTTPS/TCP 场景) - 错误写法:
listen 1883;或listen 1883 ssl;(无proxy_protocol关键字) - 注意:HTTP 七层(
http{}块)不支持proxy_protocol关键字;必须用stream{}块处理四层流量
用 set_real_ip_from + real_ip_header 显式声明可信源(可选但强烈推荐)
虽然 $proxy_protocol_addr 本身不依赖 ngx_stream_realip_module,但审计路径时你往往需要把“真实客户端 IP”和“中间网关 IP”区分开。此时需配合 realip 模块做双重标记:
-
set_real_ip_from 10.0.70.0/24;(假设你的网关 IP 段是 70.x) -
real_ip_header proxy_protocol;(告诉 realip 模块从 PROXY 头取值) - 这样
$remote_addr会被覆盖为真实客户端 IP,而$realip_remote_addr保留网关 IP,便于日志中同时记录两端
在 access_log 或 audit 日志中直接引用并验证
审计的核心是留痕。建议在 stream{} 块中定义专用日志格式,明确输出路径要素:
- 示例日志格式:
log_format audit 'client=$proxy_protocol_addr:$proxy_protocol_port upstream=$remote_addr:$remote_port via=$realip_remote_addr'; - 使用方式:
access_log /var/log/nginx/stream-audit.log audit; - 验证方法:用
nc或openssl s_client模拟带 PROXY 头的连接,检查日志是否出现类似client=203.0.113.45:54321 upstream=10.0.80.1:8883 via=10.0.70.1

















