首页  /  常用服务搭建  /  正文

雷池 WAF

常用服务搭建 2026-10-01📖 12 分钟👁 —
🔧 运维进阶 · 常用服务搭建第 8 / 8 页12345678📖 完整导航 →

一、理论部分

1. WAF 是干啥的

攻击者、防火墙、WAF/IPS 与服务器之间的链路
WAF 在防护体系里的位置

很多客户现场会防火墙联动 WAF 自动黑名单,不然一堆服务器被攻击,人工封锁不完 (已经体验过了……)。

WAF 是有 payload 的,事件不及时更新可能被突破。

更新后的防御过程

2. 关于两种数据库

WAF 的查询流程是这样的:

防火墙把流量发给 WAF,WAF 发给 Redis 查看是否有安全事件。 如果没有,就去数据库查询;还是没有,就返回结果。

Redis 查不到的事件会去数据库查,然后记在自己的库 / 缓存里。
下次 WAF 再请求相同的事件,就不必查数据库了 —— 避免了高 QPS 的情况。
防火墙 → WAF → Redis → 数据库 的流量走向

也可以不用关系型数据库,只用非关系型,但这时候就处理不了复杂任务了。

上面就是 WAF 的基本原理、流量导向、运行原理和事件库的介绍。


二、安装

本次用长亭 WAF(雷池)演示。

最简单的是直接跑官方脚本(脚本可能会变,命令失败就去官网看):

bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/manager.sh)"

官网:https://waf-ce.chaitin.cn/

具体怎么安装官网都介绍了。

1. 先检查环境

uname -m                                    # 查看指令架构
cat /proc/cpuinfo | grep "processor"        # 查看 CPU 信息
lscpu | grep ssse3                          # 确认 CPU 是否支持 ssse3 指令集
lscpu | grep avx2                           # 确认 CPU 是否支持 avx2 指令集
docker version                              # 查看 Docker 版本
docker compose version                      # 查看 Docker Compose 版本
docker-compose version                      # 查看老版本 docker-compose 版本
free -h                                     # 查看内存信息
df -h                                       # 查看磁盘信息

2. 准备目录和配置文件

mkdir -p "/data/safeline"
# 加引号都是防止被拆分路径和目录(如果有空格的话)
cd "/data/safeline"

wget "https://waf-ce.chaitin.cn/release/latest/compose.yaml"
# apt 下载网络文件,wget 下载 url 的文件

cd "/data/safeline"
touch ".env"

# 编辑 .env 文件
SAFELINE_DIR=/data/safeline
IMAGE_TAG=latest
MGT_PORT=9443
POSTGRES_PASSWORD=<自己生成一个强密码>   # 数字+英文大小写组合,勿使用特殊字符
SUBNET_PREFIX=172.22.222
IMAGE_PREFIX=swr.cn-east-3.myhuaweicloud.com/chaitin-safeline
ARCH_SUFFIX=
RELEASE=
REGION=
MGT_PROXY=0
⚠️ .env 里的密码不要提交到任何仓库,也别截图发出去。

架构不一样要改的地方也不一样:

uname -m
输出架构要不要改 ARCH_SUFFIX
x86_64普通 64 位不用改
aarch64ARM 64 位改成 -arm
armv7lARM 32 位改成 -arm

安装 LTS 版本需要把 RELEASE 改成 -lts。

3. 各个配置项是什么意思

配置项说明
SAFELINE_DIR雷池安装目录,如 /data/safeline
IMAGE_TAG要安装的雷池版本,保持默认 latest 即可
MGT_PORT雷池控制台的端口,保持默认 9443 即可
POSTGRES_PASSWORD雷池所需数据库的初始化密码,随机生成一个
SUBNET_PREFIX雷池内部网络的网段,保持默认 172.22.222 即可
IMAGE_PREFIX雷池镜像源的前缀,建议按服务器所在地选合适的源
ARCH_SUFFIX架构后缀,ARM 服务器配 -arm
RELEASE更新通道,LTS 版本配 -lts
MGT_PROXY控制台代理层数,只有给控制台配代理时才用,默认 0 不配

4. 启动

cd "/data/safeline"
docker compose up -d
命令效果
docker compose up前台运行,屏幕上刷日志,Ctrl+C 就停
docker compose up -d后台运行,不占屏幕,关终端也不停

打个比方:compose.yaml 是"写了要启动哪些演员",docker compose up 就是"按上面文件的配置执行",-d 就是"后台开"。

部署结果:

docker compose 部署成功的输出

docker compose 看到正常的选项就是安装成功了。


三、登录 WAF

第一次登录雷池需要初始化管理员账户(默认会执行)。如果没有找到账户密码,手动执行:

docker exec safeline-mgt resetadmin

执行完会随机重置 admin 账户的密码,输出大概是这样:

[SafeLine] Initial username:admin
[SafeLine] Initial password:**********
[SafeLine] Done
⚠️ 这里输出的密码只显示这一次,记下来之后不要截图外发。

四、顺便看看 SSH 日志

装完 WAF 之后顺手查了一下服务器被爆破的情况:

cat /var/log/auth.log | grep reset | wc -l
# 直接查多少次
425

# 看详细日志
cat /var/log/auth.log
Apr 27 22:04:02 localhost sshd[1306099]: Connection reset by 119.29.231.131 port 57890 [preauth]
Apr 27 22:05:02 localhost CRON[1308706]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Apr 27 22:05:02 localhost CRON[1308707]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
Apr 27 22:05:02 localhost CRON[1308707]: pam_unix(cron:session): session closed for user root
Apr 27 22:05:02 localhost CRON[1308706]: pam_unix(cron:session): session closed for user root

这肯定是被傀儡机爆破了。


五、具体防护操作

1. WAF 和被保护站点在同一服务器

在代理到已有网站的上游服务器里,填要保护的地址或端口 (URL 的端口,如果不写端口默认走 80)。

这里的"上面的端口",是把上游服务器要保护的地址映射到本机(搭载 WAF 的主机)的服务器端口 —— 也就是 WAF 需要占用一个端口来监听要保护的 URL。

🔑 WAF 监听哪个端口,就防护哪个端口。

域名写子域名或者 * 也可以。

举个例子:

用 WAF 的 10000 端口防护 http://1.14.137.231:8088/ 上的服务。 现在访问 http://1.14.137.231:10000/ 就会显示 8088 的服务。

但是如果攻击者直接访问 8088 端口,就会跳过 WAF 的检测 —— 所以需要在控制台的规则配置里关掉 8088,只开 10000, 这样就只能通过 WAF 才能访问到 8088 的服务。

如果 WAF 和服务部署在同一主机,可以用 127.0.0.1 替代公网 IP。

高强度防护就是拦截所有风险,而且一定时间内拉黑 IP,但是误报率高,影响了用户的正常体验。

上游地址为什么不能用公网 IP

配置规则时,上游服务器如果写的是互联网出口 IP,每次访问 WAF 的映射端口, 都会通过互联网出口网卡解析 —— 不管这两者是否在同一台机器上。

所以会出现这种情况:用 10000 的 WAF 保护 8088,控制台里已经关掉了 8088 的规则、只剩 10000, 但访问 10000 时,因为我们写了上游是 http://1.14.137.231:8088/, 它会通过出口网卡去解析 —— 结果解析不了。这时候就必须改成 127.0.0.1。

道理其实很直白:

❌ 上游写 1.14.137.231:8088(公网 IP)
   用户 → WAF(10000) → 转发到 http://1.14.137.231:8088
                          ↓
                  系统判断这是公网 IP
                          ↓
                  从 eth0 公网网卡出去
                          ↓
                  绕一圈回到本机的 8088
                          ↓
                  安全组检查:没放行 8088
                          ↓
                        拦截 ❌

✅ 上游写 127.0.0.1:8088
   用户 → WAF(10000) → 转发到 http://127.0.0.1:8088
                          ↓
                  系统判断这是本地回环地址
                          ↓
                  直接走 lo 网卡,不经过 eth0
                          ↓
                  不触发安全组入站规则
                          ↓
                        成功 ✅

什么时候用哪个:

场景上游地址写法
WAF 和业务在同一主机http://127.0.0.1:8088/
WAF 和业务不在同一主机http://业务内网IP:8088/

2. WAF 和被保护站点分开

假设 A 服务器装了 WAF,B 装了被保护站点,B 不想让公网访问,A 要怎么配?

上游写被保护站点和端口(假设写默认的 80 端口 http://1.1.1.1), 那么云服务器的安全组要允许 1.1.1.1 访问 80(不是全部地址,只有这一个)—— 相当于加了个白名单。