外观
系统架构
GinWAF 采用单机一体化部署。OpenResty / Lua 引擎、Go 后端、MySQL、Redis 与管理控制台等全部组件都安装并运行在同一台服务器上,无需额外的控制端或防护节点机器;一台服务器即可完成完整的防护与管理闭环。
从逻辑上,同一台服务器内的各组件仍按数据面与控制面划分职责。
技术栈
| 层次 | 技术 | 职责 |
|---|---|---|
| 接入层 | OpenResty / Nginx | 承接流量、TLS 卸载、反向代理回源 |
| 检测层 | Lua(LuaJIT) | 实时攻击检测、CC 防护、人机验证、区域判定 |
| 控制层 | Go | 管理接口、规则下发、统计聚合、证书签发 |
| 数据层 | MySQL / Redis | 业务数据持久化、计数与缓存 |
| 展示层 | Vue 3 + Element Plus | 管理控制台与防护大屏 |
| 地域库 | ip2region(离线) | IP 归属地查询,支持 IPv4 / IPv6 |
请求处理流程
text
客户端请求
↓
OpenResty 网关(按域名匹配站点,标记站点 ID)
↓
WAF 引擎(请求处理阶段)
1. 请求规范化与静态资源跳过
2. 加载站点配置
3. IP 黑白名单判定(全局 / 站点)
4. 区域屏蔽、透明代理检测
5. 攻击检测(15 类模块,评分制判定)
6. 人机验证状态判定
7. 自定义 CC 规则 → 限速 / 验证 / 重定向 / 鉴权
8. CC 自动切换判定
9. 默认规则组执行
10. 统计异步上报
↓
回源到源站服务器配置下发
规则的变更通过以下链路下发到数据面:
- 管理后台提交配置 → Go 后端写入数据库
- Go 后端生成站点规则文件(JSON),采用先写临时文件再原子重命名的方式,避免读取到不完整内容
- Lua 引擎在请求处理时按站点读取规则文件(带短时缓存)
- 站点级别的网关配置变更后,自动执行语法校验并平滑重载,失败自动回滚
无需重启
配置变更通过文件下发与平滑重载生效,正常情况无需重启服务,不影响在线业务。
数据上报
| 数据 | 通道 |
|---|---|
| 请求统计(请求数、流量、状态码、QPS) | Redis |
| 攻击日志 | 日志文件 |
| 封禁与验证状态 | Redis |
| CC 自动切换事件 | HTTP 回调 |
核心机制
攻击检测
- 两阶段检测:先做关键词预筛选快速排除,命中后再进入规则精检,兼顾性能与检出率
- 评分制判定:语义 / 高危 / 行为 / 异常多维度评分,达到阈值才拦截,降低单条规则误判
- 深度解码:多轮解码与 Base64 探测,识别绕过变体
- 超时保护:单个请求的检测耗时有上限,避免影响响应
处置分级
| 场景 | 处置 |
|---|---|
| 黑名单 / 区域 / 透明代理命中 | 直接断开连接 |
| 攻击命中 / 需人机验证 | 返回拦截页(403) |
| 触发自动封禁 | 写入封禁名单,后续请求直接断开 |
