当使用CLB七层监听转发流量时,您可通过HTTP头部的X-Forwarded-For字段获取客户端真实IP地址。
获取方法介绍
七层负载均衡(HTTP或HTTPS协议)支持在HTTP头部的X-Forwarded-For字段保留客户端真实IP信息,服务器进行相应配置后即可获取到客户端真实IP地址。
X-Forwarded-For字段格式如下:
X-Forwarded-For:
当使用此方式获取客户端真实IP时,获取的第一个地址就是客户端真实IP。
说明
CLB的HTTPS监听是在负载均衡服务上进行的加密控制,负载均衡服务与后端服务器之间使用的是HTTP协议。因此如果即使使用的是HTTPS监听,在后端服务器也只需配置HTTP协议。
操作步骤
前提条件
-
您已经创建CLB实例并为该实例添加了七层监听。本文以HTTP监听、监听端口为80举例说明,具体操作,请参见创建和管理CLB实例、添加HTTP监听。
-
您已经创建可用的CLB服务器组并添加了后端服务器。本文以创建了虚拟服务器组、后端协议为HTTP、后端服务器为ECS、后端应用端口为80举例说明,具体操作,请参见创建和管理虚拟服务器组。
步骤一:检查监听已开启通过X-Forwarded-For获取功能
-
登录传统型负载均衡CLB控制台。
-
在顶部菜单栏,选择实例所属的地域。
-
在实例管理页面,找到目标实例,单击实例ID。
-
在实例详情页面,单击监听页签,找到目标七层监听,单击监听ID。
-
在监听详情页面,查看到附加HTTP头字段包括通过X-Forwarded-For头字段获取客户端真实IP。
说明
CLB七层监听默认开启通过X-Forwarded-For头字段获取客户端真实IP功能,不支持关闭。
步骤二:配置后端服务器
请根据您所使用的服务器类型,选择对应的操作步骤。
配置Nginx服务器
此处以CentOS 7.9操作系统、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模块,可进行下一步。已安装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。
-
-
修改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配置文件。
配置Apache服务器
此处以CentOS 7.9操作系统、Apache 2.4.6 版本配置为例介绍。具体请以您实际使用的环境为准。
-
在服务器执行
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。
-
-
修改Apache服务配置文件并保存,修改点可参考下方说明。默认通常为
/etc/httpd/conf/httpd.conf
,具体请以实际环境为准。# ... # 增加%{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 #... # ...
-
执行
sudo systemctl restart httpd
命令,重启apache服务。
配置IIS服务器
此处以Windows Server 2016操作系统配置为例介绍。具体请以您实际使用的环境为准。
-
下载并解压F5XForwardedFor文件。
-
根据自己的服务器操作系统版本将
x86\
或x64\
目录下的F5XFFHttpModule.dll
和F5XFFHttpModule.ini
拷贝到某个目录,确保IIS进程对该目录有读取权限。 -
在服务器管理器中,打开IIS管理器。
-
选中服务器,双击模块功能。
-
单击配置本机模块,然后在弹出的对话框中,单击注册。
-
添加下载的.dll文件。
-
输入文件名称,选择路径之后,单击确定。
-
此时系统会自动选中新注册的模块,请单击确定。
-
-
回到服务器主页,双击日志模块,配置日志格式,在日志中记录
X-Forwarded-For
字段信息。-
单击选择字段。
-
单击左下角添加字段,添加如下日志字段并确认。
-
单击右上角应用,完成修改。
-
-
重启IIS服务器,等待配置生效。
步骤三:验证后端服务器已获取客户端真实IP
请根据您所使用的服务器类型,选择对应的操作步骤。
Nginx服务器
当Nginx作为后端服务器时,您可以通过检查Nginx日志来判断是否成功获取到了客户端的真实IP地址。
Nginx日志文件默认路径为:/var/log/nginx/access.log
每行日志中,$http_x_forwarded_for
变量对应的字段中,第一个IP地址即为客户端真实IP地址。
Apache服务器
当Apache作为后端服务器时,您可以通过检查Apache日志来判断是否成功获取到了客户端的真实IP地址。
Apache日志文件默认路径为:/var/log/httpd/access_log
每行日志中,%{X-Forwarded-For}i
对应的字段中,第一个IP地址即为客户端真实IP地址。
IIS服务器
当IIS作为后端服务器时,您可以通过检查IIS日志来判断是否成功获取到了客户端的真实IP地址。
IIS日志文件路径,可在日志模块查看。
每行日志中,X-Forwarded-For
对应的字段中,第一个IP地址即为客户端真实IP地址。
相关文档
不同负载均衡类型获取客户端真实IP方式有所不同:
-
当您使用ALB时,可通过X-Forwarded-For字段获取客户端真实IP,可参考保留客户端真实源地址。
-
当您使用NLB时,可通过服务器组客户端地址保持功能或开启Proxy Protocol功能获取客户端真实IP,可参考通过NLB获取客户端真实IP。
-
当您使用CLB四层监听时,可通过直接获取或开启Proxy Protocol功能获取客户端真实IP,可参考通过CLB四层监听获取客户端真实IP。
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/170014.html