WAF 获取客户端真实 IP 说明
WAF 通过反向代理的方式实现网站安全防护,用户访问 WAF 防护的域名时,会在 HTTP 头部字段中添加一条 X-Forwarded-For 记录,用于记录用户真实 IP,其记录格式为
X-Forwarded-For:用户 IP。如果用户访问域名存在多级代理,WAF 将记录靠近 WAF 上一条的代理服务器 IP。例如:
场景一:用户>WAF>源站,X-Forwarded-For 记录为:X-Forwarded-For:用户真实 IP。
场景二:用户>CDN > WAF>源站,X-Forwarded-For 记录为: X-Forwarded-For:用户真实 IP,X-Forwarded-For:CDN 回源地址。说明:
场景二中,需要在 WAF 添加域名 时,选择代理情况为“是”,选择代理接入后,可能存在客户端 IP 被伪造的风险。如果您使用腾讯云 CDN,不存在客户端 IP 被伪造的风险,腾讯云 CDN 会对 X-Forwarded-For 信息进行重置,只填写 CDN 获取的客户端 IP。(如果使用代理接入,攻击者需要在能直接对 WAF VIP 地址进行请求的情况下才会产生影响,代理接入时用户无法探测到 WAF VIP 地址,请避免代理接入时 WAF VIP 地址泄露)。
负载均衡型 WAF 接入,请参见负载均衡中 如何获取客户端真实 IP。
下文将对常见的应用服务器 X-Forwarded-For 配置方案进行介绍:
IIS 配置方案
IIS 配置方案
不同版本的 IIS(如 IIS 7、IIS 8.5、IIS 10)对应的配置方法略有不同,因此在开始配置前,请先确认您的 IIS 版本,以便选择正确的配置方案。
获取 IIS 版本信息
1. 打开 IIS 管理器。
2. 在左侧的连接窗口中,选择服务器节点。
3. 在右侧的功能视图中,找到并双击服务器信息或关于 IIS(具体名称可能因 IIS 版本而异),这里会显示 IIS 的版本信息。
说明:
您也可以通过 Windows 的控制面板 > 程序 > 启用或关闭 Windows 功能,查看已安装的 IIS 相关组件,间接判断 IIS 版本。
IIS 7 配置方案
1. 下载与安装插件 F5XForwardedFor 模块,根据自己的服务器操作系统版本将
x86\\Release或者x64\\Release目录下的F5XFFHttpModule.dll和F5XFFHttpModule.ini拷贝到某个目录,这里假设为C:\\F5XForwardedFor,确保 IIS 进程对该目录有读取权限。2. 选择 IIS 服务器,双击模块功能。

说明:
3. 单击配置本机模块。


4. 在弹出框中单击注册。


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


6. 添加完成后,选择符合自身系统版本的 F5XForwardedFor 模块,勾选并单击确定。
说明:
下图为添加示意图,实际添加时按照对应操作系统版本及安装的 IIS 即可,如果不清楚当前是什么系统版本,可以同时添加。

7. 在 IIS 服务器的 “ISAPI 和 CGI 限制”中,添加如上两个 DLL ,并将限制设置为允许。


8. 重启 IIS 服务器,等待配置生效。
IIS 8.5 及以上(含 IIS 10.0)配置方案
在 IIS 8.5 及以上(含 IIS 10.0)版本中,由于引入了增强日志功能,因此,管理员可以选择从请求或响应标头或服务器变量记录其他自定义字段。
1. 打开 IIS 管理器。

2. 在连接窗口中选择站点或服务器,并双击日志。
注意:
增强日志记录仅适用于站点级日志记录 , 如果在“连接”窗格中选择服务器,则会禁用 W3C 日志记录字段对话框的“自定义字段”部分。

3. 在日志文件的格式字段中,选择 W3C,单击选择字段。

4. 在 W3C 日志记录字段对话框中,单击添加字段...。
注意:
增强日志记录仅适用于站点级日志记录 - 如果在“连接”窗格中选择了服务器,则“添加字段...”处于禁用状态。

5. 在添加自定义字段对话框中,输入字段名称以标识日志文件中的自定义字段。在源类型处选择请求标头,源输入
X-FORWARDED-FOR。
6. 单击确认,重启 IIS 服务器,等待配置生效。
Apache 配置方案
1. 如未安装 apache2-dev,需要先安装 apache2-dev,执行如下命令:
apt-get install apache2-dev
2. 检查 mod_rpaf 模块是否已安装:执行命令 apachectl -M | grep rpaf 查看 Apache 模块加载情况:
apachectl -M | grep rpaf
若输出包含 rpaf_module,则说明模块已正常加载,可直接跳转至第4步;
若输出未包含该模块,则表明未加载,需跳转至第3步进行手动安装。
3.
安装 Apache 第三方模块 mod_rpaf,需执行如下命令:
wget https://github.com/gnif/mod_rpaf/archive/refs/tags/v0.8.4.tar.gztar zxvf mod_rpaf-0.8.4.tar.gzcd mod_rpaf-0.8.4/usr/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
4.
修改 Apache 配置
/etc/httpd/conf/httpd.conf,需在最末尾添加:LoadModule rpaf_module modules/mod_rpaf-2.0.soRPAFenable OnRPAFsethostname OnRPAFproxy_ips IP地址 //IP 地址为 WAF 防护域名的回源 IP 地址,可以在 Web应用防火墙控制台,防护配置域名列表中的回源 IP 地址中查看,也可以在服务器后台的日志中查看,只需要将所有需要查看的 IP 都填写上即可。RPAFheader X-Forwarded-For
5.
完成配置添加后,
执行 apachectl -t 命令校验 Apache 配置文件的语法:apachectl -t
若输出显示 Syntax OK,说明配置无语法错误,可跳转至第6步安全重启 Apache;
若存在错误,请根据提示修正配置文件问题,修正后重复执行此步骤(第5步)验证修正结果。
6.
重启 Apache。
/usr/sbin/apachectl restart
Nginx 配置方案
1. 若 Nginx 需获取客户端真实 IP,需确保已编译 http_realip_module 模块。执行 nginx -V 查看编译参数,检查输出中是否存在 --with-http_realip_module:
nginx -V
若存在则模块已集成,可直接执行第3步;
若不存在则需执行第2步手动重新编译 Nginx。
2.
重新编译 Nginx,在 configure 增加 --with-http_realip_module 选项,确保 http_realip_module 模块编译进 Nginx 中。编译代码如下:
wget http://nginx.org/download/nginx-1.24.0.tar.gztar zxvf nginx-1.24.0.tar.gzapt-get install libpcre3 libpcre3-dev -yapt-get -y install openssl libssl-devcd nginx-1.24.0./configure --user=www --group=www --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_modulemakemake install
3.
修改 nginx.conf。
说明:
下述路径为演示路径,请根据真实安装路径进行配置。
vi /usr/local/nginx/nginx/nginx.conf
修改如下部分的最后两行:
fastcgi connect_timeout 300;fastcgi send_timeout 300;fastcgi read_timeout 300;fastcgi buffer_size 64k;fastcgi buffers 4 64k;fastcgi busy_buffers_size 128k;fastcgi temp_file_write_size 128k;real_ip_header X-Forwarded-For;
4.
使用 nginx -t 校验 Nginx 配置文件语法,
避免重启失败:nginx -t
若输出显示 "syntax is ok" 和 "test is successful",则可执行第5步安全重启;
若报错,根据提示修正配置后重复执行此步骤(第4步)验证。
5.
重启 Nginx。
service nginx restart