通常情况下,网站访问并不是简单地从用户的浏览器直达服务器,中间可能部署有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的功能,下面推荐两种方式获取客户的来源IP,根据您的需要,两种方式可二选一:
真实的客户端IP会被WAF服务放在HTTP头部的X-Forwarded-For字段,格式如下:
X-Forwarded-For: 用户真实IP, 代理服务器1-IP, 代理服务器2-IP,...
当使用此方式获取客户端真实IP时,获取的第一个地址就是客户端真实IP。
各种语言通过调用SDK接口获取X-Forwarded-For字段的方式:
Request.ServerVariables("HTTP_X_FORWARDED_FOR")
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
$_SERVER["HTTP_X_FORWARDED_FOR"]
request.getHeader("HTTP_X_FORWARDED_FOR")
各种语言通过调用SDK接口获取X-Real-IP字段的方式:
Request.ServerVariables("HTTP_X_REAL_IP")
Request.ServerVariables["HTTP_X_REAL_IP"]
$_SERVER["HTTP_X_REAL_IP"]
request.getHeader("HTTP_X_REAL_IP")
如果您的源站部署了Tomcat服务器,可通过启用Tomcat的X-Forwarded-For功能,获取访问者的真实IP地址。
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
prefix="localhost_access_log." suffix=".txt"
pattern="%{X-Forwarded-For}i %h %l %u %t "%r" %s %b" />
如果您的源站部署了Apache服务器,可通过运行命令安装Apache的第三方模块mod_rpaf,并修改http.conf文件获取客户IP地址。
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
LoadModule rpaf_module modules/mod_rpaf-2.0.so ##加载mod_rpaf模块
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
/[apached目录]/httpd/bin/apachectl restart
如果您的源站部署了Nginx反向代理,可通过在Nginx反向代理配置Location信息,后端Web服务器即可通过类似函数获取客户的真实IP地址。
Location ^ /
proxy_pass ....;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
request.getAttribute("X-Forwarded-For")
如果您的源站部署了IIS 6服务器,您可以通过安装“F5XForwardedFor.dll”插件,从IIS 6服务器记录的访问日志中获取访问者真实的IP地址。
如果您的源站部署了IIS 7服务器,您可以通过安装“F5XForwardedFor”模块,从IIS 7服务器记录的访问日志中获取访问者真实的IP地址。