解决获取真实访问用户IP,端口映射内网穿透后访问者地址

前言:

部分环境应用经过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”扩展,方法如下:

 解决获取真实访问用户IP,端口映射内网穿透后访问者地址_第1张图片

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
#
#LogFormat"%h%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\"%I%O"combinedio
#
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

LogFormat"%{X-Forwarded-For}i%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\"%I%OCacheIP:%h"combinedio

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地址。

你可能感兴趣的:(tcp/ip,网络,服务器)