服务器带宽跑满排查,定位恶意爬虫与CC攻击
服务器带宽突然跑满,最直接的表现是网站打开变慢、SSH 连接卡顿,甚至完全无法访问。
这种情况通常不是硬件故障,而是流量异常。
本文按“看清流量→定位来源→判断类型→处理封禁→验证效果”的顺序,带零基础用户一步步排查恶意爬虫与 CC 攻击。
先确认:带宽是不是真的被占满了
登录服务器后,不要急着装软件,先用系统自带命令看整体流量。
# 查看网卡实时流量,按 Ctrl+C 退出
sar -n DEV 1 5
如果系统没有 sar,可以用 cat /proc/net/dev 查看累计字节数,间隔几秒执行两次,对比 eth0 或 ens33 的接收和发送字节差值。
更直观的方式是安装 iftop:
# CentOS/AlmaLinux
yum install iftop -y
# Ubuntu/Debian
apt install iftop -y
# 运行,-P 显示端口,-n 不解析域名
iftop -P -n
iftop 界面顶部会显示实时总带宽,下面列出连接对端的 IP 和流量。如果某个外部 IP 或某一小段 IP 段持续占据大量上行或下行流量,基本可以锁定异常来源。
从 Nginx 日志里找出高频访问者
iftop 只能看到 IP,要判断是爬虫还是 CC 攻击,需要结合 Web 日志。
以宝塔面板环境为例,日志路径通常在 /www/wwwlogs/ 下。
# 统计访问量最高的前 20 个 IP
awk '{print $1}' /www/wwwlogs/你的域名.log | sort | uniq -c | sort -rn | head -20
如果某个 IP 的请求数远高于其他 IP,比如单 IP 几分钟内出现上万次请求,就属于异常。
继续看这个 IP 在请求什么:
# 查看该 IP 的请求 URL 和 User-Agent
grep '可疑IP' /www/wwwlogs/你的域名.log | awk '{print $7}' | sort | uniq -c | sort -rn | head
判断依据:
- 请求集中在搜索页、动态接口或登录页,且 URL 参数不断变化,偏向 CC 攻击。
- User-Agent 是空、常见爬虫库名称,或伪装成搜索引擎但反查 IP 不属于对应搜索引擎,偏向恶意爬虫。
- 请求间隔极短、并发高,但每个请求都带完整浏览器头,可能是模拟正常用户的 CC 攻击。
用防火墙和 Nginx 限制异常流量
确认恶意 IP 后,先临时封禁,再配置限流规则。
方法一:firewalld 直接封 IP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="可疑IP" reject'
firewall-cmd --reload
方法二:Nginx 限制单 IP 请求频率
在 nginx.conf 的 http 块中加入:
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
在需要保护的 server 或 location 块中引用:
limit_req zone=perip burst=20 nodelay;
limit_req_status 429;
保存后执行 nginx -t 测试配置,
再 nginx -s reload 生效。rate=10r/s 表示每个 IP 每秒最多 10 个请求,
超过就返回 429,
适合拦截大多数 CC 攻击。
方法三:宝塔面板操作路径
如果使用宝塔,可以在“网站→设置→配置文件”中直接加入上面的 limit_req 指令,或在“安全”页面手动拉黑 IP。
宝塔的 Nginx 防火墙插件也提供 CC 防护开关,可按提示设置周期和频率。
避坑:别把正常用户和搜索引擎误封
封禁和限流时,有几个容易踩的坑:
- 不要直接封整个 C 段。 很多正常用户和 CDN 节点可能在同一段,封 /24 会误伤。
- 先观察再永久封禁。 建议先用
reject临时封 1 小时,确认没有影响业务后再写入永久规则。 - 限流阈值不要设太低。 正常用户打开一个网页可能并发加载图片、CSS、JS,
rate设成 1r/s 会误伤,建议从 10r/s 或 20r/s 开始测试。 - 检查是否有 CDN。 如果网站套了 CDN,Nginx 日志里看到的 IP 可能是 CDN 回源 IP,直接封禁会影响所有用户。此时应查看
X-Forwarded-For头,并在 Nginx 中配置real_ip模块。 - 保留日志。 封禁前把异常 IP 和请求样本保存到单独文件,方便后续分析或向服务商反馈。
处理完怎么验证有没有生效
执行封禁和限流后,按下面几步复查:
- 再次运行
iftop -P -n,观察总带宽是否回落到正常水平。 - 用
awk统计日志,确认高频 IP 的请求数明显下降或消失。 - 从外部网络访问网站,测试打开速度是否恢复。
- 查看 Nginx 错误日志
tail -f /www/wwwlogs/你的域名.error.log,确认没有大量 429 或 403 影响正常访问。
如果带宽仍然跑满,但日志里没有明显高频 IP,需要检查服务器是否被入侵、是否在对外发起攻击,或是否有其他服务占用带宽,可用 netstat -ntu 查看异常外连。
常见疑问
问:iftop 显示流量大,但 Nginx 日志请求量不高,是什么原因?
可能是非 HTTP 流量,比如邮件服务、DNS 查询、被入侵后对外发包。
用 iftop -P 看端口,如果大量流量走 25、53 或非常见高位端口,优先排查服务器安全。
问:封了 IP 之后,对方换 IP 继续攻击怎么办?
单 IP 封禁只能应急。
建议同时启用 Nginx 限流,并考虑接入 CDN 或高防 IP,在边缘层过滤流量。
如果攻击持续,保留日志联系服务器商协助处理。
问:限流规则会不会影响百度、Google 抓取?
如果搜索引擎抓取频率较高,可能触发 429。
可以在 Nginx 中用 map 判断 User-Agent,对已知搜索引擎爬虫单独放行,但要注意 UA 可以伪造,必要时结合 IP 反查验证。