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

更新时间:

在使用代理的时候,通常会导致原始连接的参数丢失,例如原始IP地址、原始端口等。在PROXY Protocol v1/v2 协议使用的场景下,可以借助该文档获取到客户端真实的IP。

协议介绍

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

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

Nginx配置

配置Nginx接受PP,只需要将参数proxy_protocol添加在server块中的listen指令后,详情请参考Accepting the PROXY Protocol

http {
    #...
    server {
        listen 80 proxy_protocol;
        listen 443 ssl proxy_protocol;
        #...
    }
}
说明

HAProxy对PP的应用支持请参考HAProxy Proxy Protocol

不支持PP的应用配置

不支持PP的应用程序,需要在TCP连接建立后,读取PP的文本行并对字符串进行解析来获取客户端IP,字符串实例如下所示。

PROXY TCP4 10.10.10.10 192.168.0.1 12345 80\r\n

解析时先读取行直至遇到\n,再按照协议进行解析,各字段的定义如下。

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

真实输出的PP文本行相对以上格式,在\r\n之前可能还包含全局唯一的ID,用于全链路监控,如果不需要,您可以忽略它。