被攻击后,统计请求频率是找出可疑目标地址最直接的手段,通过分析Web服务器访问日志,提取每个源IP的请求次数并排序,高频IP往往就是攻击源或跳板节点。
网站被攻击怎么查找攻击源IP?先确认日志记录是否完整
很多运维在服务器被打时第一反应是重启或封IP,但如果你连攻击源IP都还没定位,后续操作基本是盲猜,要统计请求频率,前提是访问日志还保留着,先花两分钟确认日志文件是否在、有没有被轮转覆盖。
- Nginx默认日志路径:
/var/log/nginx/access.log - Apache默认日志路径:
/var/log/httpd/access_log或/var/log/apache2/access.log - 宝塔面板站点日志:
/www/wwwlogs/你的域名.log - 如果使用CDN,源站日志记录的是回源IP,攻击源IP需要看CDN控制台的请求分析
快速查看日志尾部是否还在更新,用tail -f /var/log/nginx/access.log,如果日志文件大小异常暴增,说明攻击正在进行,此时统计频率更紧迫,如果日志被关闭或已经轮转,后文会提到实时抓包兜底方案。
nginx统计请求频率找出攻击IP的完整步骤
以Nginx默认的combined日志格式为例,每一行大概长这样:
0.113.50 - - [21/Feb/2026:14:32:10 +0800] "GET /login HTTP/1.1" 200 1024 "-" "Mozilla/5.0"
第一列0.113.50就是源IP,我们要做的,就是统计这一列在所有日志中出现的次数。
提取源IP字段
最简单的命令是先用head看几行日志,确认第一列确实是IP,没有被反向代理改写:
head -5 /var/log/nginx/access.log
如果前面还有代理层,比如Nginx前面挂了HAProxy或CDN,需要确认$remote_addr是不是真实客户端IP,多数默认配置下,$remote_addr就是连接源IP,如果日志第一列是内网IP,说明流量经过上一层代理,攻击源IP在上一层设备的日志里。
统计每个IP的请求次数并排序
核心命令如下:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
这条命令拆开看:
awk '{print $1}':只取每行第一个字段,也就是源IPsort:把IP先排序,让相同IP挨在一起uniq -c:统计每段连续相同IP的数量sort -nr:按数量从大到小倒序排列head -20:只输出前20个
输出样例:
87341 203.0.113.50 12006 198.51.100.23 4387 192.0.2.77 1023 203.0.113.88
第一个IP在日志窗口内请求了8万多次,而正常用户通常只有几次到几十次,这种量级的请求频率,基本可以判断为攻击源或恶意爬虫。
按时间段缩小排查范围
如果日志文件很大,全量统计会消耗较长时间,可以先按攻击开始的时间段过滤,比如攻击集中在下午两点到三点:
grep "21/Feb/2026:14:" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
grep匹配日志中的时间戳字段,只保留那一小时的数据再统计,这样能更快定位攻击发起时间,也能观察攻击是否分阶段换IP。
Linux下统计IP访问频率命令对比:选对方法事半功倍
除了awk+sort+uniq这套基础组合,Linux下还有几类工具适合不同场景,以下是三种常见方式的对比。
awk加sort加uniq组合
- 优点:所有Linux发行版都自带,不用安装任何软件,适合日志分析和临时排查
- 缺点:日志量达到几十GB时,排序过程较慢,需要几分钟到十几分钟
- 适用场景:事后分析已经存在的日志文件
goaccess实时分析工具
安装命令:
# CentOS/RHEL yum install goaccess -y # Debian/Ubuntu apt install goaccess -y
运行:
goaccess /var/log/nginx/access.log --log-format=COMBINED
它会生成一个交互式终端面板,直观展示访问者IP、请求数、状态码分布,也可以生成HTML报告,适合快速观测请求频率分布,但不能像awk那样直接定制字段组合。
ngxtop实时监控
安装:
pip install ngxtop
运行:
ngxtop -l /var/log/nginx/access.log
它会以类似top的形式实时刷新,默认展示访问最频繁的IP和请求路径,适合攻击正在发生时边看边判断,但需要Python环境,部分生产服务器可能没有。
| 工具 | 安装难度 | 实时性 | 定制统计字段 | 适合场景 |
|---|---|---|---|---|
| awk+sort+uniq | 无 | 否 | 高 | 事后分析 |
| goaccess | 低 | 准实时 | 低 | 快速生成报告 |
| ngxtop | 中 | 是 | 中 | 实时观测攻击源 |
三种方法并不冲突,可以先上ngxtop观察实时异常IP,再用awk精确统计时间窗口内的请求次数,确认攻击源地址。
确认可疑目标地址后的处理建议
统计出高频IP后,先别急着封禁,行业共识认为,单纯请求频率高不代表一定是恶意攻击,有可能是正常的大流量客户端或CDN回源节点,需要结合几个维度交叉验证。
结合请求路径、User-Agent和状态码判断
- 高频IP反复请求同一个登录接口,且状态码多为401或200,可能是撞库或暴力破解
- 高频IP请求路径散乱,大量返回404或499,可能是目录扫描或CC攻击
- 高频IP的User-Agent异常统一,比如全是同一种旧版浏览器或空UA,多为脚本攻击
- 高频IP来自多个邻近网段,可能是僵尸网络的一部分
据OWASP公开资料,暴力破解和CC攻击在日志上都会表现为单一IP短时间内的请求频率异常升高,但行为模式有明显差异,暴力破解集中在认证接口,CC攻击通常模拟正常请求路径但密集发起。
临时封禁与长期防护
临时封禁可以用iptables或firewalld:
# iptables封禁单个IP iptables -I INPUT -s 203.0.113.50 -j DROP # firewalld封禁单个IP firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.50" drop' firewall-cmd --reload
也可以在Nginx层封禁:
location / {
deny 203.0.113.50;
deny 198.51.100.23;
}
如果攻击流量已经打满服务器带宽,单机封禁作用有限,这时候才会考虑接入高防IP或CDN,不过买之前建议先了解高防IP价格对比,不同服务商的基础防护套餐价格差异不小,而且很多是按防护峰值和带宽计费,类似北京服务器被攻击排查这类需求,机房可能自带基础流量清洗,但自己先完成频率统计,能避免把正常用户IP误封掉。
被攻击后统计请求频率常见问题答疑
网站被攻击怎么查找攻击源IP更准确?
先按请求频率筛选Top 20 IP,再结合请求路径、User-Agent、状态码和IP归属地综合判断,不要只因为请求量大就认定是攻击源,高频访问可能来自CDN节点、搜索引擎蜘蛛或企业出口IP,用whois命令或在线IP库查一下归属,确认不是关键基础设施后再处理。
没有开启访问日志还能统计请求频率吗?
可以,如果Nginx没有配置access_log,可以临时在站点配置中增加以下行,然后nginx -s reload:
access_log /var/log/nginx/emergency_access.log;
之后新的请求会被记录,如果连配置都来不及改,可以用tcpdump抓取流量,再用awk统计源IP出现次数,这种方式非常紧急,但性能开销较大,只适合定位最活跃的几个攻击IP,不能作为长期手段。
统计出的可疑IP能否直接批量封禁?
不建议直接全封,应该先排除CDN回源IP段和搜索引擎蜘蛛IP,确认攻击源后再批量处理,业内专家指出,误封CDN节点会造成全站不可访问,误封搜索引擎蜘蛛会影响收录,批量封禁时用脚本读取IP列表逐条加入防火墙规则,同时保留一份白名单以备随时解封。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/654331.html





