全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
Web 应用防火墙

获取访问者真实IP

更新时间:2017-12-15 16:26:07

在启用 Web 应用防火墙后,怎样获取访问者真实 IP

很多时候,网站访问并不是简单地从用户的浏览器直达服务器,中间可能部署有 CDN、WAF、高防。例如,采用这样的架构:用户 > CDN/WAF/高防 > 源站服务器。那么,在经过多层加速后,服务器如何获取发起请求的真实客户端 IP 呢?

一个透明的代理服务器在把用户的请求转到下一环节的服务器时,会在 HTTP 的头中加入一条 X-Forwarded-For 记录,用来记录用户的真实 IP,其形式为 X-Forwarded-For:用户IP。如果中间经历了多个代理服务器,那么 X-Forwarded-For 会表现为以下形式:X-Forwarded-For:用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, ……

因此,常见的应用服务器可以 使用 X-Forwarded-For 的方式获取访问者真实IP。以下分别针对 NginxIIS 6IIS 7Apache,和 Tomcat 服务器,介绍相应的 X-Forwarded-For 配置方案。

Nginx 配置方案

1. 确认“http_realip_module”模块已安装

作为负载均衡,Nginx 使用“http_realip_module”来获取真实 IP。使用一键安装包安装的 Nginx,默认没有安装该模块。您可以执行# nginx -V | grep http_realip_module命令查看该模块是否已安装。如果没有安装,则需要重新编译 Nginx 并加装该模块。

参考以下方法,安装“http_realip_module”模块:

  1. wget http://nginx.org/download/nginx-1.12.2.tar.gz
  2. tar zxvf nginx-1.12.2.tar.gz
  3. cd nginx-1.12.2
  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,...,x 指 WAF 的回源 IP 地址,需要分多条分别添加。

3. 修改日志记录格式 log_format

log_format 一般在nginx.conf中的 http 配置下。在 log_format 中,将 x-forwarded-for 字段加进去,替换掉原来的 remote-address,即修改为以下内容:

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

完成以上操作后,使用 nginx -s reload 命令重启 Nginx,使配置生效。

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 的完整路径,如本例中的 C:\ISAPIFilters\F5XForwardedFor.dll
  5. 重启 IIS 服务器,等待配置生效。

IIS 7 配置方案

您可以通过 F5XForwardedFor 模块来获取来访者真实 IP 地址,但前提是您已安装 F5XForwardedFor 模块

操作步骤

  1. 根据服务器操作系统版本将 x86\Release 或者 x64\Release 目录下的 F5XFFHttpModule.dllF5XFFHttpModule.ini 拷贝到指定目录下(假设为C:\x_forwarded_for\x86C:\x_forwarded_for\x64),并确保 IIS 进程对该目录有读取权限。

  2. IIS服务器 选项中,双击打开 模块

  3. 选择 配置本机模块

  4. 配置本机模块 对话框中,单击 注册,分别注册已下载的 DLL 文件。

    • 注册模块 x_forwarded_for_x86

      • 名称:x_forwarded_for_x86
      • 路径:C:\x_forwarded_for\x86\F5XFFHttpModule.dll
    • 注册模块 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. API 和CGI限制 中,分别添加已注册的 DLL,并将其 限制 改为 允许

  7. 重启 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 可以参考 Apache 日志,通常会有2个。

  3. 添加完成后,使用以下命令重启 Apache。

    1. /alidata/server/httpd/bin/apachectl restart

案例

  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"/>
本文导读目录