问题从哪儿开始
半夜收到告警,服务器带宽跑满,网站卡得打不开。这种情况不少见,尤其是业务量上来之后。别急着重启服务,先搞清楚是谁在“偷跑”流量。
用基础命令摸清当前情况
登录服务器第一件事,看看实时带宽占用情况。iftop 是个好工具,能直观显示当前网络连接的流量分布。
sudo iftop -i eth0
运行后你会看到类似任务管理器的界面,左边是源IP,右边是目标IP,中间的箭头粗细代表流量大小。一眼就能看出哪个连接最“肥”。
结合 netstat 查进程关联
光知道IP不够,得找到对应的进程。比如发现某个外部IP持续下载大量数据,可以用下面命令查是谁在通信:
sudo netstat -anp | grep :80
重点关注 ESTABLISHED 状态的连接,结合 PID 列反查进程名。如果看到某个 PHP 脚本或 Python 服务占着大连接,基本就有线索了。
用 nethogs 按进程看带宽
比 iftop 更进一步的是 nethogs,它直接按进程分组显示带宽使用,谁在传数据一目了然。
sudo nethogs eth0
打开后你会看到每行一个进程,有PID、用户、上传下载速度。某个备份脚本偷偷上传文件?或者爬虫被滥用?这里藏不住。
检查日志里的异常请求模式
Web 服务的话,Nginx 或 Apache 的访问日志是重要线索。突然某个接口被高频调用,可能就是带宽飙升的原因。
比如查 Nginx 日志里访问最多的URL:
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
如果发现 /download.php 出现在榜首,而且请求数是平时几十倍,那就要进去看看是不是被当成免费CDN用了。
数据库导出也能成罪魁祸首
有一次我们发现内网带宽被打满,排查发现是开发在后台执行了一个全表导出,几百万条记录打包成CSV通过网页下载。表面看是“正常操作”,实际相当于开了个临时P2P。
这种场景建议加限速,或者改走命令行+压缩+分段传输。
防火墙临时拦截做验证
怀疑某个IP或端口有问题,可以临时封掉试试效果。比如用 iptables 拦截某个外联地址:
sudo iptables -A OUTPUT -d 198.51.100.1 -j DROP
观察带宽是否回落。如果明显下降,基本就能锁定目标。记得测试完删规则:
sudo iptables -D OUTPUT -d 198.51.100.1 -j DROP
定时任务也可能背锅
别忘了 crontab。有些脚本每天凌晨同步数据,如果没加限速,很容易把带宽冲上去。查一下有没有 rsync、wget、curl 类的任务在悄悄运行。
crontab -l
顺便看看 /etc/crontab 和 /etc/cron.d/ 下的配置文件,有时候运维加的备份任务自己都忘了。