搭建WAF+宝塔反向代理

一、环境概览

请求链路

复制代码
浏览器 → 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的工作流程:

  1. 协议解析:接收HTTP/HTTPS请求,解析请求头、请求体、Cookie等
  2. 解码还原:对URL编码、Base64编码等内容进行解码还原,防止绕过
  3. 规则匹配:将解码后的内容与规则库进行匹配(SQL注入、XSS、命令执行、文件包含等)
  4. 动作决策:根据匹配结果决定放行还是拦截
相关推荐
BenSmith4 小时前
RTOS漏洞分析:CVE-2026-10641和CVE-2026-9263
安全
Dola_Zou4 小时前
以CmASIC重塑AI+边缘设备的安全与商业复利
人工智能·安全·软件工程·软件加密
小小小小钰儿5 小时前
网络安全名词术语!
安全·web安全·计算机·网络安全·黑客·编程
其实防守也摸鱼6 小时前
运维--安全与数据库
网络·数据库·学习·安全·安全威胁分析·数据库架构·软件安全
阿图灵7 小时前
requests 请求429报错解决方案(Vercel 平台安全拦截)
安全
拥抱太阳06168 小时前
HarmonyOS 应用开发《掌上英语》第14篇:可空类型与安全调用:ArkTS 的非空保障策略
安全
Sirius Wu8 小时前
OpenClaw Observability 并发安全(Per-Request Hook)完整详解
服务器·网络·人工智能·安全·ai·架构·aigc
xywww1689 小时前
AWS 账号安全加固:Root 与 IAM 用户的 MFA 设置实操清单
安全·云计算·aws
头茬韭菜9 小时前
4.3 BashTool 防御链 — 七层安全防御的工程实现
安全·ai