Apache Traffic Server 中的 Proxy Protocol 配置指南
什么是 Proxy Protocol
Proxy Protocol 是一种在代理基础设施各层之间传递连接信息的协议标准。在多层代理架构中,如果没有 Proxy Protocol,每个代理节点只能看到直接连接到它的前一跳节点的信息,而无法获取原始客户端的真实连接信息。
Apache Traffic Server (ATS) 支持通过 HTTP 或 TLS 连接使用 Proxy Protocol,能够处理版本 1 和版本 2 的 PROXY 头(虽然 ATS 目前不支持发送 TLV 格式的版本 2 负载)。
为什么需要 Proxy Protocol
在典型的代理链中:
- 客户端 → 负载均衡器 → ATS → 源服务器
- 如果没有 Proxy Protocol,源服务器只能看到来自 ATS 的连接
- ATS 只能看到来自负载均衡器的连接
- 原始客户端信息在传输过程中丢失
Proxy Protocol 通过在连接开始时添加特殊头部,将原始客户端信息一直传递到整个代理链的末端。
配置 Proxy Protocol
1. 启用 Proxy Protocol
Proxy Protocol 需要在每个预期接收 PROXY 头部的端口上单独启用。配置方法是通过 proxy.config.http.server_ports 参数。
启用后,传入请求可以带有 PROXY v1 或 v2 头部。没有 PROXY 头部的请求将按照端口配置中的其他指令处理。
2. 安全配置:IP 白名单
出于安全考虑,可以配置信任的 IP 地址列表:
proxy.config.http.proxy_protocol_allowlist = "192.168.1.0/24,10.0.0.1"
重要提示:如果配置了白名单,所有标记为 Proxy Protocol 的端口将只接受来自这些 IP 地址的请求,无论这些连接是否带有 Proxy Protocol 头部。
3. ACL 配置
默认情况下,ATS 使用对等方的客户端 IP 地址应用 ACL。如果启用了 PROXY 协议并希望基于 PROXY 协议传递的 IP 地址应用 ACL,需要在 proxy.config.acl.subjects 中包含 "PROXY"。
功能实现细节
HTTP Forwarded 头部
PROXY 协议头部中的客户端 IP 地址会通过 HTTP Forwarded 头部传递给源服务器。配置通过 proxy.config.http.insert_forwarded 参数控制。
PROXY 协议头部的检测是自动进行的。如果请求以 PROXY 头部开头,ATS 会自动解析并将其信息提供给发送给源服务器的 Forwarded 请求头部。
出站 PROXY 协议
出站 PROXY 协议的配置通过 proxy.config.http.proxy_protocol_out 参数控制。
实际应用示例
考虑以下拓扑结构:
客户端 (192.168.1.100) → 负载均衡器 (10.0.0.1) → ATS (10.0.0.2) → 源服务器
未使用 Proxy Protocol 的情况
如果客户端发起 TLS 连接,源服务器将看到连接来自 ATS (10.0.0.2):
Forwarded: for=10.0.0.2;by=10.0.0.1;proto=https;host=test000001.com
使用 Proxy Protocol 的情况
如果负载均衡器启用了 Proxy Protocol,ATS 将检测 PROXY 头部并将其转换为 Forwarded HTTP 头部。源服务器可以看到 TLS 连接实际来自客户端 (192.168.1.100):
Forwarded: for=192.168.2.100;by=10.0.0.2;proto=https;host=test000001.com
最佳实践建议
- 在生产环境中使用 Proxy Protocol 时,务必配置 IP 白名单以防止 IP 欺骗
- 在多层代理架构中,确保所有中间节点都正确支持 Proxy Protocol
- 对于 HTTPS 流量,Proxy Protocol 头部必须在 TLS 握手之前发送
- 监控日志以确保 Proxy Protocol 头部被正确解析和处理
总结
Proxy Protocol 是 Apache Traffic Server 中维护端到端连接信息完整性的重要功能,特别适用于多层代理架构。通过合理配置,可以确保原始客户端信息在整个代理链中不丢失,同时保持系统的安全性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



