通常状况下,网站拜访并不是简略地从用户的浏览器中转服务器,两头可能部署有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..._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。
点击关注,第一工夫理解华为云陈腐技术~