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功能
登录ALB控制台,单击目标实例ID进入实例详情页。
在监听页签,单击目标监听ID,在监听详情页的监听基本信息区域,确认附加 HTTP头字段包含
开启通过X-Forwarded-For头字段获取来访者客户端IP已开启-附加。该选项默认开启;如未开启,用户可单击监听基本信息区域的编辑监听,在高级配置区域开启。
步骤二:配置后端服务器
Nginx服务器
本文以Alibaba Cloud Linux 3.2104、nginx/1.20.1为例,具体以用户的实际环境为准。
Nginx通过http_realip_module模块解析X-Forwarded-For并获取客户端真实IP。
确认模块已安装:在服务器执行
nginx -V 2>&1 | grep --color=auto http_realip_module。如输出包含--with-http_realip_module,则模块已安装。
主流Linux系统通过包管理器(如
yum/apt)安装的Nginx通常默认编译此模块。如该模块未安装,建议通过包管理器安装或升级Nginx。修改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; # ... }重新加载配置:执行
sudo nginx -t检查配置语法无误后,执行sudo nginx -s reload使配置生效。
Apache服务器
本文以Alibaba Cloud Linux 3.2104、Apache/2.4.37为例,具体以用户的实际环境为准。
Apache通过mod_remoteip模块解析X-Forwarded-For并获取客户端真实IP。
确认模块已安装:在服务器执行
httpd -M | grep remoteip_module。如输出包含remoteip_module (shared),则模块已安装。
主流Linux系统通过包管理器(如
yum/apt)安装的Apache通常将默认编译此模块。如该模块未安装,建议通过包管理器安装或升级Apache。修改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> # ...重新加载配置:执行
sudo systemctl restart httpd,使配置生效。
IIS服务器
本文以Windows Server 2022 21H2、IIS 10.0为例,具体以用户的实际环境为准。
在IIS管理器左侧连接窗格选中目标服务器,在主面板中双击日志功能。

在日志文件区域单击选择字段。

在弹出的W3C日志记录字段对话框单击添加字段。在添加自定义字段对话框配置字段信息,单击确定保存退出。
字段名称:输入
X-Forwarded-For。源类型:保持默认
请求标头。源:输入
X-Forwarded-For。

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

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

步骤三:验证后端服务器已获取客户端真实IP
检查后端Web服务器的访问日志来验证其是否已获取客户端真实IP。
Nginx服务器
Nginx访问日志默认路径为/var/log/nginx/access.log。
每条日志中,$http_x_forwarded_for变量对应字段即为客户端真实IP。

Apache服务器
Apache访问日志默认路径为/var/log/httpd/access_log。
每条日志中,%{X-Forwarded-For}i变量对应字段即为客户端真实IP。

IIS服务器
IIS访问日志默认路径为%SystemDrive%\inetpub\logs\LogFiles。
每条日志中,末尾X-Forwarded-For字段对应的值即为客户端真实IP。

应用于生产环境
验证和过滤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。CDN默认支持携带
Ali-Cdn-Real-Ip请求头回源,用于向源站传递客户端与 CDN 节点建立连接的真实 IP。接入WAF时客户端IP判定方式选择
Ali-Cdn-Real-Ip为指定Header字段。后端Nginx服务器配置日志变量
$http_Ali_Cdn_Real_Ip,即可从该字段获取客户端真实IP。
使用ALB的监听转发规则写入Header向请求添加HTTP头字段(键值对)。业务架构为客户端 > GA > ALB > ECS。
在ALB监听转发规则中配置转发动作为写入Header,本例添加键为
client-real-ip,值为系统定义、客户端IP地址。
打开监听的查找真实客户端源IP开关,将GA的终端节点出公网IP加入可信IP列表。
后端Nginx服务器配置日志变量
$http_client_real_ip,即可从该字段获取客户端真实IP。
ACK场景下使用ALB时如何获取客户端真实IP?
参考获取来访者客户端IP。