网站使用CDN加速后如何获取客户真实IP地址

- 作者:华为云 ——来源:华为云 ——

  今天分析网站的日志,发现网站日志记录的客户端IP大多数都是百度云加速后的CDN地址,而不是想要的客户真实IP地址。于是给运维反馈了这个问题,希望可以解决网站使用CDN加速后客户IP地址显示的是CND加速后的地址,希望获取到客户真实IP地址。结果运维给我说做不到,用了CDN加速后都这样,这还能解决不了了。如果这个问题解决不了的话,CDN加速估计很多公司都不会再用了。在百度搜索之后,在华为云发现了解决方案。下面是详细的方案,希望能给站长带来帮助,解决网站使用CDN加速后如何获取客户真实IP地址的问题。

  客户端IP指的是访问者(用户设备)的IP地址。在Web应用开发中,通常需要获取客户端真实的IP地址。例如,投票系统为了防止刷票,需要通过获取客户端真实IP地址,限制每个客户端IP地址只能投票一次。

  当您的网站已接入Web应用防火墙(Web Application Firewall,简称WAF)进行安全防护后,WAF作为一个反向代理存在于客户端和服务器之间,服务器的真实IP被隐藏起来,Web访问者只能看到WAF的IP地址。此时,您可直接通过WAF获取客户端的真实IP,也可以通过配置网站服务器获取客户端的真实IP。

  本章节介绍了通过WAF直接获取真实IP的方法,以及不同类型的Web应用服务器(包括Tomcat、Apache、Nginx、IIS 6和IIS 7)如何进行相关设置,以获取客户端的真实IP。

  背景信息

  通常情况下,网站访问并不是简单地从用户的浏览器直达服务器,中间可能部署有CDN、WAF、高防等代理服务器(架构为“用户 > CDN/WAF/高防等代理服务 > 源站服务器”)。以WAF为例,部署示意图如图1所示。

  图1部署WAF原理图

说明:

  当网站没有接入到WAF前,DNS直接解析到源站的IP,用户直接访问服务器。

  当网站接入WAF后,需要把DNS解析到WAF的CNAME,这样流量才会先经过WAF,WAF再将流量转到源站,实现网站流量检测和攻击拦截。

  在这种情况下,访问请求到达源站服务器之前可能经过了多层安全代理转发或加速代理转发,服务器如何获取发起请求的真实客户端IP呢?

  一个透明的代理服务器在把用户的HTTP请求转到下一环节的服务器时,会在HTTP的头部中加入一条“X-Forwarded-For”记录,用来记录用户的真实IP,其形式为“X-Forwarded-For:客户端的真实IP,代理服务器1-IP, 代理服务器2-IP,代理服务器3-IP,……”。

  因此,您可以通过获取“X-Forwarded-For”对应的第一个IP来得到客户端的真实IP。

  通过WAF直接获取客户端真实IP

  网站接入WAF后,WAF作为一个反向代理部署于客户端和服务器之间,实现网站安全防护。根据业务需求,您可以通过以下两种推荐方式获取客户端真实IP:

  WAF使用X-Forwarded-For的方式获取客户端的真实IP地址。

  WAF将“真实的客户端IP”放在HTTP头部的“X-Forwarded-For”字段,格式如下:

  

X-Forwarded-For: 用户真实IP, 代理服务器1-IP, 代理服务器2-IP


说明:

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

  各种语言通过调用SDK接口获取X-Forwarded-For字段的方式:

  ASP:

  Request.ServerVariables("HTTP_X_FORWARDED_FOR")
  Request.ServerVariables("HTTP_X_REAL_IP")

  Tomcat如何在访问日志中获取客户端真实IP

  如果您的源站部署了Tomcat服务器,可通过启用Tomcat的X-Forwarded-For功能,获取客户端的真实IP地址。

  打开“server.xml”文件(“tomcat/conf/server.xml”),AccessLogValve日志记录功能部分内容如下:

   prefix="localhost_access_log." suffix=".txt"

  pattern="%h %l %u %t "%r" %s %b" />

  查看“localhost_access_log”日志文件,可获取X-Forwarded-For对应的访问者真实IP。

  Apache如何在访问日志中获取客户端真实IP

  如果您的源站部署了Apache服务器,可通过运行命令安装Apache的第三方模块mod_rpaf,并修改“http.conf”文件获取客户IP地址。

  执行以下命令安装Apache的一个第三方模块mod_rpaf。

  wget https://github.com/gnif/mod_rpaf/archive/v0.6.0.tar.gz

  tar xvfz mod_rpaf-0.6.tar.gz

  cd mod_rpaf-0.6

  /usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

  ASP.NET(C#)

  
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]


  PHP

$_SERVER["HTTP_X_FORWARDED_FOR"]

  JSP:

request.getHeader("HTTP_X_FORWARDED_FOR"

  WAF服务还支持使用X-Real-IP变量,获取客户的来源IP(使用过程中考虑了后面经过的多层反向代理对该变量的修改)。

  各种语言通过调用SDK接口获取X-Real-IP字段的方式:

  ASP:

  ASP.NET(C#):

Request.ServerVariables["HTTP_X_REAL_IP"]

  PHP:

$_SERVER["HTTP_X_REAL_IP"]

  JSP:

request.getHeader("HTTP_X_REAL_IP")

  在pattern中增加“%{X-Forwarded-For}i”,修改后的server.xml为:

  打开“httpd.conf”配置文件,并将文件内容修改为如下内容:

  LoadModule rpaf_module   modules/mod_rpaf-2.0.so ##加载mod_rpaf模块RPAFenable On

  RPAFsethostname On

  RPAFproxy_ips 127.0.0.1

  RPAFheader X-Forwarded-For

  定义日志格式。

  LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" common

  启用自定义格式日志。

  CustomLog "/[apache目录]/logs/$access.log" common

  重启Apache,使配置生效。

  /[apached目录]/httpd/bin/apachectl restart

  查看“access.log”日志文件,可获取X-Forwarded-For对应的客户端真实IP。

  Nginx如何在访问日志中获取客户端真实IP

  如果您的源站部署了Nginx反向代理,可通过在Nginx反向代理配置Location信息,后端Web服务器即可通过类似函数获取客户的真实IP地址。

  根据源站Nginx反向代理的配置,在Nginx反向代理的相应location位置配置如下内容,获取客户IP的信息。  

Location ^ / {
    proxy_pass  ....;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}


  后端Web服务器通过类似函数获取客户的真实IP。  

request.getAttribute("X-Forwarded-For")

  IIS 6如何在访问日志中获取客户端真实IP

  如果您的源站部署了IIS 6服务器,您可以通过安装“F5XForwardedFor.dll”插件,从IIS 6服务器记录的访问日志中获取客户端真实的IP地址。

  1、下载F5XForwardedFor模块。

  根据您服务器的操作系统版本将“x86\Release”或者“x64\Release”目录中的“F5XForwardedFor.dll”文件拷贝至指定目录(例如,“C:\ISAPIFilters”),同时确保IIS进程对该目录有读取权限。

    2、打开IIS管理器,找到当前开启的网站,在该网站上右键选择“属性”,打开“属性”页面。

  在“属性”页面,切换至“ISAPI筛选器”,单击“添加”,在弹出的窗口中,配置如下信息:

  “筛选器名称”:“F5XForwardedFor”;

  “可执行文件”:“F5XForwardedFor.dll”的完整路径,例如:“C:\ISAPIFilters\F5XForwardedFor.dll”。

  3、单击“确定”,重启IIS 6服务器。

  查看IIS 6服务器记录的访问日志(默认的日志路径为:“C:\WINDOWS\system32\LogFiles\ ”,IIS日志的文件名称以“.log”为后缀),可获取X-Forwarded-For对应的客户端真实IP。

  IIS 7如何在访问日志中获取客户端真实IP

  如果您的源站部署了IIS 7服务器,您可以通过安装“F5XForwardedFor”模块,从IIS 7服务器记录的访问日志中获取客户端真实的IP地址。

  1、下载F5XForwardedFor模块。

  根据服务器的操作系统版本将“x86\Release”或者“x64\Release”目录中的“F5XFFHttpModule.dll”和“F5XFFHttpModule.ini”文件拷贝到指定目录(例如,“C:\x_forwarded_for\x86”或“C:\x_forwarded_for\x64”),并确保IIS进程对该目录有读取权限。

    2、在IIS服务器的选择项中,双击“模块”,进入“模块”界面。

  3、单击“配置本机模块”,在弹出的对话框中,单击“注册”。

  图2注册模块

  在弹出的对话框中,按操作系统注册已下载的DLL文件后,单击“确定”。

  名称:x_forwarded_for_x64

  路径:“C:\x_forwarded_for\x64\F5XFFHttpModule.dll”

  名称:x_forwarded_for_x86

  路径:“C:\x_forwarded_for\x86\F5XFFHttpModule.dll”

  x86操作系统:注册模块“x_forwarded_for_x86”

  图3x86操作系统注册模块

  x64操作系统:注册模块“x_forwarded_for_x64”

  图4x64操作系统注册模块

  注册完成后,勾选新注册的模块(“x_forwarded_for_x86”或“x_forwarded_for_x64”)并单击“确定”。

  在“ISAPI和CGI限制”中,按操作系统添加已注册的DLL文件,并将其“限制”改为“允许”。

  ISAPI或CGI路径:“C:\x_forwarded_for\x64\F5XFFHttpModule.dll”

  描述:x64

  ISAPI或CGI路径:“C:\x_forwarded_for\x86\F5XFFHttpModule.dll”

  描述:x86

  x86操作系统:

  x64操作系统:

  重启IIS 7服务器,等待配置生效。

  查看IIS 7服务器记录的访问日志(默认的日志路径为:“C:\WINDOWS\system32\LogFiles\ ”,IIS日志的文件名称以“.log”为后缀),可获取X-Forwarded-For对应的客户端真实IP。


如果你还有其它疑问可以来本站搜索相关问题,这里会有你想要的答案:火车脚本网

还有什么疑问可以提出来
  • 全部评论(0
    还没有评论,快来抢沙发吧!