对于雷池的文章我还有这几篇,包括常见的https配置、雷池+frp反代,以及其他的试用方法都有
https://mp.weixin.qq.com/s/3JLrkymD7d46IaWbQup4wQ
https://mp.weixin.qq.com/s/Nvkx7Qdacmm9wx6OpJbejA
https://mp.weixin.qq.com/s/VBD12Ttwh8JS1oQLC_4gWA
https://mp.weixin.qq.com/s/z0NU3V4RASBFoE_cG0js7A
本篇文章主要讲解halo和雷池的搭建过程,以及防护流量走向,架构设计等等
算上自己上班时间,这篇文章总耗时7天+,自认为是一篇非常不错的文章,建议收藏转发,共5k+字,防止后面找不到了

在写这篇文章期间遇到过很多部署问题,不过已经被我小羽全部解决了
通过本篇文章可以避免很多问题,帮助您搭建属于自己的防护环境,即使您没有任何WAF搭建的经历,也可以通过本篇文章来学习企业级WAF环境搭建的完整流程
完整总体网络拓扑架构
互联网流量
│
▼
┌─────────────┐
│ WAF-A │ 第一层(外层)
│ (如雷池) │
└──────┬──────┘
│ 反代
▼
┌─────────────┐
│ WAF-B │ 第二层(内层)
│ (如ModSec) │
└──────┬──────┘
│ 反代
▼
┌─────────────┐
│ halo │ 真实后端
└─────────────┘若读过我这篇文章的师傅们,2025最新教程,使用雷池搭建内网靶场,进行简单的WAF绕过
搭配上本篇文章的教学,完全能搭建出如下架构的企业级防护环境,再牛逼点,自己再配个系统加固的防护应用

为什么要采用这样的架构?
不同的WAF产品拦截规则、检测的算法一般都是不同的,如果攻击者绕过了第一层WAF,那么第二层就不一定能绕过了,这才是核心价值,非常恶心的是,现实环境中还真有人这么干,层层防护,做系统加固
一般这样的架构第一层WAF,用来拦截常见的攻击手法比如漏扫 / CC,第二层针对真实的业务进行定制拦截,两层分贝专注不同的威胁,如果不嫌流量太多,那你可以全开,这样做的好处就是减少日志分析的压力
服务器选购
阿里云九折优惠:https://link.aitq.net/RcgjvF
实惠海外服务器:https://link.aitq.net/RYbx8O
通过我的专属优惠链接下单的师傅们,可以添加我v信 bAIbAIxiaoyu2024,享受一对一线上技术服务,若是长沙线下较近的,可线下上门服务

| 你的客户类型 | WAF 推荐配置 |
|---|---|
| 个人站长 / 小微企业 | 2 核 2G ~ 4 核 4G |
| 中小企业 | 4 核 4G ~ 8 核 8G |
| 中型互联网公司 | 8 核 8G ~ 16 核 16G |
| 集团 / 金融 / 政企 | 16 核 16G+ 集群 |
雷池安装
首先更新系统,确保你的软件包和系统源都是最新的,这里我用的是ubuntu 24
sudo apt update -y && sudo apt upgrade -y
一键安装脚本,新机子默认没有装Docker,雷池会自动帮你装好,无需配置代理和下载源,预计时间3分钟
sudo bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/manager.sh)"
出现账号密码还有地址信息,就代表安装成功了,注意这里的IP地址可能跟你的服务器公网IP地址不一致

需要使用你服务器的公网IP地址+端口来访问,雷池后台默认使用的是ssl协议,如果有需要可以自行配置ssl证书,没有ssl证书就会出现如下界面,我们需要点击高级

再点继续访问

输入刚刚控制台显示的账号密码

到此雷池安装成功,接下来搭建防护站点
Halo CMS 服务搭建
在开始之前,需要搭建一个站点,作为防守目标,这里我就用 halo 这个博客项目
首先创建如下 Docker Compose 文件,Docker-compose.yaml
services:
halo:
image: registry.fit2cloud.com/halo/halo-pro:2.25
restart: on-fAIlure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./halo2:/root/.halo2
ports:
- "8090:8090"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
environment:
# JVM 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数
- JVM_OPTS=-Xmx256m -Xms256m
command:
- --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
- --spring.r2dbc.username=halo
# PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
- --spring.r2dbc.password=openpostgresql
- --spring.sql.init.platform=postgresql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
halodb:
image: postgres:15.4
restart: on-fAIlure:3
networks:
halo_network:
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test: [ "CMD", "pg_isready" ]
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_PASSWORD=openpostgresql
- POSTGRES_USER=halo
- POSTGRES_DB=halo
- PGUSER=halo
networks:
halo_network:
修改源
sudo vi /etc/Docker/daemon.json
# 添加如下内容
{
"registry-mirrors": [
"https://docker.srv.internal.wang",
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
]
}
重启Docker
sudo systemctl daemon-reload
sudo systemctl restart Docker根据之前创建的yaml配置文件部署halo
sudo Docker compose up -d
启动成功后,访问你的公网IP地址和Docker-compose.yaml文件配置的外部端口,我配置的是8090端口,配置模板如下

官网登场

配置拒绝公网访问,然后关闭防火墙关闭 8090 端口,去你的阿里云云服务器控制面板中设置,此时我们的流量访问情况如下
互联网流量/用户访问
│
▼
X 无法直接访问
┌─────────────┐
│ halo │ 真实后端 ,http://127.0.0.1:8090
└─────────────┘
雷池单层WAF搭建
网络拓扑
互联网流量/用户访问
│
▼
┌─────────────┐
│ WAF │ 外层,IP:你的公网IP,我的是 http://175.24.181.203
│ (雷池) │
└──────┬──────┘
│ 反代
▼
┌─────────────┐
│ halo │ 真实后端 ,http://127.0.0.1:8090
└─────────────┘1、雷池添加防护
找到防护应用模块,点击添加应用

填好上游服务器,还有域名信息

此时再通过IP/域名访问,这个就是反向代理出来的 127.0.0.1:8090 Halo服务

访问第一篇hellow halo文章,注入sql注入规则,若出现如下界面,则代表防护成功
http://175.24.181.203/archives/hello-halo' or 1=1 --+
对应的防护数据,在攻击防护中查看

可视化统计面板

双层WAF搭建
若雷池被攻破了,会直接影响业务,我们可以在雷池之下再搭建一层WAF,不同的waf规则不同,防护的强度也会增大,在hvv期间很多人会这么干
那为什么要用 雷池 作为最外层,因为雷池的强大是总所周知的,花耗时近10年打造的WAF产品,由长亭独创的智能语义分析算法驱动
第二层waf,推荐使用ModSecurity WAF,网络架构
互联网流量/用户访问
│
▼
┌─────────────┐
│ WAF-A │ 第一层(外层)http://175.24.181.203
│ (雷池) │
└──────┬──────┘
│ 反代
▼
┌─────────────┐
│ WAF-B │ 第二层(内层)
│(ModSecurity)│ 监听端口:http://127.0.0.1:8080
└──────┬──────┘
│ 反代
▼
┌─────────────┐
│ halo │ 真实后端,http://127.0.0.1:8090
└─────────────┘ModSecurity WAF 搭建
安装命令
sudo apt install -y nginx libnginx-mod-http-modsecurity modsecurity-crs
配置 ModSecurity 主规则文件
sudo tee /etc/modsecurity/modsecurity.conf << 'EOF'
# 全局开关:On=开启拦截,DetectionOnly=仅日志不拦截
SecRuleEngine On
# 开启请求体检测,覆盖 POST 参数
SecRequestBodyAccess On
SecResponseBodyAccess Off
# 日志配置
SecAuditEngine RelevantOnly
SecAuditLog /var/log/nginx/modsec_audit.log
SecDebugLog /var/log/nginx/modsec_debug.log
SecDebugLogLevel 0
# 临时目录配置
SecTmpDir /tmp/
SecDataDir /tmp/
# CRS 核心必需变量(修复 901001 自检 500 报错)
# 版本号对应 OWASP CRS 3.3.5
SecAction "id:900000,phase:1,pass,nolog,\
setvar:tx.crs_setup_version=3033500,\
setvar:tx.anomaly_score=5,\
setvar:tx.paranoia_level=1,\
setvar:tx.sql_injection_score=5,\
setvar:tx.xss_score=5"
# 按依赖顺序加载 CRS 核心规则
Include /usr/share/modsecurity-crs/rules/REQUEST-901-INITIALIZATION.conf
Include /usr/share/modsecurity-crs/rules/REQUEST-913-SCANNER-DETECTION.conf
Include /usr/share/modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf
Include /usr/share/modsecurity-crs/rules/REQUEST-921-PROTOCOL-ATTACK.conf
Include /usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf
Include /usr/share/modsecurity-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf
Include /usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf
Include /usr/share/modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf
Include /usr/share/modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf
Include /usr/share/modsecurity-crs/rules/RESPONSE-950-DATA-LEAKAGES.conf
Include /usr/share/modsecurity-crs/rules/RESPONSE-959-BLOCKING-EVALUATION.conf
EOF创建nginx反向代理站点,监听8080断开,将 ModSecurity 流量转发到 Halo 后端
sudo tee /etc/nginx/sites-avAIlable/modsec-waf << 'EOF'
server {
listen 8080;
server_name _;
# 启用 ModSecurity WAF
modsecurity on;
modsecurity_rules_file /etc/modsecurity/modsecurity.conf;
# 反向代理到 Halo 后端
location / {
proxy_pass http://127.0.0.1:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF释放 80 端口,不然会和雷池冲突
sudo unlink /etc/nginx/sites-enabled/default启用站点并重启 ModSec 服务
# 启用 ModSecurity 站点
sudo ln -sf /etc/nginx/sites-avAIlable/modsec-waf /etc/nginx/sites-enabled/
# 检查配置语法
sudo nginx -t
# 重启 Nginx
sudo systemctl restart nginx雷池 WAF 配置
点击删除防护站点

注意此时本地应用是8080端口,原来是 halo 8090 端口

访问站点,能够正常访问

拦截测试,注意,此次攻击流量没有走到第二层waf,已经被雷池给拦截了所以你在第二层waf中看不到此请求

所以我们为了能直观的看到ModSecurity WAF是否搭建成功,我们需要去阿里云的控制台放行 8080 端口防火墙
直接访问8080端口,真实情况下我们是不会开放这个端口的
http://175.24.181.203:8080/
sql注入测试
http://175.24.181.203:8080/archives/hello-halo' or 1=1 --+
对应的拦截日志
# 实时查看拦截日志
tAIl -f /var/log/nginx/modsec_audit.log
我用AI写了一个批量测试脚本 waf_test.sh
赋予执行权限
chmod +x waf_test.sh执行文件


双层WAF,Agent 攻击测试
最近热门的就是agent自动渗透了,我用的是strix这个开源项目,自己用rust魔改了一版
./strix-rs -t http://175.24.181.203/ -m quick -i "请只对带雷池waf防护的80端口halo应用进行全面的渗透测试,和waf绕过,最后告诉我你使用了哪些规则,是否绕过,打印在终端中"
来看看agent怎么讲?几乎全是正面反馈


经过50次的会话迭代,未发现漏洞和绕过雷池的规则

来看看雷池防护了多少攻击次数

攻击日志分析,每一条未拦截的日志,咱们都可以在第二层modsec waf中添加自定义规则,从而达理想的到防护效果

用之前AI生成的攻击脚本,将端口去掉,打雷池


常见问题
1、运维人员如何规避重复告警?
对于双重waf,一个sql注入的请求,可能会被两个waf一起拦截,从而两个waf都产生大量告警
应对方法,我们可以把每一个waf进行分工,比如WAF-1负责黑白名单、CC、通用攻击;WAF-2负责敏感信息泄露、业务逻辑漏洞等等。
2、延迟增加
每个请求都会经过一层反向代理,两层waf如果不在同一个机房,延迟会显著增加,我们可以将三台服务器尽量部署在同一个内网或者同一个机柜中,这样延迟能下降不少
3、真实IP地址丢失
第一层waf流量转发给第二层时,源IP变成WAF-1的内网IP。第二层waf和业务服务看到的全是127.0.0.1之类的地址,通常用 X-Forwarded-For 或 X-Real-IP 头传递真实IP
需要在防护应用中的高级配置中,为上游服务器传递 X-Forwarded-Host、 X-Forwarded-Proto

如何获取授权?
雷池社区版开箱即用,但如果需要更加专业的防护,可以打开下面短链扫码登录获取授权,通过我的专属链接下单,可享受一对一专属技术顾问进行答疑,欢迎咨询 / 项目合作

登录后找到雷池授权商店,打开这个应用

点击购买授权

这里支持专业版和商业版的试用套餐,点击申请试用即可

同样的,也可以扫描下方二维码,加入雷池社群,寻找工作人员获取授权,感谢阅读
评论 (0)