保持客户端源IP

更新时间:2025-03-10 06:45
重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

通过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版本配置为例介绍。具体请以您实际使用的环境为准。

  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模块,可进行下一步。

    已安装http_realip_module模块返回信息示例

    nginx version: nginx/1.20.1
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
    built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
    TLS SNI support enabled
    configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-google_perftools_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'
    
    说明
    • Nginx 1.0.4 版本(2011年)开始支持http_realip_module 模块。如果您使用的Nginx版本过老,建议您备份配置数据并升级Nginx版本。

    • 如果未安装http_realip_module模块,需要重新编译安装Nginx并安装http_realip_module 模块。操作较为繁琐,建议您使用类似yum的包管理器安装Nginx。

  2. 修改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"';
      
      # ...
    }
    

  3. 执行sudo nginx -s reload命令,重新加载Nginx配置文件。

  4. 获取客户端真实IP。

    您可以通过检查Nginx日志来判断是否成功获取到了客户端的真实IP地址。

    执行tail -n <指定返回日志条数> <日志路径>命令,在返回的日志信息中查看$http_x_forwarded_for变量对应的字段,第一个IP地址即为客户端源IP。

    本文中,使用Nginx日志文件默认路径:/var/log/nginx/access.log

    HTTP XFF 日志.png

    说明

    如果您为全球加速开启了健康检查,建议每次返回多条日志进行查看,或暂时将健康检查间隔时间范围调大,避免包含客户端源IP的日志信息被健康检查日志信息覆盖。

TCP监听

获取方式

通过保持客户端源IP功能获取。该功能开启后,需要选择获取客户端真实IP方式。

后端服务类型不同,支持的获取方式有所差异。

  • 自动获取:直接透传客户端源IP,后端服务器获取到的客户端IP即为真实IP地址。

  • Proxy Protocol:后端服务器需要适配Proxy Protocol,方可获取客户端真实IP地址。

    什么是Proxy Protocol?

    Proxy Protocol是一种通信协议,用于在代理服务器和后端服务器之间传递客户端的原始网络连接信息。

    通常情况下,代理服务器在转发客户端请求到后端服务器时会重写请求头部,将客户端的源IP地址和端口等信息替换为代理服务器自身的信息。这样后端服务器就无法获得客户端的真实网络连接信息。

    而使用Proxy Protocol,代理服务器在转发请求时将客户端的原始网络连接信息封装在请求头部中,发送给后端服务器。后端服务器通过解析Proxy Protocol头部,就可以获得客户端的真实网络连接信息,包括源IP地址、源端口以及传输协议等。

    通过使用Proxy Protocol,后端服务器可以准确获取客户端的原始网络连接信息,从而进行更准确的日志记录、访问控制、流量监控等操作。

    重要
    • 注意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。

  • 自动获取

  • Proxy Protocol

ALB

不支持

不涉及

NLB

支持

  • 自动获取(仅当NLB实例后端服务器类型为ECS或ENI时支持)

  • Proxy Protocol

CLB

支持

但需要CLB的后端服务器所在安全组放通所有客户端源IP。

请注意在以下情形中,后端服务器无法获取客户端源IP:

  • 您的CLB实例的后端服务器为经典网络类型的ECS实例。

  • 您的CLB实例的监听协议为HTTP或HTTPS。

  • 自动获取(仅当CLB实例后端服务器类型为ECS或ENI时支持)

  • Proxy Protocol

OSS

不支持

不涉及

ENI

支持

但需要ENI所在安全组放通所有客户端源IP。

  • 自动获取

  • Proxy Protocol

自定义私网IP

支持

Proxy Protocol

阿里云公网IP

警告

当终端节点为阿里云公网IP时,如果该公网IP解绑原有实例并重新绑定至其他实例,可能会导致保持客户端源IP的能力失效,并造成流量中断。为恢复该终端节点保持客户端源IP的能力,您可以删除并重建相应的终端节点,或者联系商务经理协助处理。

绑定专有网络类型ECS实例

支持

  • 自动获取

  • Proxy Protocol

绑定NLB实例

支持

  • 自动获取(仅当NLB实例后端服务器类型为ECS或ENI时支持)

  • Proxy Protocol

绑定ALB实例

不支持

不涉及

绑定私网CLB实例

支持

  • 自动获取(仅当CLB实例后端服务器类型为ECS或ENI时支持)

  • Proxy Protocol

绑定ENI

支持

  • 自动获取

  • Proxy Protocol

绑定公网NAT实例

支持

Proxy Protocol

后端服务类型

是否支持获取客户端源IP

对应获取方式

自定义公网IP

支持

Proxy Protocol

自定义域名

支持

说明

客户端使用IPv6地址访问后端的IPv4服务的场景,均需要使用Proxy Protocol来获取客户端真实IP地址。

操作步骤

本文后端服务器以Alibaba Cloud Linux 3操作系统、Nginx 1.20.1版本配置为例介绍。具体请以您实际使用的环境为准。

自动获取
通过Proxy Protocol获取
  1. 开启保持客户端源IP。

    1. 登录全球加速管理控制台

    2. 实例列表页面,找到目标全球加速实例,在操作列单击配置监听

    3. 监听页签下,找到目标TCP监听,在操作列单击编辑监听

    4. 配置监听和协议配置向导页面,单击下一步

    5. 配置终端节点配置向导页面,在保持客户端源IP列表中选择保持,然后单击下一步

      当后端服务部署在阿里云上时,获取客户端真实IP方式默认选择为自动获取

      image.png

    6. 配置审核页面,确认无误后,单击提交

  2. 查看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;
            #...
        }
    }
  3. 获取客户端源IP。

    • 方式1:您可以通过检查Nginx日志来判断是否成功获取到了客户端的真实IP地址。

      执行tail -n <指定返回日志条数> <日志路径>命令,在返回的日志信息中查看第一个IP地址($remote_addr变量对应的字段),即为客户端源IP。

      • 对于HTTP流量:

        本文场景中,日志文件路径为:/var/log/nginx/access.logTCP 透传IP 日志.png

      • 对于TCP流量:

        本文场景中,日志文件路径为:/var/log/nginx/stream_access.log

        TCP流量 自动获取 日志

    • 方式2:您可以通过抓取数据包来判断是否成功获取到了客户端的真实IP地址。

      执行tcpdump tcp port [监听端口] -n -X -s 0命令,从抓取的数据包中查看客户端真实IP地址。

      TCP流量 自动获取 抓包

  1. 开启保持客户端源IP。

    1. 登录全球加速管理控制台

    2. 实例列表页面,找到目标全球加速实例,在操作列单击配置监听

    3. 监听页签下,找到目标TCP监听,在操作列单击编辑监听

    4. 配置监听和协议配置向导页面,单击下一步

    5. 配置终端节点配置向导页面,在保持客户端源IP页签下选择保持,然后单击下一步

      当后端服务部署在非阿里云上时,获取客户端真实IP方式默认选择为ProxyProtocol

      开启保持客户端源IP

    6. 配置审核页面,确认无误后,单击提交

  2. 修改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;
            #...
        }
    }
  3. 执行sudo nginx -s reload命令,重新加载Nginx配置文件。

  4. 获取客户端源IP。

    您可以通过检查Nginx日志来判断是否成功获取到了客户端的真实IP地址。

    执行tail -n <指定返回日志条数> <日志路径>命令,在返回的日志信息中查看$proxy_protocol_addr变量对应的IP地址,即为客户端源IP。

    • 对于HTTP流量:

      本文场景中,日志文件路径为:/var/log/nginx/access.log

      TCP PP 日志.png

    • 对于TCP流量:

      本文场景中,日志文件路径为:/var/log/nginx/stream_access.log

      TCP PP 四层请求  日志.png

UDP监听

获取方式

通过保持客户端源IP功能获取。该功能开启后,默认仅支持自动获取方式,GA直接透传客户端源IP,后端服务器获取到的客户端IP即为真实IP地址。

UDP监听开启保持客户端源IP,有以下限制:

  • 仅按量付费的GA实例支持。

    如果您的按量付费GA实例不支持为UDP监听开启保持客户端源IP,可能是由于实例版本不支持。如需使用,请向商务经理申请升级实例。

  • 仅支持后端服务类型NLBECSENI。其中,NLB类型的保持客户端源IP功能默认不开放,如需使用,请向商务经理申请。

  • 仅支持获取IPv4客户端源IP,不支持获取IPv6客户端源IP。

操作步骤

本文后端服务器以Alibaba Cloud Linux 3操作系统、Nginx 1.20.1版本配置为例介绍。具体请以您实际使用的环境为准。

  1. 开启保持客户端源IP。

    1. 登录全球加速管理控制台

    2. 实例列表页面,找到目标全球加速实例,在操作列单击配置监听

    3. 监听页签下,找到目标UDP监听,在操作列单击编辑监听

    4. 配置监听和协议配置向导页面,单击下一步

    5. 配置终端节点配置向导页面,在保持客户端源IP页签下选择保持,然后单击下一步

      此时,获取客户端真实IP方式默认选择为自动获取

      UDP开启保持客户端源IP

    6. 配置审核页面,确认无误后,单击提交

  2. 查看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;
            #...
        }
    }
  3. 获取客户端源IP。

    • 方式1:您可以通过检查Nginx日志来判断是否成功获取到了客户端的真实IP地址。

      执行tail -n <指定返回日志条数> <日志路径>命令,在返回的日志信息中查看第一个IP地址($remote_addr变量对应的字段),即为客户端源IP。

      本文场景中,日志文件路径为:/var/log/nginx/stream_access.log

      UDP流量 自动获取 日志

    • 方式2:您可以通过抓取数据包来判断是否成功获取到了客户端的真实IP地址。

      执行tcpdump udp port [监听端口] -n -X -s 0命令,从抓取的数据包中查看客户端真实IP地址。

      UDP流量 自动获取 抓包

常见问题

保持客户端源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监听,您可以直接在控制台进行关闭。操作步骤如下:

  1. 实例列表页面,找到目标全球加速实例,在操作列单击配置监听

  2. 监听页签下,找到目标监听,在操作列单击编辑监听

  3. 配置监听和协议配置向导页面,单击下一步

  4. 配置终端节点配置向导页面,配置保持客户端源IP不保持,然后单击下一步

  5. 配置审核配置向导页面,确认无误后,单击提交

全球加速IPv6转换IPv4时如何获取客户端源IP?

  • 针对HTTP或HTTPS监听:IPv6客户端与IPv4客户端均仅支持通过HTTP请求头的X-Forwarded-For字段获取客户端源IP。

  • 针对TCP监听:IPv6客户端仅支持ProxyProtocol方式。ProxyProtocol方式需要后端服务器支持解析Proxy Protocol,才能获取到客户端源IP信息,否则访问会失败。

  • 针对UDP监听:不支持获取IPv6客户端源IP。

相关文档

控制台操作文档
API文档
  • 您还可以通过GA的访问日志功能获取客户端源IP,通过为目标终端节点组创建访问日志,采集到的访问日志将会投递到终端节点组所在地域SLS的日志库中。在对应日志库页面的原始日志页签下,通过client_ip字段查看客户端源IP的访问请求信息。

  • 了解关于终端节点组后端服务更多配置信息及注意事项,请参见终端节点组与终端节点添加和管理智能路由类型监听的终端节点组

您可以在调用以下API时,通过参数EnableClientIPPreservation(自动获取方式)和EnableProxyProtocol(ProxyProtocol 方式)配置获取客户端真实IP的方式。

  • 本页导读 (1)
  • HTTP或HTTPS监听
  • 获取方式
  • 操作步骤
  • TCP监听
  • 获取方式
  • 操作步骤
  • UDP监听
  • 获取方式
  • 操作步骤
  • 常见问题
  • 保持客户端源IP功能开启后不生效,可能是哪些原因?
  • 如何关闭保持客户端源IP功能?
  • 全球加速IPv6转换IPv4时如何获取客户端源IP?
  • 相关文档
文档反馈
phone 联系我们