本文由财富云计算提供,我们提供高防服务器与 CDN 防护服务,NAT 型无独立公网 IP 价格比独立 IP 省一半以上,日志分析是防护调优的地基,配合我们的防护方案更精准。
一、日志基础:格式与字段
先看懂你的日志。标准 combined 格式:
192.168.1.100 - - [21/Oct/2026:14:30:00 +0800] "GET /api/search?kw=test HTTP/1.1" 200 1234 "https://z0w.cn/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"字段拆解:
| 位置 | 字段 | 防护分析用途 |
|---|---|---|
| $1 | 客户端 IP | 第一筛选维度(注意 CDN 场景见第二节) |
| $4 | 时间 | 攻击时段定位、节奏分析 |
| $6 | 请求方法 + URI | 攻击目标(打的哪个接口) |
| $9 | 状态码 | 404 潮(扫描)、429/503(限流生效)、500(被打崩) |
| $10 | 响应大小 | 大响应请求(下载攻击) |
| $11 | Referer | 空/伪造(机器流量特征) |
| $12 | User-Agent | 机器指纹(curl/python-requests/扫描器) |
建议的扩展日志格式(防护分析用,把响应时间也记上):
log_format security '$remote_addr - [$time_local] "$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" rt=$request_time '
'uct=$upstream_connect_time uht=$upstream_header_time urt=$upstream_response_time';
access_log /var/log/nginx/access.log security;二、前置处理:CDN/高防场景的真实 IP
日志里全是 CDN 节点 IP?分析全白搭。两种解法:
解法 1:Nginx real_ip(推荐,源头解决):
set_real_ip_from 203.0.113.0/24; # CDN/高防回源段
real_ip_header X-Forwarded-For;
real_ip_recursive on;解法 2:日志后处理(来不及改配置时):
# 从 X-Forwarded-For 提真实 IP 替换第一列
awk '{
xff = ""
for (i=12; i<=NF; i++) if ($i ~ /^"https?:\/\//) { xff = $i; break }
# X-Forwarded-For 在自定义格式里按位置调整,这里示意思路
print $0
}' access.log没做 real_ip 的分析都是错的——你统计的「攻击 IP」其实是 CDN 节点,「单 IP 频率」永远不超限。这是日志分析第一大坑。
三、粗筛:三个维度看攻击轮廓
拿到攻击时段的日志(比如 grep "21/Oct/2026:14:" access.log),按三个维度粗筛:
3.1 维度一:来源 IP 分布
# Top 20 请求 IP
awk '{print $1}' attack.log | sort | uniq -c | sort -rn | head -20
# 攻击特征:Top IP 请求量是其他 IP 的几十倍 = 单点攻击
# 全体 IP 量都不高但总量异常 = 分布式攻击3.2 维度二:请求 URI 分布
# 去掉参数,看接口热度
awk '{print $7}' attack.log | cut -d'?' -f1 | sort | uniq -c | sort -rn | head -20| 形态 | 判断 |
|---|---|
/ 首页占 80%+ | 正常流量 |
某个 /api/xxx 一柱擎天 | 精准打接口(看它贵不贵) |
| 大量不存在的路径 + 404 | 扫描器(目录爆破) |
?id=1&id=2&id=3... 参数遍历 | 爬虫或注入尝试 |
3.3 维度三:UA 分布
awk -F'"' '{print $6}' attack.log | sort | uniq -c | sort -rn | head -20| 形态 | 判断 |
|---|---|
| 五花八门的真实浏览器 | 正常(或高级拟人攻击) |
清一色 python-requests/2.x | 脚本小子 |
sqlmap/1.x、Nikto | 漏洞扫描,拉黑 + 查有没有被打进去 |
| 空 UA 或奇怪短 UA | 自动化工具 |
四、细筛:定位攻击特征
4.1 攻击时段流量曲线
# 每分钟请求数(看攻击起点和峰值)
awk '{print $4}' attack.log | cut -d: -f1-3 | sort | uniq -c | sort -rn | head -20
# 输出示例:[21/Oct/2026:14:30 → 每分钟请求量用途:确认攻击起止时间(取证)、限流阈值设定(峰值的两倍)。
4.2 单 IP 行为画像
锁定可疑 IP 后,看它的完整行为:
SUSPECT="1.2.3.4"
# 它都请求了什么
grep "^$SUSPECT " attack.log | awk '{print $6, $7, $9}' | sort | uniq -c | sort -rn | head -30
# 它的请求节奏(精确到秒)
grep "^$SUSPECT " attack.log | awk '{print $4}' | head -50
# 状态码分布(403/404 多 = 在试错,扫描)
grep "^$SUSPECT " attack.log | awk '{print $9}' | sort | uniq -c节奏判据:请求间隔完全一致(精确到毫秒)= 机器;随机间隔 = 人或高级工具。
4.3 状态码分析
# 全日志状态码分布
awk '{print $9}' attack.log | sort | uniq -c | sort -rn| 状态码异常 | 含义 |
|---|---|
| 404 暴涨 | 目录扫描/漏洞探测(.env、wp-config、/admin) |
| 403 暴涨 | 撞你的 WAF/白名单(攻击者在试探边界) |
| 401 暴涨 | 撞登录(爆破) |
| 500 暴涨 | 被打崩了(看应用日志找根因) |
| 429 暴涨 | 限流在干活(好事,看阈值要不要调) |
4.4 响应时间异常
# 请求耗时 Top(慢查询可能是攻击目标,也可能是你该优化了)
awk '{for(i=1;i<=NF;i++) if ($i ~ /^rt=/) {print $i, $7}}' attack.log | sort -rn | head -20rt=30.000 的请求 = 卡死 30 秒——CC 打慢接口的典型痕迹。
五、特定攻击的日志模式
5.1 CC 攻击
# 单 IP 秒级请求数(每分钟算一次)
grep "^1.2.3.4 " attack.log | awk '{print $4}' | cut -d: -f1-3 | uniq -c
# 单分钟几百次 = CC 实锤5.2 暴力破解(登录爆破)
# POST /login 的记录
grep '"POST /login' attack.log | awk '{print $1}' | sort | uniq -c | sort -rn | head
# 单 IP 大量 POST 登录 + 401/403 = 爆破5.3 扫描器
# 404 的来源 IP(扫 paths 的)
awk '$9 == 404 {print $1}' attack.log | sort | uniq -c | sort -rn | head -20
# 404 请求的 URI 特征(.env/.git/backup)
awk '$9 == 404 {print $7}' attack.log | sort | uniq -c | sort -rn | head -305.4 恶意下载(爬你整站)
# 单 IP 的请求 URI 数量(爬虫特征:短时间内遍历大量页面)
awk '{print $1}' attack.log | sort | uniq -c | sort -rn | head -5 | while read cnt ip; do
echo "IP $ip: $(grep "^$ip " attack.log | awk '{print $7}' | sort -u | wc -l) 个不同URI / $cnt 请求"
done判据:请求数远大于独立 URI 数 = 刷;请求数≈URI 数且 URI 量大 = 爬虫。
六、日志驱动的防御动作
分析不是目的,转化为动作:
# 1. 封 Top 攻击 IP(立即生效)
for ip in $(awk '{print $1}' attack.log | sort | uniq -c | sort -rn | head -10 | awk '{print $2}'); do
iptables -A INPUT -s $ip -j DROP
done
# 2. 写进 fail2ban 持久化(防重启丢)
# jail.local 里加 nginx-badbots filter,匹配日志里的攻击模式
# 3. 调整限流阈值(按攻击峰值 ×1.5)
# Nginx limit_req rate 调整
# 4. 接口加固(如果打的是贵接口)
# 给 /api/search 加缓存 + 单独限流封 IP 的注意事项:
- 先确认不是 CDN 节点 IP(做了 real_ip 就不是问题)
- 分布式攻击封 IP 是徒劳——封得过来,攻击者换一批(这时靠 CDN/高防)
- 封错正常用户的代价比放过攻击者高——拿不准的 IP 先「限流观察」别直接 DROP
七、证据固定(报警/投诉用)
攻击量大或勒索时,证据要规范:
# 1. 时间线日志(保留原始行,别只存统计结果)
grep "21/Oct/2026:14:[0-5]" /var/log/nginx/access.log > /tmp/evidence-timeline.log
# 2. 计算攻击总量(证明损失)
wc -l /tmp/evidence-timeline.log
awk '{sum += $10} END {print "总流量:", sum/1024/1024, "MB"}' /tmp/evidence-timeline.log
# 3. 哈希固定(防篡改质疑)
sha256sum /tmp/evidence-timeline.log > /tmp/evidence-timeline.log.sha256
# 4. 服务器侧证据
ss -s > /tmp/evidence-ss.txt
netstat -s > /tmp/evidence-netstat.txt
tar -czf /tmp/evidence-$(date +%F).tar.gz /tmp/evidence-*报警材料清单:攻击时间线、攻击源 IP 列表、攻击流量总量、业务损失说明、日志哈希。去派出所网安或通过云商家通道提交。
八、日志运维:日常就要做好的
# 1. 日志轮转(别让磁盘满——攻击时日志暴涨是最常见的二次事故)
cat > /etc/logrotate.d/nginx << 'EOF'
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
endscript
}
EOF
# 2. 日志备份到异地(被入侵删日志是攻击者的常规操作)
rsync -az /var/log/nginx/ 备份服务器:/logs/$(hostname)/
# 3. 实时监控接入(日志异常秒级告警)
# 简单版:cron 每分钟统计,超阈值通知
# 专业版:Loki + Grafana(见 Loki 篇)日志被删 = 证据全无。重要业务的日志必须异地备份——攻击者清完本地日志,你还有备份可以溯源(安全应急响应)。
九、速查命令卡
# Top IP awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
# Top URI awk '{print $7}' access.log | cut -d'?' -f1 | sort | uniq -c | sort -rn | head -20
# Top UA awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn | head -20
# 状态码分布 awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 每分钟请求 awk '{print $4}' access.log | cut -d: -f1-3 | sort | uniq -c
# 某 IP 全部请求 grep "^1.2.3.4 " access.log
# 404 的 IP awk '$9==404 {print $1}' access.log | sort | uniq -c | sort -rn | head
# 大响应请求 awk '$10 > 1000000 {print $1, $7, $10}' access.log | sort -rn | head
# POST 请求 awk '$6 ~ /POST/ {print $1, $7}' access.log | sort | uniq -c | sort -rn | head十、小结
日志分析三段论:粗筛(IP/URI/UA 三维度看轮廓)→ 细筛(时段曲线 + 单 IP 画像 + 状态码)→ 转化(封 IP、调限流、加防护)。两个前提:CDN 场景必须 real_ip 还原真实 IP(否则分析全错),日志必须异地备份(否则证据全无)。日志的价值不止事后——攻击时的 Top URI 告诉你该加固哪个接口,峰值 QPS 告诉你限流阈值设多少。会看日志的站长,防护调优永远有依据。
相关阅读:
本文由财富云计算整理,我们提供高防服务器、CDN 防护与 NAT 型云服务器,无独立公网 IP 机型价格比独立 IP 省一半以上,需要日志分析协助或防护方案的咨询。更多教程见端口速查表。
延伸阅读
- 高防误区与避坑清单:25 个坑+下单前必问 14 问+到货验货流程
- DNS 攻击防护专题:劫持、隧道、投毒、放大四类攻击与 DNSSEC
- 电商大促防攻击预案:T-14 到当天的分级响应与降级开关
- 源站真实 IP 隐藏完全指南:六大暴露面排查+NAT 型终极方案
- 攻击应急响应手册:六阶段响应流程,从确认到复盘的照做清单
- iptables 抗 DDoS 配置模板:状态过滤+SYN 防护+防扫描+游戏服版
- OpenResty Lua 自研 WAF:动态限流+攻击特征检测+Redis 黑名单
- Nginx 进阶防护:连接层、请求层、行为层三层生产级配置

[...]□ 日志监控非回源段访问这张表建议每季度过一遍——业务变更(新子域名、新 APP 版本)随时引入新暴露面。六、被绕过打了怎么办日志发现「非 CDN 段的 IP 在访问源站」= 源站已暴露,攻击者正在绕过防护:确认白名单生效:没配回源白名单的立刻配(3.1),配了的查是不是有漏洞(子域名旁路、其他端口)找暴露点:拿第三节的清单过一遍,多半是某个子域名或邮件换 IP / 切架构:紧急情况下源站换 IP[...]
2026-10-21 回复
[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-21 回复