日志聚合能看出什么
用 awk 对 access.log 按状态码、来源 IP、请求路径与 UA 分别排序计数,扫描与漏洞探测会在统计里自己冒出来:单 IP 请求量畸高、404 集中、陌生 UA、路径带明显字典特征。
判定要留余地
404 多不一定是攻击,站点改版、外链失效、爬虫误爬都会产生同类现象,需要结合单 IP 的 404 集中度与请求节奏定性。统计前先 head 一行确认日志格式,列号一变,awk 结果就全错。
基本信息
| 状态码 | combined 格式第 9 列 |
|---|---|
| 来源 IP | 第 1 列 |
| 请求行 | 第 7 列(含方法与路径) |
| UA | 末列引号内的客户端标识 |
| 时间 | 第 4 列方括号内的本地时间 |
| 常见路径 | /var/log/nginx/access.log、/www/wwwlogs/*.log |
典型使用场景
- 判断站点是否正被扫描或暴力探测
- 定位被成功利用的路径(200 响应里的异常请求)
- 统计来源 IP 以决定封禁范围
- 确定攻击时间窗,为其他日志检索提供线索
- 评估入侵是否源自某个组件漏洞
状态码与来源聚合
状态码与来源聚合
head -n 1 /var/log/nginx/access.log # 先确认格式与列位
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -n 20
awk '$9 == 404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -n 20
grep -aiE 'sqlmap|masscan|nmap|Go-http-client|python-requests' /var/log/nginx/access.log | tail -n 20
zgrep -aiE 'union.*select|/etc/passwd' /var/log/nginx/access.log*.gz 2>/dev/null | tail -n 10输出逐列读法
| 统计维度 | 含义 | 正常/异常 |
|---|---|---|
| 状态码分布 | 各类响应占比 | 404 占比异常高说明探测密集 |
| 单 IP 请求量 | 来源集中度 | 单 IP 占比过高需核对其请求路径 |
| 高频路径 | 被反复访问的 URL | 出现管理路径、备份文件、配置文件需重点看 |
| UA 分布 | 客户端标识 | 出现扫描器或脚本 UA 即为定性依据 |
自定义日志格式会移动列位:统计前用 head -n 1 核对一行,必要时按 log_format 定义重新计算字段位置。
别只统计 top 10:慢速扫描与低频探测藏在长尾里,需要按时间维度补查,例如逐小时统计单 IP 的请求量。
时间窗与成功利用线索
时间窗与成功利用线索
awk -F'[][]' '{print $2}' /var/log/nginx/access.log | cut -d: -f1,2 | sort | uniq -c | sort -rn | head -n 20
awk '$9==200 && $7 ~ /(admin|upload|\.php|wp-login)/ {print $1, $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -n 20
awk -F'[][]' '$2 ~ /01\/Oct\/2026:0[0-9]/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head统计之后要做的三件事
- 把高频来源 IP 与已成功的 200 请求路径单独导出,作为封禁与清理依据
- 把攻击时间窗交给日志检索环节,用于比对系统与认证日志
- 检查服务器是否安装 WAF,若有则调取其拦截记录补充上下文