搭建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.comSQL注入靶场测试WAF防护效果宿主机访问端xxx.xxx.xxx.xxx本机浏览器访问测试架构原理这是典型的WAF串联部署模式。用户在浏览器输入www.sql.com域名解析到WAF的IPWAF作为反向代理接收请求经过安全检测引擎分析后将正常的请求转发给后端的宝塔服务器恶意请求则直接拦截。为什么要这样部署在企业环境中WAF通常部署在Web服务器前面作为看门人角色。所有流量必须经过WAF才能有效防护后端服务器。本文的部署方式与企业生产环境一致。二、宝塔面板安装与站点配置2.1 安装宝塔面板在准备好的Ubuntu VM上安装宝塔面板。# 宝塔Ubuntu官方安装命令wget-Oinstall_panel.sh https://download.bt.cn/install/install_panel.shsudobashinstall_panel.sh ed8484bec安装过程大概需要2-5分钟安装完成后会输出面板访问信息务必保存好Bt-Panel: http://xxx.xxx.xxx.xxx:xxxxx username: xxxxxx password: xxxxxx2.2 登录宝塔面板浏览器访问http://192.168.xxx.xxx:8888/xxxxxx输入用户名密码登录。首次登录会弹出LNMP环境安装窗口选择推荐安装即可Nginx MySQL PHP。2.3 添加站点进入宝塔面板 → 左侧菜单网站→ 点击添加站点填写以下信息字段值域名www.sql.com根目录/www/wwwroot/www.sql.comPHP版本PHP 7.3根据靶场要求选择创建数据库建议勾选后续靶场需要点击提交完成站点创建。2.4 部署SQLi-LABS靶场SQLi-LABS是一个经典的SQL注入靶场包含从基础到进阶的多个关卡非常适合练习SQL注入技术。2.5 配置数据库SQLi-LABS需要先初始化数据库如果数据库连接失败检查sql-connections/sql-connect.php中的数据库配置// 通常在sql-connections/sql-connect.php中$dbuserroot;// 数据库用户名$dbpass你的密码;// 数据库密码$dbnamesecurity;// 数据库名$hostlocalhost;// 数据库主机三、 WAF部署3.1 WAF简介长亭雷池SafeLine是一款社区版WAF基于反向代理架构支持SQL注入、XSS、命令执行等多种攻击类型的检测和拦截。它的核心优势免费社区版免费使用功能完整高性能基于Tengine处理能力强易用Web管理面板配置简单持续更新规则库自动更新3.2 环境检查SafeLine WAF需要依赖Docker运行先检查环境uname-m# 查看指令架构cat/proc/cpuinfo|grepprocessor# 查看 CPU 信息lscpu|grepssse3# 确认 CPU 是否支持 ssse3 指令集lscpu|grepavx2# 确认 CPU 是否支持 avx2 指令集dockerversion# 查看 Docker 版本dockercompose version# 查看 Docker Compose 版本docker-composeversion# 查看老版本 docker-compose 版本free-h# 查看内存信息df-h# 查看磁盘信息3.3 安装Docker如果还没有安装Docker# Ubuntu安装Dockercurl-fsSLhttps://get.docker.com|bash# 检查Docker版本docker--version3.4 安装 WAF# 一键安装命令bash-c$(curl-fsSLkhttps://waf-ce.chaitin.cn/release/latest/manager.sh)安装过程中会出现交互式配置选择安装目录[信息] SafeLine Docker 运行环境检查通过 [信息] 从 /data/safeline 加载配置 请选择 SafeLine 安装目录 [/data/safeline]直接回车使用默认目录/data/safeline。安装完成输出[信息] SafeLine 安装成功 [信息] 控制台登录https://xxx.xxx.xxx.xxx:94433.5 验证WAF容器运行dockerps|grepsafeline输出应包含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/?id1union%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 ForbiddenClash代理拦截添加直连规则见4.3节浏览器报502 Bad GatewayWAF连不上上游服务器检查宝塔站点端口WAF上游配置是否正确浏览器报Connection RefusedWAF检测端口没开docker ps确认safeline-tengine在运行WAF管理面板无法访问防火墙拦截9443端口ufw allow 9443放行端口页面加载但没有内容宝塔站点根目录没有文件检查/www/wwwroot/www.sql.com是否有文件PHP无法解析宝塔未安装PHP宝塔面板 → 软件商店 → 安装PHP6.2 关键排查命令清单# 1. 查WAF容器是否运行dockerps|grepsafeline# 2. 查端口监听ss-tlnp|grep-E:(80|443|9443)# 3. 测试WAF → 宝塔的连通性在WAF机器上执行curl-v-HHost: www.sql.comhttp://192.168.17.137# 4. 测试WAF转发是否正常在WAF机器上执行curl-v-HHost: www.sql.comhttp://127.0.0.1# 5. 查看WAF日志dockerlogs safeline-detector--tail50# 6. 查看tengine访问日志dockerexecsafeline-tenginecat/var/log/nginx/access.log|tail-206.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、命令执行、文件包含等动作决策根据匹配结果决定放行还是拦截