作为一个网络加速服务,全球加速充当了客户端和您的应用程序之间的四层代理。默认情况下,您的应用程序接收到的源 IP 地址是位于终端节点区域的边缘节点的 IP 地址,而非原始客户端的 IP。
然而,许多应用程序的运行依赖真实的客户端 IP。例如,基于 IP 的访问控制、限流、流量分析。诸如火山引擎内容分发网络这类七层反向代理可以使用如 X-Forwarded-For
之类的 HTTP 请求头来传递客户端真实 IP,但这些技术在四层代理中并无法实现。
为满足这一需求,全球加速支持使用 Proxy Protocol 保留客户端源 IP。支持以下 Proxy Protocol 版本:
Proxy Protocol v1:仅支持 TCP。加速器会在 TCP 报文的有效载荷(Payload)部分的开头添加一个 ASCII 编码的 Proxy Protocol v1 头部,用来传递客户端 IP 及端口。
Proxy Protocol v2:支持 TCP 和 UDP。加速器会在 TCP 或 UDP 报文的 Payload 部分的开头添加一个二进制编码的 Proxy Protocol v2 头部,用来传递客户端 IP 及端口。
说明
对于基于 UDP 协议的流量,全球加速允许的 UDP 报文中 Payload 长度上限为 1380 字节。但由于 Proxy Protocol v2 头部的需要占用 28~52 字节的 Payload 用作协议头部,您需要将客户端发送的 UDP 报文 Payload 的数据量控制在更小的值。
您可以通过编辑终端节点组来设置 保持客户端源 IP 属性。具体步骤如下:
登录火山引擎全球加速控制台。
在左侧导航栏,点击 加速器管理 > 标准型加速器 。
在 标准型加速器 页面,点击需要配置的加速器的名称。
点击 监听,进入 监听 页面后,选择需要配置的监听器。
在 终端节点组 标签页,找到需要配置的终端节点组,在 操作 栏点击 编辑 。
在 编辑终端节点组 标签页,开启 保持客户端源 IP,根据您的后端应用对 Proxy Protocol 的支持情况以及您的监听协议,选择 Proxy Protocol 协议版本,然后点击 确认。
您的后端服务器需要支持解析 Proxy Protocol 传递的客户端连接信息,才能获取客户端源 IP 。以 Nginx 为例,配置 Nginx 只需将 proxy_protocol 参数添加到 server 块中的 listen 指令后。
http { #... server { listen 80 proxy_protocol; #在80端口,开启解析proxy protocol。 #... } } stream { #... server { listen 8080 proxy_protocol; #在8080端口,开启解析proxy protocol。 #... } }
您可在 Nginx 访问日志中查看客户端源 IP ,具体步骤如下:
http{}
模块和stream{}
模块的日志格式,添加保存客户端源 IP 的变量 proxy_protocol_addr
,从而将客户端源 IP 信息保存到访问日志中。http { log_format combined '$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; } stream { log_format basic '$proxy_protocol_addr - [$time_local] ' '$protocol $status $bytes_sent $bytes_received ' '$session_time'; }
tail -n 5 <日志路径>
命令查看日志信息,日志中每条访问记录的第一个 IP 地址即为客户端源 IP。