使用“Web应用防火墙”后获取访问者真实IP配置指南

很多时候,网站并不是简单的从用户的浏览器直达服务器, 中间可能会加入CDN、WAF、高防。

变成如下的架构:

用户 —–> CDN/WAF/高防 ——> 源站服务器

那么,经过这么多层加速,服务器如何才能得到发起请求的真实客户端IP呢?

当一个透明代理服务器把用户的请求转到后面服务器的时候,会在HTTP的头中加入一个记录:

X-Forwarded-For:用户真实IP

如果中间经历了不止一个代理服务器,那么X-Forwarded-For可能会为以下的形式:

X-Forwarded-For:用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, ……

那么如何获取X-Forwarded-For的内容?

获取来访真实IP方法

常见应用服务器获取来访者真实IP的方法.

  • 使用X-Forwarded-For的方式获取访问者真实IP

以下针对常见的应用服务器配置方案进行介绍:

Nginx配置方案

1. 确认http_realip_module模块已安装

Nginx作为负载均衡获取真实ip是使用http_realip_module,默认一键安装包安装的Nginx是没有安装这个模块的,但一般服务器都会安装。可以使用:

# nginx -V | grep http_realip_module 查看有无安装。

如没有,则需要重新重新编译Nginx并加装:

  1. wget http://soft.phpwind.me/top/nginx-1.0.12.tar.gz
  2. tar zxvf nginx-1.0.12.tar.gz
  3. cd nginx-1.0.12
  4. ./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
  5. make
  6. make install
  7. kill -USR2 `cat /alidata/server/nginx/logs/nginx.pid`
  8. kill -QUIT `cat /alidata/server/nginx/logs/ nginx.pid.oldbin`

2. 修改nginx对应server的配置(如默认的是default.conf)

location / {}中添加:

  1. set_real_ip_from ip_range1;
  2. set_real_ip_from ip_range2;
  3. ...
  4. set_real_ip_from ip_rangex;
  5. real_ip_header X-Forwarded-For;

这里的ip_range1,2,…指的是WAF的回源IP地址,需要添加多条。

3. 修改日志记录格式 log_format

log_format一般在nginx.conf中的http配置中:

  1. log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" ';

即将x-forwarded-for字段加进去,替换掉原来的remote-address,添加后效果如下图:

log_format

最后重启Nginx使配置生效:nginx -s reload

IIS 6 配置方案

通过IIS 6日志中获取来访者真实IP地址的解决方案,首先需要安装插件F5XForwardedFor.dll,下载地址

  1. 根据自己的服务器操作系统版本将x86\Release或者x64\Release目录下的F5XForwardedFor.dll拷贝到某个目录,这里假设为C:\ISAPIFilters,同时确保对IIS进程对该目录有读取权限。
  2. 打开IIS管理器,找到当前开启的网站,在该网站上右键选择“属性”,打开属性页。
  3. 在属性页切换至“ISAPI筛选器”,点击“添加”按钮,出现添加窗口。
  4. 在添加窗口:“筛选器名称”填写“F5XForwardedFor”,“可执行文件”填写F5XForwardedFor.dll的完整路径,点击确定。
  5. 重启IIS服务器,等待配置生效。

IIS 7 配置方案

通过F5XForwardedFor模块获取来访者真实IP地址的解决方案,首先需要下载与安装插件F5XForwardedFor模块,下载地址

  1. 根据自己的服务器操作系统版本将x86\Release 或者x64\Release目录下的F5XFFHttpModule.dll和F5XFFHttpModule.ini拷贝到某个目录,这里假设为C:\F5XForwardedFor\,确保对IIS进程对该目录有读取权限。
  2. 选择“IIS服务器”选项,按图所示选择“模块”功能:

  3. 双击“模块”功能,点击“配置本机模块”:

  4. 在弹出框中点击“注册”按钮:

  5. 添加下载的DLL文件,如下图:

  6. 添加完成后,勾选并点击“确定”:

  7. 把这两个DLL在 “API 和CGI限制”进行添加,并改为允许:

  8. 重启IIS服务器,等待配置生效。

Apache配置方案

  1. 首先,安装apache的一个第三方模块“mod_rpaf”, 官方网站

    1. wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
    2. tar zxvf mod_rpaf-0.6.tar.gz
    3. cd mod_rpaf-0.6
    4. /alidata/server/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
  2. 修改apache配置/alidata/server/httpd/conf/httpd.conf,在最末尾添加:

    1. LoadModule rpaf_module modules/mod_rpaf-2.0.so
    2. RPAFenable On
    3. RPAFsethostname On
    4. RPAFproxy_ips ip地址
    5. RPAFheader X-Forwarded-For

    //RPAFproxy_ips ip地址(这个ip地址首先不是负载均衡提供的公网ip,具体ip多少可以看一下apache日志,通常会有2个 都要写上)

  3. 添加完成后重启apache

    1. /alidata/server/httpd/bin/apachectl restart
  4. 具体案例

    1. LoadModule rpaf_module modules/mod_rpaf-2.0.so
    2. RPAFenable On
    3. RPAFsethostname On
    4. RPAFproxy_ips 10.242.230.65 10.242.230.131
    5. RPAFheader X-Forwarded-For

Tomcat配置方案

开启tomcat的X-Forwarded-For,在tomcat/conf/server.xml中,修改AccessLogValve日志纪录功能为如下内容:

  1. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  2. prefix="localhost_access_log." suffix=".txt"
  3. pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i %T" resolveHosts="false"/>