秒级异常流量识别与拦截联动需在请求处理链路最前端实时决策:利用nginx的access_by_lua*执行sql注入/路径穿越检测、redis计数限频;原生limit_req/limit_conn模块毫秒级兜底;日志流+shell亚秒封禁;fail2ban配合json日志实现分钟级收敛。

秒级异常流量识别与拦截联动,关键在于把分析和响应动作压到请求处理链路的最前端,不等日志落盘就做决策。Nginx 本身不是分析引擎,但它的 access 阶段(access_by_lua*)、限流模块和 map 条件判断,配合轻量日志流处理,能实现真正意义上的“秒级”闭环。
用 Lua 脚本在请求入口实时决策
在 access_by_lua_file 中嵌入逻辑,让每个请求在被转发前完成风险评估:
- 解析
ngx.var.request_uri和ngx.var.args,匹配 SQL 注入、路径穿越等特征串,如..%2f、union select、etc/passwd - 调用 Redis 查询该 IP 过去 60 秒内请求数(用
INCR + EXPIRE实现),超阈值(如 50 次)直接ngx.exit(403) - 记录拦截行为到独立日志文件或通过
syslog()推送,避免阻塞主流程
原生限流模块做无延迟兜底
不依赖外部服务,靠 Nginx 自身模块实现毫秒级响应:
- 对敏感路径单独限速:
limit_req_zone $binary_remote_addr$uri zone=scan:10m rate=2r/m,配合burst=2 nodelay,超限立即返回 429 - 限制单 IP 并发连接数:
limit_conn_zone $binary_remote_addr zone=perip:10m+limit_conn perip 5,防 Slowloris 类慢速攻击 - 用
map标记空 Referer、可疑 UA(如python-requests、masscan),再用if ($bad_bot) { return 403; }快速拒绝
日志流+Shell 实现亚秒级协同封禁
当需要更复杂规则(如多维度组合判断),又不想引入 Lua 依赖时,可用日志流实时驱动封禁:
- 用
tail -f /var/log/nginx/access.log持续监听,配合awk提取最近 10 秒内高频 IP(按时间戳字段过滤) - 发现单 IP 10 秒内请求 ≥ 80 次且含
/wp-login.php或状态码为 404,立即执行iptables -I INPUT -s $ip -j DROP - 加白名单保护(如 CDN 回源段、办公网段),避免误封;封禁后写入
/etc/iptables-rules并保存
Fail2ban 配合高精度日志格式实现分钟内收敛
虽然 fail2ban 默认是轮询扫描,但通过优化可逼近秒级响应:
- 在 Nginx 中启用 JSON 日志格式,包含
request_time、status、request_uri等字段,便于正则精准匹配 - 配置
failregex匹配“1 分钟内触发 3 次 /api/login 返回 401”,findtime = 60、maxretry = 3 - 使用
backend = systemd-journal(若日志已接入 journald),跳过文件轮询,实现近实时捕获











