前言:
部分环境应用经过frp端口映射后的网站和应用得到的用户访问IP地址都是localhost或127.0.0.1,内网穿透如何获取真实用户访问者IP地址?
一般地经frp端口映射的网站, IIS7等环境网站不用任何配置即可获取到访问网站的客户端用户真正IP。
如不能获取客户端用户真实IP,需要配置web环境或修改网站源代码(对应获取访问用户IP这一部分),可以通过在HTTP头信息中增加 X-Forwarded-For 信息,用于记录客户端的真实IP,这时web服务就可以使用 $http_x_forwarded_for变量记录客户端的真实IP。
具体解决方案如下:
一、后端服务器设置:
IISWeb服务器解决方案
1、为了能让IISWeb服务器记录客户访问的真实IP地址,我们需要为IISWeb服务器的ISAPI加入一个名为“F5XForwardedFor”的扩展。
2、加入扩展的步骤
(1)下载“F5XForwardedFor.dll”库文件(见最后附件下载),有两个版本:X86与X64。
(2)根据您服务器的版本选择对应的库文件,如果您的Web服务器是32位系统,则选择X86
的库文件,如果是64位操作系统则选择X64对应库文件。
(3)将下载下来的“F5XForwardedFor.dll”文件复制到“C:\Windows\System32\”目录中。
(4)配置IIS,在ISAPI中加入“F5XForwardedFor.dll”扩展,方法如下:
3、在“C:\Windows\System32\”目录中新建一个名为“F5XForwardedFor.ini”的文件,内容为:
[SETTINGS]
HEADER=X-Forwarded-For
4、重启IISWeb服务器(开始菜单->运行->iisreset)
附件下载:
点击下载>>F5XForwardedFor2008.zip
ApacheWeb服务器解决方案
1、只需要修改Apahce服务器主配置文件(httpd.conf)日志格式即可,例如:
#LogFormat"%h%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\""combined
#LogFormat"%h%l%u%t\"%r\"%>s%b"common
#<IfModulelogio_module>
#LogFormat"%h%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\"%I%O"combinedio
#</IfModule>
LogFormat"%{X-Forwarded-For}i%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\"CacheIP:%h"combined
LogFormat"%{X-Forwarded-For}i%l%u%t\"%r\"%>s%bCacheIP:%h"common
<IfModulelogio_module>
LogFormat"%{X-Forwarded-For}i%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\"%I%OCacheIP:%h"combinedio
</IfModule>
2、上面的修改即就是把记录客户IP的“%h”替换为端口映射服务器转递过来的真实IP“%{X-Forwarded-For}i”。
二、前端设置:
ASP程序获取客户端真实ip函数:
Request.ServerVariables("HTTP_X_FORWARDED_FOR")
PHP程序获取客户端真实ip函数:
$_SERVER["HTTP_X_FORWARDED_FOR"]
JSP程序获取客户端真实ip函数:
request.getHeader("HTTP_X_FORWARDED_FOR")
三、疑难杂症:
以上方式无效的个别网站环境获取真实用户IP方式:
* 个别比较特殊的环境需要读这个ALL_HTTP里边的字符串,然后从中截取ip
v=Request.ServerVariables("ALL_HTTP")
* 个别PHP环境需要通过截取字符串方式截取[X_FORWARDED_FOR] =>后边的访问真实IP
参考
论坛先例案例示例《PHP环境X_FORWARDED_FOR后面IP截取获取》
* 关于https协议应用映射:
由于https映射因为是加密协议,映射后是无法直接获取ip的。需要获取访问者IP的,建议使用http协议进映射进行获取,或可以在https页面,通过ajax或iframe请求http协议进行获取和传入ip地址得到。
* 非http应用:可以专门做客户端,来建立“连接发送访问者IP端口或写一个系统变量值”,通过和非http应用程序交流信息并获取真实用户访问IP地址。