如何获取来访者的真实ip?-凯发k8国际娱乐官网入口
当客户端通过elb访问后端服务器时,客户端真实的ip地址会被elb转换,后端服务器获取到的往往是elb转换后的客户端ip地址。如果需要获取到客户端的真实ip,可以按如下方法操作。
- 七层服务(http/https协议):需要对应用服务器进行配置,然后使用x-forwarded-for的方式获取来访者的真实ip地址。
配置详情见七层服务。
- 四层服务(tcp/udp协议),有两种方式可以获取客户端的真实ip:
- 方法一:开启监听器的“获取客户端ip”功能。
- 方法二:配置toa插件获取。
配置详情见四层服务。
约束与限制
- 如果ip经过nat,则只能获取到nat转化后的ip地址,无法获取到nat转化前的ip地址。
- 如果客户端为容器,只能获取到容器所在主机的ip地址,无法获取容器的ip。
- 四层监听器(tcp/udp)开启“获取客户端ip”功能之后,不支持同一台服务器既作为后端服务器又作为客户端的场景。
- 独享型负载均衡的四层监听器(tcp/udp)默认开启源地址透传功能,无需手动开启,且不支持关闭。
如果客户端经过waf elb访问服务器,则还可以通过waf直接获取客户端真实ip。详见《web应用防火墙用户指南》
七层服务
针对七层服务(http/https协议),需要对应用服务器进行配置,然后使用x-forwarded-for的方式获取来访者的真实ip地址。
真实的来访者ip会被负载均衡放在http头部的x-forwarded-for字段,格式如下:
x-forwarded-for: 来访者真实ip, 代理服务器1-ip, 代理服务器2-ip, ...
当使用此方式获取来访者真实ip时,获取的第一个地址就是来访者真实ip。
配置apache服务器
- 安装apache 2.4。
例如在centos 7.5环境下,可以执行如下命令执行安装:
yum install httpd
- 修改apache的配置文件/etc/httpd/conf/httpd.conf,在最末尾添加以下配置信息。
loadmodule remoteip_module modules/mod_remoteip.so remoteipheader x-forwarded-for remoteipinternalproxy 100.125.0.0/16
图1 修改apache的配置文件示例图
将代理服务器的网段添加到 remoteipinternalproxy
。 - 共享型负载均衡需要添加的ip地址段为 100.125.0.0/16(100.125.0.0/16 是负载均衡服务保留地址,其他用户无法分配到该网段内,不会存在安全风险)和高防ip地址段。多个ip地址段用逗号分隔。
- 独享型负载均衡需要添加elb实例关联的vpc子网网段。
- 修改apache的配置文件/etc/httpd/conf/httpd.conf,将日志输出格式修改为如下所示(%a代表源ip地址):
logformat "%a %l %u %t \"%r\" %>s %b \"%{referer}i\" \"%{user-agent}i\"" combined
- 重启apache。
systemctl restart httpd
- 查看httpd的访问日志,您可以获取真实的来访者ip。
配置nginx服务器
例如在centos 7.5环境下,可以执行如下命令执行安装:
- 运行以下命令安装http_realip_module。
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel wget http://nginx.org/download/nginx-1.17.0.tar.gz tar zxvf nginx-1.17.0.tar.gz cd nginx-1.17.0 ./configure --prefix=/path/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module make make install
- 打开nginx.conf文件。
vi /path/server/nginx/conf/nginx.conf
- 在以下配置信息后添加新的配置字段和信息。
在http或者server处,需要添加的配置字段和信息:
set_real_ip_from 100.125.0.0/16; real_ip_header x-forwarded-for;
图2 添加配置字段和信息示例图
将代理服务器的网段添加到 set_real_ip_from
。 - 共享型负载均衡的ip地址段 100.125.0.0/16是负载均衡服务保留地址,其他用户无法分配到该网段内,不会存在安全风险)和高防ip地址段。多个ip地址段用逗号分隔。
- 独享型负载均衡需要添加elb实例关联的vpc子网网段。
- 启动nginx。
/path/server/nginx/sbin/nginx
- 查看nginx的访问日志,您可以获取真实的来访者ip。
cat /path/server/nginx/logs/access.log
配置tomcat服务器
本教程中的tomcat的安装路径为“/usr/tomcat/tomcat8/”。
- 登录已安装tomcat的服务器。
- 执行如下命令,确定tomcat已经正常运行。
ps -ef|grep tomcat netstat -anpt|grep java
图3 正常运行结果示例
- 将server.xml文件中的classname="org.apache.catalina.valves.accesslogvalve"模块修改为如下内容。
vim /usr/tomcat/tomcat8/conf/server.xml
图4 配置示例
- 执行如下命令,重启tomcat服务。
cd /usr/tomcat/tomcat8/bin && sh shutdown.sh && sh startup.sh
其中“/usr/tomcat/tomcat8/”为tomcat安装路径,请根据实际情况替换。
图5 重启tomcat服务
- 执行如下命令,查看最新的日志。
如图中红框所示获取到的非100.125网段的ip地址,即为获取到的源ip地址。
cd /usr/tomcat/tomcat8/logs/ cat localhost_access_log..2021-11-29.txt
其中“localhost_access_log..2021-11-29.txt”为当天日志路径,请根据实际情况替换。
图6 查询源ip地址
配置windows iis服务器
本教程以windows server 2012配置iis7为例介绍,其他版本操作可能略有不同。
- 下载并安装iis。
- 从第三方网站下载f5xforwardedfor.dll插件,并获取x86和x64目录下的f5xforwardedfor.dll插件拷贝到iis服务具有访问权限的目录下,例如c:\f5xforwardedfor2008。
- 打开iis管理器,选择“模块 > 配置本机模块”注册拷贝的2个插件。
图7 选择模块选项
图8 配置本机模块
- 单击“注册”,分别注册x86和x64插件。
图9 注册插件
- 在“模块”页面,确认注册的模块名称出现在列表中。
图10 确认注册成功
- 选择iis管理器k8凯发主页的“isapi筛选器”,为2个插件授权运行isapi和cgi扩展。
图11 添加授权
- 选择“isapi和cgi限制”,为2个插件设置执行权限。
图12 允许执行
- 单击k8凯发主页的“重新启动”,重启iis服务,重启后配置生效。
图13 重启iis服务
四层服务
针对四层服务(tcp/udp协议),有两种方式可以获取客户端的真实ip。
- 方式一(tcp/udp协议):开启监听器的“获取客户端ip”功能。
- 开启此功能后,执行后端服务器迁移任务时,可能出现流量中断(例如单向下载、推送类型的流量)。所以后端服务器迁移完成后,需要通过报文重传来恢复流量。
- 监听器开启此功能后,后端服务器不能作为客户端访问此监听器。
- 如果监听器之前已经添加了后端服务器、并且开启了健康检查功能,开启“获取客户端ip”功能会重新上线后端服务器,新建流量会有1-2个健康检查间隔的中断。
- 开启监听器的“获取客户端ip”功能。
- 登录管理控制台。
- 在管理控制台左上角单击图标,选择区域和项目。
- 单击页面左上角的,选择“网络 > 弹性负载均衡”。
- 在“负载均衡器”界面,单击需要操作的负载均衡名称。
- 切换到“监听器”页签。
- 新增场景:单击“添加监听器”。
- 修改场景:在需要修改的监听器名称右侧所在行的操作列,单击“编辑”。
- 开启“获取客户端ip”开关。
- 设置后端服务器的安全组、网络acl、操作系统和软件的安全规则,使客户端的ip地址能够访问后端服务器。
开启“获取客户端ip”之后,不支持同一台服务器既作为后端服务器又作为客户端的场景。如果后端服务器和客户端使用同一台服务器,且开启“获取客户端ip”,则后端服务器会根据报文源ip为本地ip判定该报文为本机发出的报文,无法将应答报文返回给elb,最终导致回程流量不通。
- 方式二(tcp协议):配置toa插件获取。
针对四层(tcp协议)服务,需要配置toa插件获取。配置toa插件请参考。
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨
more