Title: 后端服务器通过ALB获取客户端真实IP_负载均衡(SLB)-阿里云帮助中心

URL Source: https://help.aliyun.com/zh/slb/application-load-balancer/use-cases/preserve-client-ip-addresses

Markdown Content: 后端服务器通过ALB获取客户端真实IP_负载均衡(SLB)-阿里云帮助中心

===============

查看 “

” 全部搜索结果

Image 11 AI 助理 你好,我是AI助理,可以解答问题、推荐解决方案等Image 12: 头像Image 13: 菜单

官方文档

有奖调研

输入文档关键字查找

负载均衡 目录

负载均衡

应用型负载均衡ALB

负载均衡

应用型负载均衡ALB

网络型负载均衡NLB

网关型负载均衡GWLB

传统型负载均衡CLB

从这里开始

新手指南

云采用框架

卓越架构

阿里云安全指南

计算

云服务器

高性能计算

Serverless

操作系统

边缘计算

无影

容器

容器服务

存储

基础存储服务

存储数据服务

数据迁移与工具

混合云存储

网络与CDN

云上网络

跨地域网络

混合云网络

CDN

选型与卓越架构设计

安全

云安全

数据安全

身份安全

业务安全

安全服务

中间件

微服务工具与平台

云消息队列

应用集成

云原生可观测

数据库

瑶池数据库

关系型数据库

NoSQL 数据库

数据库平台与服务

数据仓库

数据库管理工具

人工智能与机器学习

人工智能平台

模型平台与服务

智能搜索与推荐

视觉智能

自然语言处理

智能语音交互

决策智能

AI应用

行业智能

智能客服

大数据计算

数据计算与分析

数据湖

数据应用与可视化

数据开发与服务

媒体服务

视频服务

媒体处理与内容生产

媒体开发服务

企业服务与云通信

企业云服务

企业基础服务

企业办公协同

云通信

域名与网站

域名与备案服务

知识产权服务

终端用户计算

无影

物联网

物联网云服务

设备端服务

行业物联网

开发工具

API 与工具

云效DevOps

开发与运维

Serverless

计算

应用集成

专有云

飞天企业版

迁移与运维管理

运维与监控

云管理

备份与迁移

解决方案

专属钉钉

阿里云电子政务云

MindSphere on Alibaba Cloud

SAP 解决方案

无影标品解决方案

金融云

阿里云集成转售解决方案

支持与服务

管理控制台

账号中心

工单系统API

阿里云交易和账单管理API

支持与服务

法律声明

阿里云健康看板

费用与成本

更多

阿里云App

云大使推荐返现

Data Exchange

首页负载均衡应用型负载均衡ALB实践教程高级特性转发后端服务器通过ALB获取客户端真实IP

后端服务器通过ALB获取客户端真实IP

更新时间:2025-03-26 03:30:55

产品详情

我的收藏

当使用 ALB 监听转发流量时,您可通过 HTTP 头部的 X-Forwarded-For 字段获取客户端真实 IP 地址。

获取方法介绍

七层负载均衡(HTTP 或 HTTPS 协议)支持在 HTTP 头部的 X-Forwarded-For 字段保留客户端真实 IP 信息,服务器进行相应配置后即可获取到客户端真实 IP 地址。

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

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

当使用此方式获取客户端真实 IP 时,获取的第一个地址就是客户端真实 IP。

操作步骤

步骤一:检查监听已开启通过X-Forwarded-For 获取功能

  1. 登录应用型负载均衡 ALB 控制台

  2. 在顶部菜单栏,选择实例所属的地域。

  3. 实例页面,找到目标实例,单击实例 ID。

  4. 在实例详情页面,单击监听页签,找到目标监听,单击监听 ID。

  5. 在监听详情页面,查看到附加 HTTP 头字段包括开启通过 X-Forwarded-For 头字段获取来访者客户端 IP

说明 ALB 默认开启 X-Forwarded-For 头字段获取客户端真实 IP 功能。

步骤二:配置后端服务器

请根据您所使用的服务器类型,选择对应的操作步骤。

配置Nginx服务器

配置Apache服务器

配置IIS服务器

此处以 CentOS 7.9 操作系统、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。
  1. 修改 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"';
  
  # ...
}
  1. 执行sudo nginx -s reload命令,重新加载 Nginx 配置文件。

此处以 CentOS 7.9 操作系统、Apache 2.4.6 版本配置为例介绍。具体请以您实际使用的环境为准。

  1. 在服务器执行httpd -M | grep remoteip_module命令,检查 Apache 服务器是否安装了 remoteip_module 模块。Apache 使用 remoteip_module 模块解析 X-Forwarded-For 记录。

如果返回信息中包括remoteip_module (shared),表示已安装该模块,可进行下一步。

说明

*   Apache 2.4.0 版本(2012 年)开始支持 remoteip_module 模块。如果您使用的 Apache 版本过老,建议您备份配置数据并升级 Apache 版本。

*   如果未安装 remoteip_module 模块,需要重新编译安装 Apache 并安装 remoteip_module 模块。操作较为繁琐,建议您使用类似 yum 的包管理器安装 Apache。
  1. 修改 Apache 服务配置文件并保存,修改点可参考下方说明。默认通常为/etc/httpd/conf/httpd.conf,具体请以实际环境为准。
# ...
<IfModule log_config_module>
	# 增加%{X-Forwarded-For}i ,用于记录X-Forwarded-For信息
  LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b" common
	#...
</IfModule>
# ...
  1. 执行sudo systemctl restart httpd命令,重启 Apache 服务。

此处以 Windows Server 2016 操作系统配置为例介绍。具体请以您实际使用的环境为准。

  1. 下载并解压F5XForwardedFor 文件

  2. 根据自己的服务器操作系统版本将x86\x64\目录下的F5XFFHttpModule.dllF5XFFHttpModule.ini拷贝到某个目录,确保 IIS 进程对该目录有读取权限。

  3. 服务器管理器中,打开IIS 管理器

  4. 选中服务器,双击模块功能。

Image 14

  1. 单击配置本机模块,然后在弹出的对话框中,单击注册

Image 15

  1. 添加下载的.dll 文件。
1.   输入文件名称,选择路径之后,单击**确定**。![Image 16](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5964711761/p3135.png)

2.   此时系统会自动选中新注册的模块,请单击**确定**。![Image 17: 注册模块](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5964711761/p536272.png)
  1. 回到服务器主页,双击日志模块,配置日志格式,在日志中记录X-Forwarded-For字段信息。
1.   单击**选择字段**。

Image 18: image.png

2.   单击左下角**添加字段**,添加如下日志字段并确认。

Image 19: image.png

3.   单击右上角**应用**,完成修改。
  1. 重启 IIS 服务器,等待配置生效。

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

请根据您所使用的服务器类型,选择对应的操作步骤。

Nginx服务器

Apache服务器

IIS服务器

当 Nginx 作为后端服务器时,您可以通过检查 Nginx 日志来判断是否成功获取到了客户端的真实 IP 地址。

Nginx 日志文件默认路径为:/var/log/nginx/access.log

每行日志中,$http_x_forwarded_for变量对应的字段中,第一个 IP 地址即为客户端真实 IP 地址。

Image 20: image.png

当 Apache 作为后端服务器时,您可以通过检查 Apache 日志来判断是否成功获取到了客户端的真实 IP 地址。

Apache 日志文件默认路径为:/var/log/httpd/access_log

每行日志中,%{X-Forwarded-For}i对应的字段中,第一个 IP 地址即为客户端真实 IP 地址。

Image 21: image.png

当 IIS 作为后端服务器时,您可以通过检查 IIS 日志来判断是否成功获取到了客户端的真实 IP 地址。

IIS 日志文件路径,可在日志模块查看。

Image 22: image.png

每行日志中,X-Forwarded-For对应的字段中,第一个 IP 地址即为客户端真实 IP 地址。

Image 23: image.png

常见问题

为什么有 100 开头的 IP 在频繁访问 ECS 实例

负载均衡系统除了会通过系统服务器的内网 IP 将来自外部的访问请求转到后端 ECS 实例之外,还会对 ECS 实例进行健康检查和可用性监控,这些访问的来源都是由负载均衡系统发起的。

负载均衡系统的地址段为 100.64.0.0/10(100.64.0.0/10 是阿里云保留地址,其他用户无法分配到该网段内,不会存在安全风险),所以会有很多 100 开头的 IP 地址访问 ECS 实例。

为了确保您对外服务的可用性,请确保您的所有服务器均对上述地址的访问配置了安全组放行规则。

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

流量在经过负载均衡前,如果经过 WAF、CDN、GA 等转发,也可以通过 X-Forwarded-For 字段获取客户端真实 IP 地址,这些产品默认透传 X-Forwarded-For 字段,无需进行其他配置。

如果您业务安全性要求较高,想避免 X-Forwarded-For 伪造,您可通过在其他产品中指定 header 字段记录客户端真实 IP。假如您采用客户端 > CDN > WAF > 负载均衡 > ECS 架构时,CDN 透传 HTTP 头部的 Ali-Cdn-Real-Ip 字段,在 WAF 中接入时客户端 IP 判定方式选择指定 header 字段为 Ali-Cdn-Real-Ip,后端 Nginx 服务器配置日志变量为$http_Ali_Cdn_Real_Ip,日志中获取的亦为客户端真实 IP。

您也可以通过其他多种手段加固系统安全性,例如:

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

  • 使用防火墙和访问控制列表:在负载均衡器和后端服务器之间,使用防火墙和访问控制列表来限制和过滤针对 XFF 头部的恶意请求。

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

ACK 场景下使用负载均衡时如何获取客户端真实 IP

当您在 ACK 集群中使用负载均衡时,获取方式相同,具体操作有部分差异,具体操作请参考ACK 容器集群 Pod 如何获取客户端真实 IP?

相关文档

不同负载均衡类型获取客户端真实 IP 方式有所不同:

上一篇:使用ALB实现灰度发布[下一篇: