iftop命令溯源带宽跑满异常爬虫流量
当服务器带宽被爬虫流量跑满时,网页打开变慢、SSH操作卡顿,很多人以为只能花钱升级带宽。
其实大部分情况是某个或某批IP发起了异常密集的请求。iftop 命令能实时显示每个IP连接占用的带宽,帮你快速定位是谁在消耗流量。
本文按零基础可操作的方式,讲清从安装、查看到封禁的完整流程。
排查前先确认系统环境
执行 iftop 需要 root 权限,系统建议为 CentOS、Ubuntu、Debian 等主流 Linux 发行版。
如果用的是宝塔面板,可以直接在“软件商店”搜索“iftop”安装;
也可以手动安装:
# CentOS / 宝塔
yum install -y iftop
# Ubuntu / Debian
apt install -y iftop
安装完成后,先确认当前带宽是否真的被占满。
可以查看服务器厂商控制台的带宽监控图,也可以直接在服务器上执行:
iftop -n -P
看到流量监控界面后,按 n 显示IP地址,按 P 显示端口,按 t 切换累计流量显示。
右侧的条形图越长,表示该连接占用的带宽越高。
从流量界面锁定可疑IP
进入 iftop 界面后,观察前几行的IP地址和速度。
如果一个IP单独占用了大量带宽,且并发连接数量很多,通常就是异常来源。
按 s 可以按源IP排序,按 d 按目标IP排序,方便快速找出连接数最夸张的地址。
锁定IP后,先别急着封禁,建议结合Web日志确认它是否在抓取页面。
以Nginx为例,查看最近请求:
tail -n 100 /var/log/nginx/access.log | grep 203.0.113.10
如果日志里同一个IP在短时间内反复请求大量URL,且请求间隔很短,基本可以判定为异常爬虫。
也可以用下面的命令统计访问频率最高的前10个IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
这里得到的IP列表与 iftop 界面对照,重合项就是流量消耗的重点嫌疑对象。
区分正常爬虫与异常爬虫
不要看到爬虫就封禁。
百度、Google、必应等搜索引擎的官方爬虫是网站收录的重要来源,误封会导致关键词排名下降。
判断方法:通过IP反查域名,确认是否为知名搜索引擎的爬虫;
或者检查User-Agent是否包含明显的蜘蛛标识。
异常爬虫通常有这些特征:
- 单个IP并发连接数极高,远超正常浏览器行为
- 请求路径杂乱,频繁访问后台路径或静态资源
- 一段时间内重复抓取相同内容
- 服务器CPU和负载同步升高,不只是带宽跑满
如果确认是搜索引擎官方爬虫,不需要封禁,可以适当优化 robots.txt 限制抓取频率;
如果是陌生IP或海外代理池,则需要处理。
封禁异常IP并防止再次出现
对确认的恶意爬虫IP,可以用 iptables 临时封禁:
iptables -A INPUT -s 203.0.113.10 -j DROP
如果使用宝塔面板,也可以到“安全”菜单中填写IP进行屏蔽,效果相同。
临时封锁观察一段时间,若该IP再次出现,说明可能是代理池换IP,这时单靠封IP不够,还需要在Web层做访问频率限制。
对于使用Nginx的站点,可以在站点配置中加入限流:
limit_req_zone $binary_remote_addr zone=spider:10m rate=10r/s;
然后在 server 块中引用该规则。
这样可以避免单个IP无限请求,即便对方不断更换IP,也能从频率层面控制流量消耗。
避坑与验证
不要只依赖iftop判断进程。 iftop 只能显示IP和连接,无法显示是哪个进程发起的连接。
如果需要定位到具体进程,需要搭配 ss -tnp 或 lsof -i 查看端口对应的PID。
封禁前务必跳过自家监控IP和CDN回源IP。 很多服务器前面有CDN,来源IP会变成CDN节点地址,直接封禁CDN会导致整站无法访问。
建议先将CDN节点IP加入白名单,再封禁其他异常来源。
完成封禁后,重新打开 iftop,观察对应IP是否不再出现,带宽条形图是否明显下降。
同时到服务器厂商控制台对比实时带宽曲线,确认流量回落到正常水平。
如果带宽依然跑满,则可能是其他原因,比如DDoS攻击或内部程序外发流量,需要继续用抓包工具排查。
如果你正在处理iftop命令溯源带宽跑满异常爬虫流量,建议先按上述步骤完整走一遍,确认来源后再动手封禁。
多数情况下,异常流量都能在几分钟内定位并解决,不需要升级带宽,也不需要重启服务器。