全部产品
Search
文档中心

负载均衡:后端服务器通过ALB获取客户端真实IP

更新时间:Jan 07, 2026

ALB转发请求时,后端服务器看到的源IP为ALB自身的IP地址。ALB支持将客户端真实IP附加在HTTP请求头的X-Forwarded-For字段,后端服务器简单配置后即可获取。

X-Forwarded-For字段格式如下:

X-Forwarded-For: <客户端真实IP, 代理服务器1-IP, 代理服务器2-IP, ...>

操作步骤

步骤一:确认监听已开启通过X-Forwarded-For获取客户端IP功能

  1. 登录ALB控制台,单击目标实例ID进入实例详情页。

  2. 监听页签,单击目标监听ID,在监听详情页的监听基本信息区域,确认附加 HTTP头字段包含开启通过X-Forwarded-For头字段获取来访者客户端IP已开启-附加

    该选项默认开启;如未开启,用户可单击监听基本信息区域的编辑监听,在高级配置区域开启。

步骤二:配置后端服务器

Nginx服务器

本文以Alibaba Cloud Linux 3.2104nginx/1.20.1为例,具体以用户的实际环境为准。

Nginx通过http_realip_module模块解析X-Forwarded-For并获取客户端真实IP。

  1. 确认模块已安装:在服务器执行nginx -V 2>&1 | grep --color=auto http_realip_module。如输出包含--with-http_realip_module,则模块已安装。

    image

    主流Linux系统通过包管理器(如yum/apt)安装的Nginx通常默认编译此模块。如该模块未安装,建议通过包管理器安装或升级Nginx。
  2. 修改Nginx配置文件:执行sudo 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"';    
        # 确保访问日志应用了上述日志格式。             
        access_log  /var/log/nginx/access.log  main;
        #  ...
    }
  3. 重新加载配置:执行sudo nginx -t检查配置语法无误后,执行sudo nginx -s reload使配置生效。

Apache服务器

本文以Alibaba Cloud Linux 3.2104Apache/2.4.37为例,具体以用户的实际环境为准。

Apache通过mod_remoteip模块解析X-Forwarded-For并获取客户端真实IP。

  1. 确认模块已安装:在服务器执行httpd -M | grep remoteip_module。如输出包含remoteip_module (shared),则模块已安装。

    image

    主流Linux系统通过包管理器(如yum/apt)安装的Apache通常将默认编译此模块。如该模块未安装,建议通过包管理器安装或升级Apache。
  2. 修改Apache配置文件:执行httpd -V查看配置文件所在路径,默认通常为/etc/httpd/conf/httpd.conf

    # ...
    <IfModule log_config_module>
    # ...
    #确保日志格式包含%{X-Forwarded-For}i,该变量用于记录X-Forwarded-For的值。
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" combined
    # ...
    #确保访问日志应用了上述日志格式。
    CustomLog "logs/access_log" combined
    </IfModule>
    # ...
  3. 重新加载配置:执行sudo systemctl restart httpd,使配置生效。

IIS服务器

本文以Windows Server 2022 21H2IIS 10.0为例,具体以用户的实际环境为准。

  1. 在IIS管理器左侧连接窗格选中目标服务器,在主面板中双击日志功能。

    image

  2. 日志文件区域单击选择字段

    image

  3. 在弹出的W3C日志记录字段对话框单击添加字段。在添加自定义字段对话框配置字段信息,单击确定保存退出。

    • 字段名称:输入X-Forwarded-For

    • 源类型:保持默认请求标头

    • :输入X-Forwarded-For

    image

  4. 确认已成功添加自定义字段,单击确定保存退出。

    image

  5. 在右侧的操作窗格中单击应用使配置生效。

    image

步骤三:验证后端服务器已获取客户端真实IP

检查后端Web服务器的访问日志来验证其是否已获取客户端真实IP。

Nginx服务器

Nginx访问日志默认路径为/var/log/nginx/access.log

每条日志中,$http_x_forwarded_for变量对应字段即为客户端真实IP。

image

Apache服务器

Apache访问日志默认路径为/var/log/httpd/access_log

每条日志中,%{X-Forwarded-For}i变量对应字段即为客户端真实IP。

image

IIS服务器

IIS访问日志默认路径为%SystemDrive%\inetpub\logs\LogFiles

每条日志中,末尾X-Forwarded-For字段对应的值即为客户端真实IP。

image

应用于生产环境

  • 验证和过滤XFF头部:在后端服务器中,对XFF头部进行验证和过滤,以确保它是合法且可信的。用户可以检查XFF头部的格式和IP地址,拒绝非法或可疑的值。

  • 使用安全策略:在ALB和后端服务器之间,使用阿里云安全组或其他第三方安全策略来限制和过滤针对XFF头部的恶意请求。

  • TLS加密:使用TLS加密来保护通信,包括XFF头部的传输。这样可以减少中间人攻击和数据篡改的风险。

常见问题

为什么有100开头的IP频繁访问后端服务

  • ALB升级实例:使用其所属交换机网段内的私网地址(Local IP)与后端服务器通信。

  • 未升级ALB实例:使用100.64.0.0/10地址段(阿里云保留地址,不存在安全风险)与后端服务器通信。

除了将监听到的请求转发给后端服务器,ALB还会持续对后端服务器进行健康检查。如用户使用存量未升级ALB实例,则会在后端服务器的访问日志中看到大量100开头的IP的访问请求。

为确保ALB实例与后端服务正常连通,如访问链路中存在安全策略(包括阿里云安全组和其他第三方安全策略),建议提前放通ALB实例所属交换机网段或100.64.0.0/10地址段。

与WAF/CDN/GA等配合使用时,如何获取客户端真实IP?

若流量在到达ALB前,已经过阿里云WAF、CDN或全球加速(GA)等转发,也可通过X-Forwarded-For字段获取客户端真实IP。上述产品默认透传该字段,无需额外配置。

为避免X-Forwarded-For伪造,用户也可使用其他HTTP请求头字段来记录客户端真实IP:

  • 使用阿里云CDN的Ali-Cdn-Real-Ip。业务架构为客户端 > CDN > WAF > ALB > ECS。

    1. CDN默认支持携带Ali-Cdn-Real-Ip请求头回源,用于向源站传递客户端与 CDN 节点建立连接的真实 IP。

    2. 接入WAF时客户端IP判定方式选择Ali-Cdn-Real-Ip为指定Header字段。

    3. 后端Nginx服务器配置日志变量$http_Ali_Cdn_Real_Ip,即可从该字段获取客户端真实IP。

  • 使用ALB的监听转发规则写入Header向请求添加HTTP头字段(键值对)。业务架构为客户端 > GA > ALB > ECS。

    1. 在ALB监听转发规则中配置转发动作写入Header,本例添加键为client-real-ip,值为系统定义客户端IP地址

      写入header

    2. 打开监听的查找真实客户端源IP开关,将GA的终端节点出公网IP加入可信IP列表

    3. 后端Nginx服务器配置日志变量$http_client_real_ip,即可从该字段获取客户端真实IP。

ACK场景下使用ALB时如何获取客户端真实IP?

参考获取来访者客户端IP