7个获取访问者真实IP的方法,速学!!!
通常情况下,网站访问并不是简单地从用户的浏览器直达服务器,中间可能部署有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日志记录功能部分内容如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<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为:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<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" />
</Host>
- 查看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
</IfModule>
- 定义日志格式。
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 ^ /<uri> {
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。
7个获取访问者真实IP的方法,速学!!!的更多相关文章
- 【tomcat】获取访问者真实IP
1.直接访问tomcat的情况 通过下面这段代码可以获取: String ip = request.getHeader("x-forwarded-for"); if(ip == n ...
- 获取访问者真实ip地址?我觉得不可能
我们真的能通过请求来获取用户真实的ip地址嘛? 答案是不能,如果能,肯定是我学的不够深入,欢迎交流指正. 那么写这篇文章的意义是什么?我们接着往下看. IP地址相当于电脑在网络上的身份证,但事实上IP ...
- X-Forwarded-For 负载均衡 7 层 HTTP 模式获取来访客户端真实 IP 的方法(IIS/Apache/Nginx/Tomcat)
https://help.aliyun.com/knowledge_detail/13051859.html?pos=1 1.IIS 6 配置方案2.IIS 7 配置方案3.Apache 配置方案4. ...
- 获取客户端真实IP地址
Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: ...
- 服务器架构前面加了防火墙,Nginx如何获取客户端真实ip???
在大部分实际业务场景中,网站访问请求并不是简单地从用户(访问者)的浏览器直达网站的源站服务器,中间可能经过所部署的CDN.高防IP.WAF等代理服务器.例如,网站可能采用这样的部署架构:用户 > ...
- 多层代理获取用户真实IP
1. 几个概念remote_addr:如果中间没有代理,这个就是客户端的真实IP,如果有代理,这就是上层代理的IP.X-Forwarded-For:一个HTTP扩展头,格式为 X-Forwarded- ...
- 用Java来获取访问者真实的IP地址
用Java来获取访问者真实的IP地址 转载 2016年06月07日 14:36:02 标签: 16497 编辑 删除 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAdd ...
- 伪造IP及获取客户端真实IP地址
Fiddler支持自定义规则,可以实现对HTTP请求数据发送给Server前或HTTP应答数据发送给浏览器前进行修改.下面的例子将演示如何向所有HTTP请求数据中增加一个头.1)打开Fiddler,点 ...
- Java Web 获取客户端真实IP
Java Web 获取客户端真实IP 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP.一般分为两种情况: 方 ...
随机推荐
- DOM-BOM-EVENT(5)
5.宽.高.位置相关 5.1.clientX/clientY clientX和clientY表示鼠标在浏览器可视区的坐标位置 <script> document.onclick = fun ...
- cbitmap 获取RGB
CBitMap的用法 MFC提供了位图处理的基础类CBitmap,可以完成位图(bmp图像)的创建.图像数据的获取等功能.虽然功能比较少,但是在对位图进行一些简单的处理时,CBitmap类还是可以 ...
- Bash 脚本编程的一些高级用法
概述 偶然间发现 man bash 上其实详细讲解了 shell 编程的语法,包括一些很少用却很实用的高级语法.就像发现了宝藏的孩子,兴奋莫名.于是参考man bash,结合自己的理解,整理出了这篇文 ...
- 洛谷 P5683 【[CSPJX2019]道路拆除】
先用做的暴力,因为n最多才3000嘛,但是后来发现时间复杂度不止\(O\)(\({n}^2\)),然后就放弃了. 讲讲我的暴力+错误思路吧: 把1到s1和s2的最短路算出来,用SPFA,然后用DFS求 ...
- 注解式HTTP请求Feign (F版)
Spring Cloud 为开发者提供了在分布式系统中的一些常用的组件(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,决策竞选,分布式会话集群状态).使用Sprin ...
- 关于CSS自文档的思考_css声明式语言式代码注释
obert C. Martin写的<Clean Code>是我读过的最好的编程书籍之一,若没有读过,推荐你将它加入书单. 注释就意味着代码无法自说明 —— Robert C. Martin ...
- CF3D Least Cost Bracket Sequence 贪心
Least Cost Bracket Sequence CodeForces - 3D 题目描述 This is yet another problem on regular bracket sequ ...
- smtp 发送邮件实例
发送邮件的关键点在于邮箱服务器地址是否一致 //smtp 服务器地址,咨询 smtp 提供商,例如 smtp.126.net 这种格式,端口和服务器地址是配套的,一般是 465 或者 25 SmtpC ...
- Mac系统权限打开与关闭
打开系统权限: 关闭mac command+R重启 菜单中找到终端 输入命令:csrutil enable 关闭系统权限: 重复以上1-3步骤,第4步时输入:csrutil disable
- Mysql基础(三):MySQL基础数据类型、完整性约束、sql_mode模式
目录 2.MySQL基础数据类型.完整性约束.sql_mode模式 1. MySQL常用数据类型 2. 完整性约束 3. MySQL的sql_mode模式说明以及设置 2.MySQL基础数据类型.完整 ...