要快速定位突发流量的ip来源,需实时分析时间窗口、请求密度和行为特征;确保日志记录真实客户端ip,正确配置nginx的real_ip模块及日志字段;用awk按时间切片统计高频ip,并结合404/200状态码与敏感路径识别攻击行为。

要快速定位突发流量的 IP 来源,关键不是等流量过去再复盘,而是抓住“时间窗口 + 请求密度 + 行为特征”三个维度,在日志中实时或准实时筛选出异常源头。
盯住真实客户端 IP 字段
确保日志中记录的是真实用户 IP,而非代理或 CDN 的出口 IP。检查 Nginx 配置是否启用 real_ip 模块:
- 确认已配置 set_real_ip_from(填入 CDN 或 LB 的可信 IP 段)
- 确认 real_ip_header X-Forwarded-For 或 X-Real-IP 正确设置
- 验证日志格式中使用的是 $remote_addr 还是 $http_x_forwarded_for —— 后者需清洗,前者在未穿透代理时才可靠
用时间切片抓高频请求 IP
突发流量往往集中在极短时间内。可用 awk 结合系统时间快速提取最近 2 分钟内请求量突增的 IP:
-
统计过去 2 分钟内单 IP 请求超 80 次:
awk -v start="$(date -d '2 minutes ago' '+%d/%b/%Y:%H:%M')" '$4 ~ /^\[.*start/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | awk '$1 > 80 {print $2}' - 若日志时间含秒(如
[09/Jul/2026:03:45:22 +0000]),可进一步精确到秒级:用date -d '1 minute ago' '+%d/%b/%Y:%H:%M:%S'替换
结合状态码与路径识别可疑行为
单纯高请求数未必是攻击,但叠加特定响应模式就很有指向性:
-
大量 404 + 高频访问常见后台路径:
awk '$9 == "404" && $7 ~ /\/wp-admin|\/phpmyadmin|\/api\/v1\/login/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -5 - 短时间大量 200 响应但请求耗时极低(
可能是机器批量刷接口,加条件
$10 (假设 $10 是 $request_time 字段)
用 fail2ban 实现自动捕获与封禁
人工筛查适合应急,长期需自动化闭环:
- 在
/etc/fail2ban/filter.d/nginx-spike.conf中定义正则,例如匹配 1 分钟内 ≥50 次请求 - 在
jail.local中启用该 filter,设置findtime = 60、maxretry = 50、bantime = 1800 - 重启后运行
fail2ban-client status nginx-spike查看实时触发情况











