通过GA加速应用服务时,若需要获取客户端真实IP地址,您可以启用GA的保持客户端源IP功能。使用七层监听时,可通过HTTP请求头的X-Forwarded-For
字段获取客户端真实IP地址;使用四层监听时,根据后端服务类型的不同,支持自动获取或需要适配Proxy Protocol来获取客户端真实IP地址。
仅智能路由类型监听支持保持客户端源IP;自定义路由类型监听默认不支持,如需保持客户端源IP,请向商务经理申请。
HTTP或HTTPS监听
获取方式
通过保持客户端源IP功能获取。该功能默认开启。
GA将客户端真实IP保存在HTTP请求头的X-Forwarded-For
字段中,后端服务器进行相应配置后即可获取。第一个IP即为客户端真实IP。
X-Forwarded-For: <客户端真实IP, 代理服务器1-IP, 代理服务器2-IP,...>
操作步骤
本文后端服务器以Alibaba Cloud Linux 3操作系统、Nginx 1.20.1版本配置为例介绍。具体请以您实际使用的环境为准。
在服务器执行
nginx -V | grep http_realip_module
命令,检查Nginx服务器是否安装了http_realip_module模块。Nginx使用http_realip_module模块解析X-Forwarded-For记录。如果返回信息中包括
--with-http_realip_module
,表示已安装http_realip_module模块,可进行下一步。Nginx 1.0.4 版本(2011年)开始支持http_realip_module 模块。如果您使用的Nginx版本过老,建议您备份配置数据并升级Nginx版本。
如果未安装http_realip_module模块,需要重新编译安装Nginx并安装http_realip_module 模块。操作较为繁琐,建议您使用类似yum的包管理器安装Nginx。
修改Nginx服务配置文件并保存,修改点可参考下方说明。执行
nginx -t
命令查看配置文件所在路径,默认通常为/etc/nginx/nginx.conf
,具体请以实际环境为准。http { # 确保设置$http_x_forwarded_for,该变量用于记录X-Forwarded-For的值 log_format main '$remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # ... }
执行
sudo nginx -s reload
命令,重新加载Nginx配置文件。获取客户端真实IP。
您可以通过检查Nginx日志来判断是否成功获取到了客户端的真实IP地址。
执行
tail -n <指定返回日志条数> <日志路径>
命令,在返回的日志信息中查看$http_x_forwarded_for
变量对应的字段,第一个IP地址即为客户端源IP。本文中,使用Nginx日志文件默认路径:
/var/log/nginx/access.log
。如果您为全球加速开启了健康检查,建议每次返回多条日志进行查看,或暂时将健康检查间隔时间范围调大,避免包含客户端源IP的日志信息被健康检查日志信息覆盖。
TCP监听
获取方式
通过保持客户端源IP功能获取。该功能开启后,需要选择获取客户端真实IP方式。
后端服务类型不同,支持的获取方式有所差异。
自动获取:直接透传客户端源IP,后端服务器获取到的客户端IP即为真实IP地址。
Proxy Protocol:后端服务器需要适配Proxy Protocol,方可获取客户端真实IP地址。
注意Proxy Protocol需要代理服务器和后端服务器都支持该协议才能正常使用。如果后端服务器不具备解析Proxy Protocol协议能力,直接打开特性开关,很可能会导致后端服务解析异常,从而影响服务可用性。
GA监听支持通过Proxy Protocol携带原始连接信息(源IP、目的IP、源端口、目的端口等)并添加到TCP数据头中,且不会丢弃或覆盖任何原有数据。
GA仅支持Proxy Protocol v1版本。Proxy Protocol v1版本仅支持TCP协议,更多信息,请参见The PROXY protocol。
后端服务类型 | 是否支持获取客户端源IP | 对应获取方式 | |
ECS | 支持 但必须为专有网络类型,且ECS所在安全组需放通所有客户端源IP。 |
| |
ALB | 不支持 | 不涉及 | |
NLB | 支持 |
| |
CLB | 支持 但需要CLB的后端服务器所在安全组放通所有客户端源IP。 请注意在以下情形中,后端服务器无法获取客户端源IP:
|
| |
OSS | 不支持 | 不涉及 | |
ENI | 支持 但需要ENI所在安全组放通所有客户端源IP。 |
| |
自定义私网IP | 支持 | Proxy Protocol | |
阿里云公网IP 当终端节点为阿里云公网IP时,如果该公网IP解绑原有实例并重新绑定至其他实例,可能会导致保持客户端源IP的能力失效,并造成流量中断。为恢复该终端节点保持客户端源IP的能力,您可以删除并重建相应的终端节点,或者联系商务经理协助处理。 | 绑定专有网络类型ECS实例 | 支持 |
|
绑定NLB实例 | 支持 |
| |
绑定ALB实例 | 不支持 | 不涉及 | |
绑定私网CLB实例 | 支持 |
| |
绑定ENI | 支持 |
| |
绑定公网NAT实例 | 支持 | Proxy Protocol |
后端服务类型 | 是否支持获取客户端源IP | 对应获取方式 |
自定义公网IP | 支持 | Proxy Protocol |
自定义域名 | 支持 |
客户端使用IPv6地址访问后端的IPv4服务的场景,均需要使用Proxy Protocol来获取客户端真实IP地址。
操作步骤
本文后端服务器以Alibaba Cloud Linux 3操作系统、Nginx 1.20.1版本配置为例介绍。具体请以您实际使用的环境为准。
开启保持客户端源IP。
登录全球加速管理控制台。
在实例列表页面,找到目标全球加速实例,在操作列单击配置监听。
在监听页签下,找到目标TCP监听,在操作列单击编辑监听。
在配置监听和协议配置向导页面,单击下一步。
在配置终端节点配置向导页面,在保持客户端源IP列表中选择保持,然后单击下一步。
当后端服务部署在阿里云上时,获取客户端真实IP方式默认选择为自动获取。
在配置审核页面,确认无误后,单击提交。
查看Nginx服务配置文件。
执行
nginx -t
命令查看配置文件所在路径,默认通常为/etc/nginx/nginx.conf
,具体请以实际环境为准。如果后端服务仅需要处理HTTP和HTTPS流量,则只需要确保Nginx服务器支持
http{}
模块;如果后端服务还需要处理TCP流量,则需确保Nginx服务器已支持stream{}
模块。自Nginx 1.9.0版本起,新增了
stream{}
模块,但该模块并不默认安装,需自行编译安装以实现对stream{}
模块的支持。#处理HTTP流量 http { # 默认配置 log_format main '$remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; # 以80监听端口为例 server { listen 80; #... } } #处理TCP流量(可按需增加) stream { log_format main_stream '$remote_addr - [$time_local] ' '"$protocol" $status $bytes_sent $bytes_received ' '"$session_time"'; access_log /var/log/nginx/stream_access.log main_stream; # 以4000监听端口为例 server { listen 4000; #... } }
获取客户端源IP。
方式1:您可以通过检查Nginx日志来判断是否成功获取到了客户端的真实IP地址。
执行
tail -n <指定返回日志条数> <日志路径>
命令,在返回的日志信息中查看第一个IP地址($remote_addr
变量对应的字段),即为客户端源IP。对于HTTP流量:
本文场景中,日志文件路径为:
/var/log/nginx/access.log
。对于TCP流量:
本文场景中,日志文件路径为:
/var/log/nginx/stream_access.log
。
方式2:您可以通过抓取数据包来判断是否成功获取到了客户端的真实IP地址。
执行
tcpdump tcp port [监听端口] -n -X -s 0
命令,从抓取的数据包中查看客户端真实IP地址。
开启保持客户端源IP。
登录全球加速管理控制台。
在实例列表页面,找到目标全球加速实例,在操作列单击配置监听。
在监听页签下,找到目标TCP监听,在操作列单击编辑监听。
在配置监听和协议配置向导页面,单击下一步。
在配置终端节点配置向导页面,在保持客户端源IP页签下选择保持,然后单击下一步。
当后端服务部署在非阿里云上时,获取客户端真实IP方式默认选择为ProxyProtocol。
在配置审核页面,确认无误后,单击提交。
修改Nginx服务配置文件并保存,修改点可参考下方说明。
执行
nginx -t
命令查看配置文件所在路径,默认通常为/etc/nginx/nginx.conf
,具体请以实际环境为准。如果后端服务仅需要处理HTTP和HTTPS流量,则只需要确保Nginx服务器支持
http{}
模块;如果后端服务还需要处理TCP流量,则需确保Nginx服务器已支持stream{}
模块。自Nginx 1.9.0版本起,新增了
stream{}
模块,但该模块并不默认安装,需自行编译安装以实现对stream{}
模块的支持。#处理HTTP流量 http { #确保在http{}模块的日志格式中添加保存客户端源IP的变量$proxy_protocol_addr log_format main '$proxy_protocol_addr - $remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; # 以80监听端口为例,开启解析proxy_protocol server { listen 80 proxy_protocol; #... } } #处理TCP流量(可按需增加) stream { #确保在stream{}模块的日志格式中添加保存客户端源IP的变量$proxy_protocol_addr log_format main_stream '$proxy_protocol_addr - $remote_addr - $protocol [$time_local] ' '$status $bytes_sent $bytes_received $session_time'; access_log /var/log/nginx/stream_access.log main_stream; # 以12345监听端口为例,开启解析proxy_protocol server { listen 12345 proxy_protocol; #... } }
执行
sudo nginx -s reload
命令,重新加载Nginx配置文件。获取客户端源IP。
您可以通过检查Nginx日志来判断是否成功获取到了客户端的真实IP地址。
执行
tail -n <指定返回日志条数> <日志路径>
命令,在返回的日志信息中查看$proxy_protocol_addr
变量对应的IP地址,即为客户端源IP。对于HTTP流量:
本文场景中,日志文件路径为:
/var/log/nginx/access.log
。对于TCP流量:
本文场景中,日志文件路径为:
/var/log/nginx/stream_access.log
。
UDP监听
获取方式
通过保持客户端源IP功能获取。该功能开启后,默认仅支持自动获取方式,GA直接透传客户端源IP,后端服务器获取到的客户端IP即为真实IP地址。
UDP监听开启保持客户端源IP,有以下限制:
仅按量付费的GA实例支持。
如果您的按量付费GA实例不支持为UDP监听开启保持客户端源IP,可能是由于实例版本不支持。如需使用,请向商务经理申请升级实例。
仅支持后端服务类型为NLB、ECS、ENI。其中,NLB类型的保持客户端源IP功能默认不开放,如需使用,请向商务经理申请。
仅支持获取IPv4客户端源IP,不支持获取IPv6客户端源IP。
操作步骤
本文后端服务器以Alibaba Cloud Linux 3操作系统、Nginx 1.20.1版本配置为例介绍。具体请以您实际使用的环境为准。
开启保持客户端源IP。
登录全球加速管理控制台。
在实例列表页面,找到目标全球加速实例,在操作列单击配置监听。
在监听页签下,找到目标UDP监听,在操作列单击编辑监听。
在配置监听和协议配置向导页面,单击下一步。
在配置终端节点配置向导页面,在保持客户端源IP页签下选择保持,然后单击下一步。
此时,获取客户端真实IP方式默认选择为自动获取。
在配置审核页面,确认无误后,单击提交。
查看Nginx服务配置文件。
执行
nginx -t
命令查看配置文件所在路径,默认通常为/etc/nginx/nginx.conf
,具体请以实际环境为准。后端服务处理UDP流量,需确保Nginx服务器已支持
stream{}
模块。自Nginx 1.9.0版本起,新增了
stream{}
模块,但该模块并不默认安装,需自行编译安装以实现对stream{}
模块的支持。#... #处理UDP流量(请确保包括该模块) stream { log_format main_stream '$remote_addr - [$time_local] ' '"$protocol" $status $bytes_sent $bytes_received ' '"$session_time"'; access_log /var/log/nginx/stream_access.log main_stream; # 以UDP 4000监听端口为例 server { listen 4000 udp; #... } }
获取客户端源IP。
方式1:您可以通过检查Nginx日志来判断是否成功获取到了客户端的真实IP地址。
执行
tail -n <指定返回日志条数> <日志路径>
命令,在返回的日志信息中查看第一个IP地址($remote_addr
变量对应的字段),即为客户端源IP。本文场景中,日志文件路径为:
/var/log/nginx/stream_access.log
。方式2:您可以通过抓取数据包来判断是否成功获取到了客户端的真实IP地址。
执行
tcpdump udp port [监听端口] -n -X -s 0
命令,从抓取的数据包中查看客户端真实IP地址。
常见问题
保持客户端源IP功能开启后不生效,可能是哪些原因?
HTTP或HTTPS监听下,如果后端服务器不支持记录和处理
X-Forwarded-For
字段,则开启保持客户端源IP功能后不生效。TCP监听下:
后端服务部署地为阿里云时,如果后端实例或阿里云公网IP绑定实例不是专有网络类型实例,则开启保持客户端源IP功能后不生效。
后端服务部署地为非阿里云时, 需要后端服务器支持解析Proxy Protocol,才能获取到客户端源IP信息,否则不生效。
因为在您开启保持客户端源IP功能的情况下,全球加速会使用Proxy Protocol保持客户端源IP,如果您的后端服务器不支持解析Proxy Protocol,则会导致后端服务器无法正确解析加速流量。
客户端使用IPv6地址访问后端的IPv4服务时,需要后端服务器支持解析Proxy Protocol,才能获取到客户端源IP信息,否则不生效。
UDP监听下,如果客户端使用IPv6地址访问后端的IPv4服务时,则开启保持客户端源IP功能后不生效。
如何关闭保持客户端源IP功能?
对于HTTP或HTTPS监听,默认开启保持客户端源IP功能,无法关闭。
对于TCP及UDP监听,您可以直接在控制台进行关闭。操作步骤如下:
在实例列表页面,找到目标全球加速实例,在操作列单击配置监听。
在监听页签下,找到目标监听,在操作列单击编辑监听。
在配置监听和协议配置向导页面,单击下一步。
在配置终端节点配置向导页面,配置保持客户端源IP为不保持,然后单击下一步。
在配置审核配置向导页面,确认无误后,单击提交。
全球加速IPv6转换IPv4时如何获取客户端源IP?
针对HTTP或HTTPS监听:IPv6客户端与IPv4客户端均仅支持通过HTTP请求头的
X-Forwarded-For
字段获取客户端源IP。针对TCP监听:IPv6客户端仅支持ProxyProtocol方式。ProxyProtocol方式需要后端服务器支持解析Proxy Protocol,才能获取到客户端源IP信息,否则访问会失败。
针对UDP监听:不支持获取IPv6客户端源IP。
相关文档
您还可以通过GA的访问日志功能获取客户端源IP,通过为目标终端节点组创建访问日志,采集到的访问日志将会投递到终端节点组所在地域SLS的日志库中。在对应日志库页面的原始日志页签下,通过client_ip字段查看客户端源IP的访问请求信息。
了解关于终端节点组后端服务更多配置信息及注意事项,请参见终端节点组与终端节点和添加和管理智能路由类型监听的终端节点组。
您可以在调用以下API时,通过参数EnableClientIPPreservation
(自动获取方式)和EnableProxyProtocol
(ProxyProtocol 方式)配置获取客户端真实IP的方式。