21 10 月 2026
本文由财富云计算提供,我们提供高防服务器与 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响应大小大响应请求(下载攻击)
$11Referer空/伪造(机器流量特征)
$12User-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 -20

rt=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 -30

5.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 省一半以上,需要日志分析协助或防护方案的咨询。更多教程见端口速查表。
延伸阅读
  1. 高防误区与避坑清单:25 个坑+下单前必问 14 问+到货验货流程
  2. DNS 攻击防护专题:劫持、隧道、投毒、放大四类攻击与 DNSSEC
  3. 电商大促防攻击预案:T-14 到当天的分级响应与降级开关
  4. 源站真实 IP 隐藏完全指南:六大暴露面排查+NAT 型终极方案
  5. 攻击应急响应手册:六阶段响应流程,从确认到复盘的照做清单
  6. iptables 抗 DDoS 配置模板:状态过滤+SYN 防护+防扫描+游戏服版
  7. OpenResty Lua 自研 WAF:动态限流+攻击特征检测+Redis 黑名单
  8. Nginx 进阶防护:连接层、请求层、行为层三层生产级配置
更多阅读
  1. 上一篇:攻击应急响应手册:六阶段响应流程,从确认到复盘的照做清单
  2. 下一篇:源站真实 IP 隐藏完全指南:六大暴露面排查+NAT 型终极方案
发表评论 2