一、环境概览
请求链路
浏览器 → hosts解析 www.sql.com → xxxx.xxx.xxx.xxx(WAF)
│
WAF检测请求
│
┌─────────────┴─────────────┐
│ │
正常请求 恶意请求
│ │
▼ ▼
转发到xxx.xxx.xxx.xxx 拦截并记录日志
│ │
▼ ▼
宝塔nginx → PHP处理 返回403拦截页面
│
▼
返回响应给浏览器
组件说明
| 组件 | 角色 | IP地址 | 用途 |
|---|---|---|---|
| SafeLine WAF | 反向代理+安全检测 | xxx.xxx.xxx.xxx | 所有请求先过WAF,检测后转发后端 |
| 宝塔面板 | Web服务器管理 | xxx.xxx.xxx.xxx | 管理站点、PHP、数据库 |
| SQLi-LABS | 靶场应用 | www.sql.com | SQL注入靶场,测试WAF防护效果 |
| 宿主机 | 访问端 | xxx.xxx.xxx.xxx(本机) | 浏览器访问测试 |
架构原理
这是典型的WAF串联部署 模式。用户在浏览器输入 www.sql.com,域名解析到WAF的IP,WAF作为反向代理接收请求,经过安全检测引擎分析后,将正常的请求转发给后端的宝塔服务器,恶意请求则直接拦截。
为什么要这样部署?
在企业环境中,WAF通常部署在Web服务器前面,作为"看门人"角色。所有流量必须经过WAF,才能有效防护后端服务器。本文的部署方式与企业生产环境一致。
二、宝塔面板安装与站点配置
2.1 安装宝塔面板
在准备好的Ubuntu VM上安装宝塔面板。

bash
# 宝塔Ubuntu官方安装命令
wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh && sudo bash install_panel.sh ed8484bec
安装过程大概需要2-5分钟,安装完成后会输出面板访问信息,务必保存好:
Bt-Panel: http://xxx.xxx.xxx.xxx:xxxxx
username: xxxxxx
password: xxxxxx
2.2 登录宝塔面板
浏览器访问 http://192.168.xxx.xxx:8888/xxxxxx,输入用户名密码登录。
首次登录会弹出LNMP环境安装窗口,选择推荐安装即可(Nginx + MySQL + PHP)。
2.3 添加站点
进入宝塔面板 → 左侧菜单 网站 → 点击 添加站点:

填写以下信息:
| 字段 | 值 |
|---|---|
| 域名 | www.sql.com |
| 根目录 | /www/wwwroot/www.sql.com |
| PHP版本 | PHP 7.3(根据靶场要求选择) |
| 创建数据库 | 建议勾选(后续靶场需要) |
点击提交完成站点创建。

2.4 部署SQLi-LABS靶场
SQLi-LABS是一个经典的SQL注入靶场,包含从基础到进阶的多个关卡,非常适合练习SQL注入技术。
2.5 配置数据库
SQLi-LABS需要先初始化数据库:
如果数据库连接失败,检查 sql-connections/sql-connect.php 中的数据库配置:
php
// 通常在sql-connections/sql-connect.php中
$dbuser = 'root'; // 数据库用户名
$dbpass = '你的密码'; // 数据库密码
$dbname = 'security'; // 数据库名
$host = 'localhost'; // 数据库主机
三、 WAF部署
3.1 WAF简介
长亭雷池SafeLine是一款社区版WAF,基于反向代理架构,支持SQL注入、XSS、命令执行等多种攻击类型的检测和拦截。它的核心优势:
- 免费:社区版免费使用,功能完整
- 高性能:基于Tengine,处理能力强
- 易用:Web管理面板,配置简单
- 持续更新:规则库自动更新
3.2 环境检查
SafeLine WAF需要依赖Docker运行,先检查环境:
bash
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 # 查看磁盘信息
3.3 安装Docker
如果还没有安装Docker:
bash
# Ubuntu安装Docker
curl -fsSL https://get.docker.com | bash
# 检查Docker版本
docker --version
3.4 安装 WAF
bash
# 一键安装命令
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/manager.sh)"
安装过程中会出现交互式配置:
选择安装目录
[信息] SafeLine Docker 运行环境检查通过
[信息] 从 /data/safeline 加载配置
请选择 SafeLine 安装目录 [/data/safeline]:
直接回车使用默认目录 /data/safeline。
安装完成输出:
[信息] SafeLine 安装成功!
[信息] 控制台登录:https://xxx.xxx.xxx.xxx:9443
3.5 验证WAF容器运行
bash
docker ps | grep safeline
输出应包含7个容器:
safeline-tengine # WAF核心引擎(反向代理)
safeline-detector # 攻击检测引擎
safeline-mgt # 管理后台
safeline-luigi # 任务调度
safeline-chaos # 统计分析
safeline-pg # PostgreSQL数据库
safeline-fvm # 检测模型管理
3.6 登录WAF管理面板
浏览器访问 https://xxx.xxx.xxx.xxx:9443
⚠️ 注意:使用的是HTTPS协议,浏览器可能会提示"不是安全连接",点击"高级"→"继续前往"即可。这是因为自签名证书的原因,生产环境会替换为正式证书。
首次登录需要设置管理员密码。设置完成后进入WAF管理主页。
3.7 添加站点(配置上游服务器)
这是最关键的一步------告诉WAF要把请求转发给谁。
进入 站点管理 → 添加站点:
关于上游服务器的说明:
- 协议:选择
http(后端宝塔用的是HTTP) - 地址:(宝塔服务器的IP)
- 端口:
80(宝塔站点监听的端口,不是8888面板端口)
⚠️ 常见误区 :上游服务器的端口是宝塔站点的监听端口(通常是80或88),而不是宝塔面板的端口(8888)。可以在宝塔面板中查看站点的配置确认端口。
四、域名解析与访问配置
4.1 配置hosts文件
因为 www.sql.com 是内网测试域名,没有公网DNS解析。我们需要在访问端手动配置hosts文件。
hosts文件位置: C:\Windows\System32\drivers\etc\hosts
以管理员身份编辑该文件,在末尾添加:
xxx.xxx.xxx.xxx www.sql.com
⚠️ 关键点 :IP地址是WAF的IP,不是宝塔的IP。
4.2 最终验证
关闭Clash或配置好直连规则后:
http://www.sql.com
**
**
成功看到SQLi-LABS的靶场页面!此时请求链路完整建立:
浏览器 → hosts → WAF:80 → WAF检测通过 → 宝塔:80 → SQLi-LABS
**
**
五、验证WAF防护效果
5.1 查看WAF拦截日志
登录WAF管理面板 → 攻击日志:
5.2 测试SQL注入拦截
在浏览器地址栏访问:
http://www.sql.com/Less-1/?id=1union%20select(1,2,3)--+
WAF开启时的效果:
返回拦截页面,WAF成功检测到SQL注入攻击。
5.3 查看拦截日志
回到WAF管理面板 → 攻击日志:
可以看到详细记录
六、排错指南
6.1 常见问题一览表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
ping www.sql.com 超时 |
hosts配置错误或WAF VM未开机 | 检查hosts文件IP,确认WAF机器在线 |
| ping通但浏览器无法访问 | DNS缓存 / 浏览器缓存 | ipconfig /flushdns,重启浏览器 |
| 浏览器报 403 Forbidden | Clash代理拦截 | 添加直连规则,见4.3节 |
| 浏览器报 502 Bad Gateway | WAF连不上上游服务器 | 检查宝塔站点端口,WAF上游配置是否正确 |
| 浏览器报 Connection Refused | WAF检测端口没开 | docker ps 确认safeline-tengine在运行 |
| WAF管理面板无法访问 | 防火墙拦截9443端口 | ufw allow 9443 放行端口 |
| 页面加载但没有内容 | 宝塔站点根目录没有文件 | 检查 /www/wwwroot/www.sql.com 是否有文件 |
| PHP无法解析 | 宝塔未安装PHP | 宝塔面板 → 软件商店 → 安装PHP |
6.2 关键排查命令清单
bash
# 1. 查WAF容器是否运行
docker ps | grep safeline
# 2. 查端口监听
ss -tlnp | grep -E ':(80|443|9443)'
# 3. 测试WAF → 宝塔的连通性(在WAF机器上执行)
curl -v -H "Host: www.sql.com" http://192.168.17.137
# 4. 测试WAF转发是否正常(在WAF机器上执行)
curl -v -H "Host: www.sql.com" http://127.0.0.1
# 5. 查看WAF日志
docker logs safeline-detector --tail 50
# 6. 查看tengine访问日志
docker exec safeline-tengine cat /var/log/nginx/access.log | tail -20
6.3 排查思路
浏览器访问 www.sql.com → 出错
│
▼
① ping www.sql.com → IP是不是192.168.17.131?
├── 不是 → 检查hosts文件、刷新DNS缓存
└── 是 → 继续
│
▼
② 浏览器F12 → 远程地址是什么?
├── 127.0.0.1:7890 → Clash代理冲突
└── 192.168.17.131:80 → 继续
│
▼
③ 状态码是什么?
├── 502 → WAF连不上宝塔
│ ├── 检查宝塔VM是否开机
│ ├── 检查宝塔站点是否正常运行
│ └── 检查WAF上游配置的IP和端口
├── 403(带WAF拦截页面) → WAF检测到攻击payload
├── 403(空白) → Clash代理问题
└── 404 → 站点路径问题
七、防御原理与安全建议
7.1 WAF的工作原理
┌─────────────────────────────────────┐
│ 客户端(浏览器/攻击者) │
└──────────────┬──────────────────────┘
│ HTTP请求
▼
┌─────────────────────────────────────┐
│ SafeLine WAF │
│ │
│ ① 协议解析 → ② 解码还原 │
│ ③ 规则引擎匹配 → ④ 动作决策 │
│ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │SQL注入│ │ XSS │ │命令执行│ ...│
│ │规则库 │ │规则库 │ │规则库 │ │
│ └──────┘ └──────┘ └──────┘ │
└──────────────┬──────────────────────┘
│
┌──────────┴──────────┐
▼ ▼
╔══════════════╗ ╔══════════════╗
║ 正常请求→放行 ║ ║ 恶意请求→拦截 ║
╚═══════╤══════╝ ╚═══════╤══════╝
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ 后端Web服务器 │ │ 返回403页面 │
│ (宝塔/nginx) │ │ 记录攻击日志 │
└──────────────┘ └──────────────┘
WAF的工作流程:
- 协议解析:接收HTTP/HTTPS请求,解析请求头、请求体、Cookie等
- 解码还原:对URL编码、Base64编码等内容进行解码还原,防止绕过
- 规则匹配:将解码后的内容与规则库进行匹配(SQL注入、XSS、命令执行、文件包含等)
- 动作决策:根据匹配结果决定放行还是拦截









