赞
踩
为Web业务部署DDoS防护后,您可以参照本文介绍的方法,获取客户端真实IP。
按照以下不同的部署配置场景,选择适合您的源站获取客户端IP方式。
说明 如使用UDP端口转发,源站ECS将无法获取真实客户端IP。
默认支持获取客户端真实IP。
通过TCP端口转发流量的情况,您无需做任何改动。源站服务器上看到的客户端IP就是真实的客户端IP。说明部分情况下支持获取客户端真实IP,具体方法参考高防如何支持云外主机获取客户端IP。
当一个七层代理服务器(如高防IP)把用户的访问请求转到后端服务器时,源站默认看到的是这个七层代理服务器(如高防IP)的回源IP。而真实的客户端IP会被七层代理服务器放在HTTP头部的X-Forwareded-For字段,格式如下:X-Forwarded-For: 用户真实IP, 高防代理IP
。
如果中间经过不止一个代理服务器(如经过了WAF、CDN等等代理服务器),此时HTTP头部的X-Forwarded-For字段的格式如下:X-Forwarded-For: 用户真实IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, …
。
经过多层代理服务器,请求用户的真实IP处于第一个位置,而后面包含所有经过的中间代理服务器的IP。因此,只要获取HTTP头部的X-Forwarded-For字段的内容即可。
常用的获取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”)
获取到HTTP头部的X-Forwarded-For字段的相关内容后,以“,”作为区分符,截取其中的第一个IP地址即可获取客户端真实IP。
Nginx配置方案
说明 通过一键安装包安装的Nginx默认不安装此模块,可以使用 # nginx -V | grep http_realip_module
查看此模块有无安装。
如果 http_realip_module 模块未安装,需要重新编译Nginx并加装此模块。
- wget http://soft.phpwind.me/top/nginx-1.0.12.tar.gz
- tar zxvf nginx-1.0.12.tar.gz
- cd nginx-1.0.12
- ./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module
- make
- make install
- kill -USR2 `cat /alidata/server/nginx/logs/nginx.pid`
- kill -QUIT `cat /alidata/server/nginx/logs/ nginx.pid.oldbin`
location / {}
中添加以下内容。 - set_real_ip_from ip_range1;
- set_real_ip_from ip_range2;
- ...
- set_real_ip_from ip_rangex;
- real_ip_header X-Forwarded-For;
说明 这里的 ip_range1,2,...
指的是高防IP的回源IP地址,需要添加多条。如果高防IP后还有WAF、CDN,则需要写WAF、CDN的回源IP地址,即需要写离源站最近的一层七层代理的回源IP段。
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" ';
nginx -s reload
。IIS 6 配置方案
IIS 6通过日志可获取来访者真实IP。
IIS 7 配置方案
IIS 7可通过F5XForwardedFor模块获取来访者真实IP。
Apache配置方案
Windows操作系统
在Apache 2.4及以上版本的安装包中已自带remoteip_module模块文件(mod_remoteip.so),您可以通过该模块获取访问者真实IP地址。
说明 为减少直接修改httpd.conf配置文件的次数,避免因操作失误而导致的业务异常,通过引入remoteip.conf配置文件的方式加载相关配置。
- #加载mod_remoteip.so模块
- LoadModule remoteip_module modules/mod_remoteip.so
- #设置RemoteIPHeader头部
- RemoteIPHeader X-Forwarded-For
- #设置回源IP段
- RemoteIPInternalProxy 112.124.159.0/24 118.178.15.0/24 120.27.173.0/24 203.107.20.0/24 203.107.21.0/24 203.107.22.0/24 203.107.23.0/24 47.97.128.0/24 47.97.129.0/24 47.97.130.0/24 47.97.131.0/24
Include conf/extra/httpd-remoteip.conf
- LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
- LogFormat "%a %l %u %t \"%r\" %>s %b" common
Linux操作系统
您可以通过安装Apache的mod_rpaf第三方模块,获取访问者真实IP地址。
- wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
- tar zxvf mod_rpaf-0.6.tar.gz
- cd mod_rpaf-0.6
- /alidata/server/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
说明 其中, RPAFproxy_ips ip地址
不是负载均衡提供的公网IP。具体IP可参考Apache的日志,通常会有两个IP地址。
- LoadModule rpaf_module modules/mod_rpaf-2.0.so
- RPAFenable On
- RPAFsethostname On
- RPAFproxy_ips ip地址
- RPAFheader X-Forwarded-For
/alidata/server/httpd/bin/apachectl restart
mod_rpaf模块配置示例
-
- LoadModule rpaf_module modules/mod_rpaf-2.0.so
- RPAFenable On
- RPAFsethostname On
- RPAFproxy_ips 10.242.230.65 10.242.230.131
- RPAFheader X-Forwarded-For
Tomcat配置方案
开启 Tomcat 的 X-Forwarded-For 功能可获取客户端真实IP。
在 tomcat/conf/server.xml 文件中,修改 AccessLogValve 日志记录功能:
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="localhost_access_log." suffix=".txt"
- pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i %T" resolveHosts="false"/>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。