实现异常流量实时拦截的关键是“日志感知+行为识别+动态响应”闭环,依托nginx原生模块限流、map条件拦截、日志分析+fail2ban封禁、lua动态决策及elk可视化告警联动。

实现异常流量的实时拦截,关键在于“日志感知 + 行为识别 + 动态响应”闭环,不依赖外部WAF也能在Nginx边缘层完成秒级处置。重点不是等攻击发生后再分析,而是把防护逻辑前置到请求进入后、转发上游前的阶段。
用 Nginx 原生模块做第一道防线
限流和连接控制是最轻量、最稳定的实时拦截手段:
-
按路径精细化限速:对登录、API、后台等高危入口单独设限,例如
rate=5r/m配合burst=5 nodelay,超限立即返回429 Too Many Requests; -
限制单IP并发连接数:防止 Slowloris 类慢速攻击,用
limit_conn_zone $binary_remote_addr zone=perip:10m+limit_conn perip 10; -
组合条件拦截敏感行为:用
map指令标记空Referer、可疑 UA(如python-requests、sqlmap),再配合if ($bad_bot) { return 403; }快速拒绝。
基于日志的实时筛查与自动封禁
日志是行为证据源,需结合定时任务或专用工具快速提取异常信号:
- 每分钟扫描
/var/log/nginx/access.log,用awk统计过去60秒内请求超200次的IP,写入临时黑名单; - 过滤高频 404/403 请求,尤其集中在
/wp-login.php、/api/user/login等路径的IP,视为爆破试探; - 将筛选出的IP交由
fail2ban管理:配置 jail 规则(如maxretry = 3、findtime = 300、bantime = 3600),自动调用iptables或nftables封禁。
用 Lua 脚本实现动态决策拦截
当规则更复杂(如需检查请求体、解码参数、关联Redis状态)时,access_by_lua_file 提供灵活扩展能力:
- 在
access.lua中解析ngx.var.request_uri和ngx.var.args,匹配 SQL 注入、路径穿越等特征串; - 调用 Redis 查询该IP最近5分钟请求次数,超阈值则
ngx.exit(403); - 记录拦截日志到独立文件或转发至 Syslog,便于后续审计与模型训练。
接入 ELK 实现可视化告警联动
结构化日志是构建安全态势的基础:
- 通过 Filebeat 或 Logstash 将 Nginx JSON 日志(含
remote_addr、status、request_time、request_uri)送入 Elasticsearch; - 在 Ingest Pipeline 中打标:如单IP 5分钟内请求 > 300 且 404占比 > 80%,自动添加
event.risk: "scanner"; - Kibana 中配置阈值告警(如每分钟新增高风险事件 > 10 条),触发邮件或 webhook 通知运维,并可联动 SOAR 自动执行封禁脚本。











