通过 PROXY Protocol v1/v2 协议获取客户端真实 IP

在使用代理服务器时,原始连接的参数(如原始IP地址、原始端口等)可能会丢失,因为代理服务器会重新封装并转发请求,导致目标服务器只能看到代理服务器的信息,而PROXY Protocol通过在连接建立初期传递客户端的真实信息来解决这一问题,从而提高安全性、准确性和合规性。

协议介绍

  • PROXY Protocol(本文简称PP),对系统内核没有要求,需要应用程序配合修改,通过解析文本字符串来获取客户端IP。目前NGINX和HAProxy都已经支持该协议。

  • PP方式获取IP需要在控制台选择该协议,功能打开后,加速服务器和源站将建立TCP连接,在传输第一个用户的实际请求数据前,会先传递PP协议文本。

协议差异

协议

PROXY Protocol v1

PROXY Protocol v2

格式

ASCII文本格式。

二进制格式。

支持协议

支持TCP。

支持TCP。

安全性

无加密或认证机制,数据容易被篡改,安全性相对较低。

引入了TLS握手信息,安全性较高。

灵活性

固定格式,扩展性有限,灵活性较低。

可变长度,支持多种扩展信息,灵活性较高。

场景

只需要简单的 TCP 代理并且对安全性要求不高,可以选择Proxy Protocol V1

需要支持 TCP或者需要更高的安全性,建议使用Proxy Protocol V2

TCP启用代理协议PROXY Protocol v1

ESA 会在每个入站 TCP 连接的前面添加代理协议 PROXY Protocol v1标头

  1. 登录ESA控制台

  2. 在左侧导航栏,单击站点管理

  3. 站点管理页面,单击目标站点名称,或对应站点操作列的详情

  4. 在左侧导航栏,选择四层代理 > 配置

  5. 单击创建应用,配置四层应用参数。在下拉列表中选择PROXY Protocol v1

    image

  6. 单击确认

代理协议 PROXY Protocol v1标头

PROXY Protocol 协议在每个连接的开头附加一个纯文本标头,用于报告客户端的 IP 地址和端口号。格式为:

PROXY_STRING + single space + INET_PROTOCOL + single space + CLIENT_IP + single space + PROXY_IP + single space + CLIENT_PORT + single space + PROXY_PORT + "\r\n"

IPv4地址的示例:

PROXY TCP4 10.10.10.10 192.168.0.1 12345 80\r\n
image

IPv6地址的示例:

PROXY TCP6 2001:db8:: 2001:db8:ffff:ffff:ffff:ffff:ffff:ffff 12345 443\r\n

TCP启用代理协议PROXY Protocol v2

边缘安全加速 ESA会在每个入站 TCP 连接的前面添加代理协议 PROXY Protocol v2 标头

  1. 登录ESA控制台

  2. 在左侧导航栏,单击站点管理

  3. 站点管理页面,单击目标站点名称,或对应站点操作列的详情

  4. 在左侧导航栏,选择四层代理 > 配置

  5. 单击创建应用,配置四层应用参数。在协议中选择TCP,在客户端IP传递下拉列表中选择PROXY Protocol v2

    image

  6. 单击确认

代理协议 PROXY Protocol v2 标头

PROXY 协议在每个连接的开头附加一个报告客户端地址和端口的标头。

IPv4地址的PROXY 协议二进制标头格式

image

IPv6地址的PROXY 协议二进制标头格式

image