直接从日志识别攻击苗头,关键在于发现高频IP、异常请求密度、非业务时段集中访问、特定路径聚焦、状态码分布突变(如404/500/403批量出现)、工具型User-Agent、URL编码及长参数特征,并通过时间线聚合分析攻击阶段递进行为。

直接看日志就能发现攻击苗头,关键不是等警报响,而是从常规访问里识别出“不对劲”的节奏和模式。
盯紧高频IP与异常请求密度
单个IP在1分钟内发起超200次请求,大概率不是用户行为。尤其当这些请求集中在非业务时段(比如凌晨2–4点),或全部指向同一类路径(如/login、/api/auth),就要立即拉出完整记录排查。
- 用命令快速筛出Top 15: awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -15
- 再对可疑IP做纵深分析: grep "192.168.1.100" /var/log/nginx/access.log | awk '{print $7, $9}' | head -20 ——看它到底在刷什么路径、返回什么状态码
状态码分布是攻击类型的温度计
404不是故障,可能是扫描;500不是卡顿,可能是漏洞触发;403不是权限错,可能是越权试探。批量出现某类状态码,往往比单条错误更有指向性。
- 查最近1小时404集中在哪: awk '$9==404 && $4>="[2026-06-14T01:" {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
- 对比正常时段的404比例:如果平时404占0.3%,现在突然升到12%,基本可判定为目录爆破或敏感文件探测
从User-Agent和请求内容抓工具指纹
真实用户浏览器UA有固定结构,而sqlmap、nuclei、gobuster这类工具的UA要么极简(如“python-requests”),要么带明显标识(如“sqlmap/1.7.2”)。它们还常伴随URL编码、长参数、重复payload等特征。
- 搜已知扫描器UA: grep -i "sqlmap\|nuclei\|dirb\|gobuster\|nikto" /var/log/nginx/access.log
- 查含编码字符的GET请求: awk '$7 ~ /%27|%22|%3B|%00/ {print $0}' /var/log/nginx/access.log | head -10
- 找长参数或重复符号: awk 'length($7) > 500 || $7 ~ /a{10,}|OR[[:space:]]+1=1/' /var/log/nginx/access.log
把零散线索串成时间线
一次有效攻击往往分阶段:先扫目录(大量404),再试登录(连续401),最后打漏洞(500+SQL关键字)。只看单点容易漏,按IP+时间窗口聚合才看得清脉络。
- 提取某IP一小时内所有请求并排序: grep "203.123.45.67" /var/log/nginx/access.log | awk -F'[][]' '{print $2,$0}' | sort | cut -d' ' -f1-2,5-
- 重点观察是否出现“404 → 401 → 500”或“/admin → /login → /api/v1/user?id=1%20UNION”这类递进式行为


















