ddos攻击可通过nginx日志中单ip请求频率突增、路径集中、状态码单一、请求与响应时间失衡等特征识别;重点筛查每分钟超50–100次请求且占总量60%以上的异常ip。

直接看 Nginx 访问日志就能发现 DDOS 攻击的典型痕迹,关键不是翻全量日志,而是聚焦几个可量化、易比对的字段组合。
单 IP 请求频率异常突增
DDOS 的核心特征是“量大且集中”。用以下命令快速筛查:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20重点关注每分钟请求数超过 50–100 次的 IP。若前 10 名 IP 总请求量占当日总量 60% 以上,基本可判定为 CC 或应用层 DDOS。
注意区分真实用户行为:正常用户访问有间隔、路径分散、状态码多样;攻击流量往往在 同一秒内密集打同一路径,且多返回 200 或 404。
请求时间与响应时间严重失衡
加入 $request_time 和 $upstream_response_time 字段后,能识别慢速攻击(如 Slowloris):
-
$request_time很大(>10s),但$upstream_response_time极小( -
$request_time和$upstream_response_time都很大 → 后端真卡了,需查服务而非封 IP
这类攻击不靠数量,靠耗尽 Nginx 的 worker_connections,日志里表现为大量长连接未关闭、time_local 时间跨度异常拉长。
请求内容高度同质化
真实用户请求具备多样性,攻击流量则呈现“三统一”:
-
URI 统一:大量访问
/、/api/health、/favicon.ico等无业务逻辑路径 - 状态码统一:95% 以上为 200(压测型)或 404(扫描型)
-
User-Agent 统一:空值、简写(如
-)、或含curl、python-requests、masscan等工具标识
可用 grep 快速验证:grep 'python-requests' /var/log/nginx/access.log | head -5,若连续出现且 IP 高频,大概率是自动化攻击。
真实源 IP 被代理掩盖
若你用了 CDN 或反向代理,$remote_addr 显示的是内网地址(如 10.x.x.x、172.x.x.x),此时必须依赖 $http_x_forwarded_for 还原真实出口 IP。
配置日志格式时务必显式包含该字段:
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time';
否则所有分析都基于假 IP,封禁无效,甚至误伤 CDN 节点。











