实现客户端真实 IP 透传的协议 PROXY protocol 详解

目录

[什么是 PROXY protocol?](#什么是 PROXY protocol?)

工作原理

[PROXY protocol v1](#PROXY protocol v1)

[PROXY protocol v2](#PROXY protocol v2)

使用场景

实现与配置示例

[使用 PROXY protocol 注意事项](#使用 PROXY protocol 注意事项)

小结


在现代网络架构中,代理服务器发挥着至关重要的作用,可以提供缓存、负载均衡和安全等功能。代理服务器因为位于客户端和真实服务器之间,会接收来自客户端的原始连接,并向真实服务器发起新的连接,这就导致真实服务器无法直接获取到客户端的原始 IP 地址和其他相关信息,真实服务器所有信息都显示为来自代理服务器。

为了解决这个问题,HAProxy 提出了一个称为"PROXY protocol"的解决方案。通过使用该方案,代理服务器可以将客户端的真实信息封装在一个简单的头部中,并传递给后端服务器。这样,后端服务器就可以获取到客户端的 IP 地址、端口以及其他可能有用的信息,而无需对现有网络结构做出重大调整。

什么是 PROXY protocol?

PROXY protocol 是一种用于在代理服务器和后端服务器之间传输客户端连接信息的协议,旨在解决由于使用代理而导致的真实客户端信息丢失的问题。

工作原理

PROXY protocol 是应用在传输层的,位于传输协议(比如 TCP)之上。当客户端与服务器建立连接时,会在连接中添加一个包含了客户端连接信息的头信息。

具体来说,代理服务器在接收到来自客户端的连接请求后,会在与后端服务器建立连接之前,先发送一个 PROXY protocol 头信息。这个头信息详细记录了源 IP 地址、目标 IP 地址、源端口和目标端口等关键信息。后端服务器在接收到这些信息后,便可以根据客户端的实际信息进行日志记录、访问控制等操作。这样的设计使得后端服务器能够更准确地识别和处理来自客户端的请求。

PROXY protocol 有两个版本:v1 和 v2,接下来详细介绍下这两个版本。

PROXY protocol v1

PROXY protocol v1 是以文本形式传输连接信息的,易于阅读和调试。格式如下:

PROXY <protocol> <source-ip> <dest-ip> <source-port> <dest-port>\r\n

  • PROXY:标识头信息的开始。
  • <protocol> 可以是 TCP4或 TCP6,分别表示 IPv4和 IPv6的 TCP 连接,如果代理服务器无法确定具体的协议,则使用 UNKNOWN。
  • <source-ip>和<dest-ip>:客户端和代理服务器的 IP。
  • <source-port>和<dest-port>:客户端和服务器的端口。

示例如下:

PROXY TCP4 192.0.2.1 198.51.100.2 49152 80\r\n

意思是一个从 IP 地址 192.0.2.1(源 IP),端口 49152(源端口)到 IP 地址 198.51.100.2(目的 IP),端口 80(目的端口)的 IPv4 TCP连接。

Proxy Protocol v1 有如下局限性:

  • 因为是纯文本的,因此易被伪造,并且在某些情况下效率较低,尤其是在高吞吐量环境中。
  • 仅支持 TCP 协议,无法处理其他协议(如 UDP)。
  • 包含的元数据较少,无法扩展以包含更多信息。例如不包含 SSL/TLS 会话信息、时间戳等;

这些局限性在 PROXY protocol v2 中得到了解决,v2 采用了二进制格式,支持更多协议和扩展信息。

PROXY protocol v2

PROXY protocol v2 采用了二进制格式,消息由一个固定长度的签名和可变长度的命令部分组成。签名总是以十六进制数 0D0A0D0A000D0A515549540A 开始,紧接着是一个12字节的命令头,然后是可选的数据段。

签名部分共 16 字节,前12字节是固定的十六进制数 0D0A0D0A000D0A515549540A(用于识别 v2 协议),接下来1字节定义了协议版本和命令(如 PROXY 或 LOCAL),再往后的1字节表示使用的地址族(如 IPv4、IPv6)和传输协议(如 TCP、UDP),剩下的2字节表示可变部分的长度。

可变部分包含地址信息和 TLV 格式的扩展信息(可选字段,用于传递额外的元数据,如 SSL 信息、唯一连接标识符等。),地址信息根据地址族不同,长度和内容会有所不同。

  • IPv4:源 IP(4 字节)、目标 IP(4 字节)、源端口(2 字节)、目标端口(2 字节)。
  • IPv6:源 IP(16 字节)、目标 IP(16 字节)、源端口(2 字节)、目标端口(2 字节)。

示例如下(因为一个完整的 Proxy Protocol v2 消息看起来是一串难以辨认的二进制数据,但经过解析后可以得到类似以下的信息)

Version: 2

Address Family: IPv4

Transport Protocol: TCP

Source IP: 192.0.2.1

Destination IP: 198.51.100.2

Source Port: 49152

Destination Port: 80

PROXY protocol v2 解决了 v1 的局限性,有如下优势:

  • 更高效:二进制格式减少了数据传输和解析的开销。
  • 高扩展性:支持更多协议(如 UDP),并可通过 TLV 字段扩展功能。
  • 安全性:可以携带更多的安全相关信息,支持更复杂的访问控制。

使用场景

PROXY protocol 的使用场景包括但不仅限于如下场景:

  • 负载均衡器:如 HAProxy、Nginx、Apache HTTP Server 等,通过 Proxy Protocol 将客户端信息传递给后端服务器。
  • 代理服务器:例如在 Nginx 和后端应用服务器之间传递客户端信息。
  • VPN 和隧道:在 VPN 服务器和内部网络之间传递客户端信息。

实现与配置示例

大多数流行的代理软件如 HAProxy、Nginx、Apache HTTP Server 等都支持 PROXY protocol。配置起来是非常方便的,如下是一个 Nginx 的示例:

server {

listen 80 proxy_protocol;

set_real_ip_from 0.0.0.0/0;

real_ip_header proxy_protocol;

...

}

后端服务器也需要支持解析 PROXY protocol 头信息,流行的 WEB 框架和库大都内置了对 PROXY protocol 的支持,即使没有原生支持,也可以通过插件和模块轻松实现。

使用 PROXY protocol 注意事项

  • 确保代理和后端服务器都支持并正确配置 PROXY protocol。
  • 确保只有可信任的代理能够发送 PROXY protocol 头信息,以防止伪造。

小结

PROXY protocol 是一种重要的网络协议,解决了在代理服务器和后端服务器之间传递客户端信息的问题。通过简单的头信息,Proxy Protocol 使得后端服务器能够获取到客户端的真实IP地址和其他网络层信息,对于许多网络应用来说至关重要。

相关推荐
幽兰的天空8 小时前
介绍 HTTP 请求如何实现跨域
网络·网络协议·http
lisenustc8 小时前
HTTP post请求工具类
网络·网络协议·http
心平气和️8 小时前
HTTP 配置与应用(不同网段)
网络·网络协议·计算机网络·http
心平气和️8 小时前
HTTP 配置与应用(局域网)
网络·计算机网络·http·智能路由器
Gworg9 小时前
网站HTTP改成HTTPS
网络协议·http·https
Mbblovey9 小时前
Picsart美易照片编辑器和视频编辑器
网络·windows·软件构建·需求分析·软件需求
北顾南栀倾寒10 小时前
[Qt]系统相关-网络编程-TCP、UDP、HTTP协议
开发语言·网络·c++·qt·tcp/ip·http·udp
GZ_TOGOGO10 小时前
PIM原理与配置
网络·华为·智能路由器
7ACE10 小时前
Wireshark TS | 虚假的 TCP Spurious Retransmission
网络·网络协议·tcp/ip·wireshark·tcpdump
大丈夫立于天地间11 小时前
ISIS基础知识
网络·网络协议·学习·智能路由器·信息与通信