7个获取访问者真实IP的方法,速学!!!

Wesley13
• 阅读 718

通常情况下,网站访问并不是简单地从用户的浏览器直达服务器,中间可能部署有CDN、WAF、高防。例如,采用这样的架构:“用户 > CDN/WAF/高防 > 源站服务器” 。那么,在经过多层代理之后,服务器如何获取发起请求的真实客户端IP呢?

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

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

如果您已经使用Web应用防火墙服务,可直接通过WAF服务获取访问者的真实IP,也可以通过配置网站服务器来获取访问者的真实IP。以下分别介绍通过WAF直接获取真实IP的方法,以及针对Tomcat、Apache、Nginx和IIS服务器,相应的X-Forwarded-For配置方案及获取真实IP的方法。

通过WAF直接获取真实IP

WAF默认提供获取客户端真实IP的功能,下面推荐两种方式获取客户的来源IP,根据您的需要,两种方式可二选一:

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

真实的客户端IP会被WAF服务放在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")

    • **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:

Request.ServerVariables("HTTP_X_REAL_IP")

    • **ASP.NET(C#)**

Request.ServerVariables["HTTP_X_REAL_IP"]

    • PHP:

$_SERVER["HTTP_X_REAL_IP"]

    • JSP:

request.getHeader("HTTP_X_REAL_IP")

Tomcat如何在访问日志中获取真实客户端的IP地址(个人推荐)

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

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

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

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

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

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

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

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

pattern="%{X-Forwarded-For}i %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 http://stderr.net/apache/rpaf/download/mod\_rpaf-0.6.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

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

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

<IfModule mod_rpaf.c>

RPAFenable On

RPAFsethostname On

RPAFproxy_ips 127.0.0.1 <反向代理IPs>

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.dll”插件。

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

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

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

  • “筛选器名称”:“F5XForwardedFor”;
  • “可执行文件”:“F5XForwardedFor.dll”的完整路径,例如:“C:\ISAPIFilters\F5XForwardedFor.dll”。

5.单击“确定”,重启IIS 6服务器。

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

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

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

1.下载并安装“F5XForwardedFor”模块。

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

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

4.单击“配置本机模块”,在弹出的对话框中,单击“注册”,按操作系统选择“注册模块”注册已下载的DLL文件。

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

    • 名称:x_forwarded_for_x86
    • 路径:“C:\x_forwarded_for\x86\F5XFFHttpModule.dll”
    • x64操作系统:注册模块“x_forwarded_for_x64”
      • 名称:x_forwarded_for_x64
      • 路径:“C:\x_forwarded_for\x64\F5XFFHttpModule.dll”

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

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

  • x86操作系统:

    • ISAPI或CGI路径:“C:\x_forwarded_for\x86\F5XFFHttpModule.dll”
    • 描述:x86
    • x64操作系统:
      • ISAPI或CGI路径:“C:\x_forwarded_for\x64\F5XFFHttpModule.dll”
      • 描述:x64

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

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

点击关注,第一时间了解华为云新鲜技术~

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这