Web Application Firewall 为 Web 应用防火墙,简称 WAF。它通过分析 HTTP/HTTPS 流量,根据预设的安全规则集以及语义分析,识别并拦截针对 Web 应用的恶意攻击,例如 SQL 注入、跨站脚本(XSS)、恶意爬虫、API 滥用、CC 攻击等,可以理解为保护网站的「保安」。
雷池 WAF 是一款免费开源的国产 Web 应用防火墙,提供了友好的管理界面,通过内置的语义分析引擎,可以识别未知攻击变种和绕过手段,同时降低误报漏报,保护 Web 应用安全。
本篇文章介绍了如何通过 Docker 环境部署雷池 WAF,以及在配置反向代理过程中常见问题的解决方法。
产品官网:https://waf-ce.chaitin.cn/

目录
准备工作
一般情况建议将 WAF 和源站服务器进行网络隔离,将 WAF 独立部署,以保护源站安全。
安装雷池 WAF 前请确保系统环境符合要求,操作系统类型为 Linux,最低资源需求:1 核 CPU / 1 GB 内存 / 5 GB 磁盘。本篇文章测试环境为 CentOS 7.9。
官方文档:https://help.waf-ce.chaitin.cn/
安装 Docker CE 和 Docker Compose
1、从阿里云仓库下载 Docker 软件包,并执行安装。
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2、安装完成后启动 docker 服务。
systemctl start docker
systemctl enable docker
3、查看版本信息,雷池 WAF 要求 Docker 20.10.14 版本以上,Docker Compose 2.0.0 版本以上。
docker --version
docker compose version
安装雷池 WAF
1、执行以下命令完成自动安装。
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/manager.sh)"

2、设置安装目录,可以保持默认。

3、等待安装完成后,根据命令行提示使用浏览器访问控制台,并输入默认用户名和密码进行登录。雷池控制台的默认端口为 9443,注意在防火墙放行该端口。

修改 Nginx 监听端口
如果当前环境使用了宝塔面板或 1Panel 等 Linux 服务器运维面板,并安装了 Nginx 服务,将导致 Nginx 默认的监听端口(80 和 443)与雷池 WAF 等监听端口产生冲突。此时需要修改 Nginx 的监听端口到其他任意端口,保证雷池 WAF 可以正常使用 80 和 443 端口。
一般在生产环境中,考虑到网络安全隔离,并不建议将雷池 WAF 和 Web 源站共用一台服务器。如果您需要在同一台服务器上安装宝塔面板和雷池 WAF,下面介绍了宝塔面板修改 Nginx 默认端口的方法,1Panel 或其他运维面板请自行查阅官方文档(https://help.waf-ce.chaitin.cn/)或其他相关资料进行操作。
如果当前使用的是全新的服务器系统,或没有安装占用 80 和 443 端口的服务,可以绕过本小节内容。
1、登录宝塔面板,停止 Nginx 服务,并删除所有使用了 80 和 443 端口的站点,注意提前保存所有站点配置。
2、左侧选择「文件」功能,分别找到「/www/server/panel/vhost/nginx/0.default.conf」和「/www/server/panel/vhost/nginx/phpfpm_status.conf」两个配置文件并进行编辑,将默认端口修改为其他非占用端口,例如 10080 端口,保存退出。


3、修改完成后重载 Nginx 服务,并添加相关站点。

4、最后通过命令检查 Nginx 服务的端口监听情况,确保没有占用 80 和 443 端口。
ss -lanp | grep LISTEN | grep nginx

添加防护应用
雷池 WAF 本质上是一个以反向代理为载体的安全网关,通过部署在客户端和 Web 源站之间,将所有访问流量过滤后,再转发到后端服务器。
1、登录到雷池控制台,选择「防护应用」>「添加应用」。

2、输入域名和服务端口,并配置 SSL 安全证书。根据需求选择代理模式,一般情况下选择「代理到已有应用」,并输入上游服务器地址,点击提交。
例如当前 Nginx 服务和雷池 WAF 共用一台服务器,并将 Nginx 的监听端口设置为「10080」,则上游服务器输入「http://127.0.0.1:10080」。

3、进入应用,根据业务需求配置防护规则,并开启访问日志。

修改源 IP 获取方式
默认情况下,雷池 WAF 会通过 TCP Socket 连接来获取客户端的源 IP 地址,如果雷池 WAF 的上一级设置了 CDN 加速,则需要修改源 IP 获取方式。
1、登录到雷池控制台,选择「防护应用」>「高级配置」。

2、将「源 IP 获取方式」设置为「取 X-Forwarded-For 中上一级代理的地址」,如果客户端和雷池 WAF 之间经过了多级代理,则需要调整相应层级。更多相关内容可以前往官方文档(https://help.waf-ce.chaitin.cn/)进行查阅。

雷池 WAF 代理 WordPress 站点后,浏览器提示重定向次数过多
由于雷池 WAF 开启了强制 HTTPS,而 WordPress 的站点链接配置为 HTTPS 后,会形成循环重定向,这个问题可以通过修改 WordPress 的配置文件解决。
1、进入 WordPress 站点的根目录,找到「wp-config.php」文件并进行编辑。
2、在文件开头添加以下内容,使 WordPress 能够正确识别通过代理传来的 HTTPS,终止 SSL。
define('FORCE_SSL_ADMIN', true);
$_SERVER['HTTPS'] = 'on';
解决 Nginx 自动重定向造成暴露内部端口的问题
当 Nginx 使用自定义监听端口(例如 10080),当用户访问不带斜杠的目录路径时(如 http://www.domain.com/common/styles)会导致 Nginx 自动重定向到带斜杠的路径,但是重定向的 URL 暴露了内部端口,并且由于客户端无法访问内部端口,导致连接失败。
此时需要使用 proxy_redirect 指令,重写从代理服务器返回的响应中的 Location 头。
1、登录到雷池控制台,选择「防护应用」,进入需要配置的应用界面,选择「高级配置」。

2、滑动到最底部,找到「自定义 NGINX 配置」,点击「编辑」。

3、在 location 中添加以下内容,并将端口替换为 Nginx 的监听端口,点击保存。
# 处理 HTTP 重定向,删除端口,只保留路径部分
proxy_redirect http://$http_host:10080/ /;
# 处理 HTTPS 重定向,删除端口,只保留路径部分
proxy_redirect https://$http_host:10080/ /;
# 使用正则匹配重写路径
proxy_redirect ~^http(?:s)?://([^:]+):10080(.*) $scheme://$1$2;

卸载雷池 WAF
1、通过命令行进入雷池的安装目录,输入以下命令停止雷池 WAF 服务。
# 雷池默认安装目录,根据实际情况调整
cd /data/safeline/
docker compose down

2、删除雷池 WAF 相关文件。
rm -rf /data/safeline/

雷池 WAF 应用防火墙搭建以及常见问题排查
https://blog.kobin.cn/blog/system/s2/3303.html