解决网站使用WAF后无法获取用户真实IP地址的问题

请支持原文原创内容❤️: 解决网站使用WAF后无法获取用户真实IP地址的问题 | BOBO Blog10/06/2024 在部署Web应用防火墙(WAF)以增强WordPress网站的安全性后,无法获取用户的真实IP地址,文章则详细介绍了如何在Nginx和Apache服务器上配置以解决这一问题。Nginx,如何使用set_real_ip_from和real_ip_header指令;Apache,如何启用并配置mod_remoteip模块。通过这些配置,WordPress可以正确记录访客的真实IP地址,从而改善日志记录和安全分析。文章包括具体的配置示例和操作步骤,确保能够顺利修改配置https://www.soulcloser.com/4189/

引言

在部署Web应用防火墙(WAF)来增强WordPress网站的安全性后,您可能会发现用户的真实IP地址变得不可见。这是因为WAF通常会作为反向代理工作,将所有传入的流量转发到您的服务器,而您的服务器只会看到WAF的IP地址。特别是在需要记录和分析访客行为、阻止恶意用户或实施基于IP的访问控制时,显得尤为重要。

问题的根源

WAF在保护您的网站免受各种攻击(如DDoS攻击、SQL注入和跨站脚本攻击)时,充当了网站与外界之间的屏障。WAF通常会替换HTTP请求头中的IP地址,以显示其自身的IP地址,而不是客户端的IP地址。这会导致WordPress记录的IP地址不再是访客的真实IP地址。

解决方法

要解决这个问题,需要调整网址服务器和WAF的配置,确保服务器能够从WAF提供的HTTP请求头中提取到访客的真实IP地址。以下是各服务器的解决方法,并非只适用于WordPress

Nginx和OpenResty

大多数WAF都会在HTTP请求头中添加一个X-Forwarded-For(XFF)字段,其中包含了客户端的真实IP地址。我们可以配置WordPress来读取这个字段。通过修改wp-config.php文件貌似不能完全解决问题,最好是让服务器配置中直接处理真实IP地址。比如我的上游服务器使用的是Nginx,你需要在配置文件中的server 块内添加以下指令(OpenResty也可以,它是基于nginx的)

set_real_ip_from [WAF的IP地址];

real_ip_header X-Forwarded-For;

你需要把**[WAF的IP地址]**替换为WAF的IP地址,注意没有括号哈。like this:

如果有多个WAF的IP地址,您需要为每个地址添加一行set_real_ip_from ,需要多次使用set_real_ip_from,例如:

set_real_ip_from 192.168.0.1;

set_real_ip_from 192.168.0.2;
重启Nginx服务

完成配置修改后,记得校验配置文件是否正确和重新加载nginx服务以使配置生效:

sudo nginx -t

sudo systemctl reload nginx

Apache

在Apache中,获取真实用户IP地址的方式也可以类似配置的处理。使用mod_remoteip模块来实现这个功能。以下是具体的步骤:

1. 启用mod_remoteip模块

首先确保mod_remoteip模块已启用。可以通过以下命令启用该模块,然后重启Apache服务:

sudo a2enmod remoteip

sudo systemctl restart apache2
2. 配置httpd.conf或虚拟主机配置文件

在Apache的主配置文件(通常是httpd.conf或你的虚拟主机配置文件)中添加以下配置:

<IfModule mod_remoteip.c>

RemoteIPHeader X-Forwarded-For

RemoteIPTrustedProxy [WAF的IP地址]

</IfModule>

比如这个示例配置,你可以参考代码需要添加到的位置:

<VirtualHost *:80>

ServerName example.com

ServerAlias www.example.com

DocumentRoot /var/www/example.com/public_html

DirectoryIndex index.php index.html index.htm

<Directory /var/www/example.com/public_html>

Options Indexes FollowSymLinks

AllowOverride All

Require all granted

</Directory>

# Enable mod_remoteip

<IfModule mod_remoteip.c>

RemoteIPHeader X-Forwarded-For

RemoteIPTrustedProxy 203.0.113.0

RemoteIPTrustedProxy 198.51.100.0

</IfModule>

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

CustomLog /var/log/apache2/example.com-access.log combined

ErrorLog /var/log/apache2/example.com-error.log

# Redirect HTTP to HTTPS

RewriteEngine On

RewriteCond %{HTTPS} !=on

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]

</VirtualHost>

<VirtualHost *:443>

ServerName example.com

ServerAlias www.example.com

DocumentRoot /var/www/example.com/public_html

DirectoryIndex index.php index.html index.htm

<Directory /var/www/example.com/public_html>

Options Indexes FollowSymLinks

AllowOverride All

Require all granted

</Directory>

# Enable mod_remoteip

<IfModule mod_remoteip.c>

RemoteIPHeader X-Forwarded-For

RemoteIPTrustedProxy 203.0.113.1

RemoteIPTrustedProxy 198.51.100.1

</IfModule>

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

CustomLog /var/log/apache2/example.com-access.log combined

ErrorLog /var/log/apache2/example.com-error.log

SSLEngine on

SSLCertificateFile /etc/ssl/certs/example.com.crt

SSLCertificateKeyFile /etc/ssl/private/example.com.key

SSLCertificateChainFile /etc/ssl/certs/chain.pem

SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1

SSLCipherSuite HIGH:!aNULL:!MD5

SSLHonorCipherOrder on

Header always set Strict-Transport-Security "max-age=31536000"

</VirtualHost>
注意

确保将 [WAF的IP地址] 替换为实际的WAF IP地址,没有括号哈。如果你有多个WAF IP地址,需要多次使用RemoteIPTrustedProxy,像上方举例的配置文件一样。例如:

RemoteIPTrustedProxy 203.0.113.1

RemoteIPTrustedProxy 198.51.100.1
重启Apache服务

完成配置修改后,重启Apache服务以使配置生效:

sudo systemctl restart apache2

通过以上配置,你的Apache服务器应该能够正确获取用户的真实IP地址。

总结

通过配置Nginx和Apache服务器解决网址使用WAF后无法获取用户真实IP地址的问题,获取用户的真实IP地址在提高网站安全性、优化用户体验、精准分析和统计、日志记录和合规、性能优化,以及客户支持方面都具有显著的好处!

希望这篇文章对你在WordPress中获取用户真实IP地址有帮助。文章分享链接:https://www.soulcloser.com/4189/ 交流论坛:https://bbs.soulcloser.com

相关推荐
C++忠实粉丝7 分钟前
Linux环境基础开发工具使用(2)
linux·运维·服务器
康熙38bdc30 分钟前
Linux 环境变量
linux·运维·服务器
l1x1n034 分钟前
网络安全概述:从认知到实践
网络
鄃鳕35 分钟前
HTTP【网络】
网络·网络协议·http
存储服务专家StorageExpert1 小时前
DELL SC compellent存储的四种访问方式
运维·服务器·存储维护·emc存储
蜡笔小新星1 小时前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习
hakesashou1 小时前
python如何比较字符串
linux·开发语言·python
Ljubim.te1 小时前
Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】
linux·学习·centos
cooldream20092 小时前
Linux性能调优技巧
linux
大G哥2 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes