基于 OpenResty + Lua 的轻量级 Web 应用防火墙,附带 Flask 管理后台。
- 攻击检测 — 7 类规则覆盖 SQL 注入、XSS、命令注入、路径穿越、恶意扫描器、通用攻击特征、认证绕过
- CC 防护 — IP 频率限制,窗口内超阈值自动拦截(429)
- Redis 实时配置 — 规则/白名单/开关秒级生效,无需重载 Nginx
- Flask 管理后台 — 仪表盘、规则 CRUD、白名单管理、攻击日志
- 态势感知大屏 — 攻击趋势图、类型分布、来源 IP TOP10、地域分布、实时攻击流
- 美观拦截页 — 攻击拦截时展示攻击类型、时间、IP 等详细信息
浏览器 ──▶ Nginx:80 ──▶ waf.lua ──▶ 后端服务
│ │
│ ┌─────┴─────┐
│ ▼ ▼
│ Redis ◀── Flask Admin:5000
│ │ │
│ └─────┬─────┘
│ ▼
│ SQLite
│
└── 攻击返回 403/429 拦截页面
- CentOS Stream 9 / Rocky Linux / RHEL 9(推荐)
- OpenResty(Nginx + LuaJIT)
- Redis
- Python 3.9+
# 1. 安装依赖
yum install -y openresty redis python3 python3-pip
# 2. 启动 Redis
systemctl enable --now redis
# 3. 部署 WAF 核心
cp lua/waf.lua /usr/local/openresty/nginx/lua/
cp nginx.conf.example /usr/local/openresty/nginx/conf/nginx.conf
# 4. 修改 nginx.conf 中的上游后端地址
# proxy_pass http://你的后端IP:端口;
# 5. 启动 Nginx
openresty -s reload
# 6. 部署管理后台
pip3 install -r requirements.txt
cd admin
FLASK_APP=app.py python3 -m flask run --host=127.0.0.1 --port=5000chmod +x deploy-waf.sh
./deploy-waf.sh脚本会引导你输入后端地址、管理员密码,自动完成全部部署。
├── lua/
│ └── waf.lua # WAF 核心,8 段模块化
├── admin/
│ ├── app.py # Flask 路由 & API
│ ├── models.py # SQLite + Redis 操作
│ ├── templates/
│ │ ├── base.html # 侧边栏公共布局
│ │ ├── login.html # 登录页
│ │ ├── dashboard.html # 仪表盘
│ │ ├── rules.html # 规则管理
│ │ ├── whitelist.html # 白名单
│ │ ├── logs.html # 攻击日志
│ │ └── screen.html # 态势感知大屏
│ └── static/
│ └── style.css # 深色安全主题
├── nginx.conf.example # Nginx 配置模板
├── deploy-waf.sh # 一键部署脚本
├── requirements.txt # Python 依赖
└── README.md
-- SQL 注入
{ name = "sql_union_select", target = "args", pattern = [[union\s+select]], desc = "SQL联合查询" },
{ name = "sql_or_digit", target = "args", pattern = [[\sor\s+\d+\s*=\s*\d+]], desc = "SQL永真数字" },
-- XSS
{ name = "xss_script_tag", target = "args", pattern = [[<script[>\s]], desc = "XSS script标签" },
{ name = "xss_onevent", target = "args", pattern = [[on\w+\s*=\s*]], desc = "XSS事件注入" },
-- 命令注入
{ name = "cmd_cat_etc", target = "args", pattern = [[cat\s+/etc/]], desc = "读取系统文件" },
-- 扫描器
{ name = "scanner_sqlmap", target = "ua", pattern = [[sqlmap]], desc = "sqlmap扫描器" },规则通过 Flask 后台或 Redis 实时生效,无需重载 Nginx。
| Redis Key | 说明 | 取值 |
|---|---|---|
waf:enabled |
WAF 开关 | "1" / "0" |
waf:mode |
拦截模式 | "block" / "log" |
waf:rules |
规则列表 | JSON 数组 |
waf:whitelist |
白名单 | JSON 数组 |
waf:cc_enabled |
CC 防护开关 | "1" / "0" |
waf:cc_threshold |
CC 阈值 | 数字字符串 |
waf:cc_window |
CC 窗口(秒) | 数字字符串 |
waf:attack_logs |
攻击日志队列 | Redis List |
MIT License