VPS 流量被刷爆?带宽飙升 Emergency 排查:nload / iftop / nethogs 三板斧抓元凶

月度流量几小时被刷爆、SSH 卡死?本文用 nload 看整体网速、iftop 看是哪个外部 IP 在狂传、nethogs 按进程(PID)直接锁定元凶容器,并给出 iptables 封 IP、docker stop 止损与 vnstat 监控告警。

凌晨三点,你被一条告警吵醒:这个月 VPS 的流量额度,几个小时就被吃光了;或者更糟,SSH 卡得连命令都敲不进去。打开服务商后台一看,入站/出站带宽曲线像坐了火箭。这时候最忌讳的就是慌——先别急着重启,按下面这套"三板斧"顺藤摸瓜,通常十分钟内就能把元凶揪出来。

本文面向买国外 VPS 的中国玩家,所有命令基于 Debian/Ubuntu(CentOS 把 apt 换成 yum/dnf 即可),新手照抄就能用。

延伸阅读

更多相关攻略推荐:Ollama AI系列(2):VPS上的AI推理与API应用Ollama AI系列(2):VPS上的AI推理与API应用【CPU选型 01】搭载 AMD Ryzen 9950X 的 VPSARM / Ampere 席卷 VPS:性价比真香还是兼容陷阱?Ollama AI系列(2):VPS上的AI推理与API应用

一、第一板斧:nload 看整体——到底是不是真被跑满了

先别急着找"谁",先确认"是不是真的满了"。有时候你以为被攻击,其实只是备份任务在跑。nload 是最直观的整体网速仪表,它把每个网卡的入站(Incoming)和出站(Outgoing)实时画成曲线,一眼就能看出有没有被打满。

安装与运行:

sudo apt update
sudo apt install -y nload
nload            # 直接看所有网卡
nload eth0       # 只看公网网卡(网卡名用 ip a 查)

界面里 Curr 是当前速率,Avg 是平均,Min/Max 是最值,右边还有峰值线。判断标准很简单:如果你的套餐是 1Gbps(约 125 MB/s),而 nload 显示持续跑在 120 MB/s 以上,那基本就是被跑满了;如果只占很小一部分,那问题可能不在带宽,而在 CPU、磁盘 IO 或线路质量(跨境丢包)。注意看是入站高还是出站高:出站(Outgoing)异常高,多半是你的机器在对外疯狂发包,常见于被植入挖矿/僵尸程序;入站高则可能是被人刷下载或 CC 攻击。

如果你想要更"极客"的总览,同类的还有 bmonbwm-ng,原理都差不多,nload 最省事。

二、第二板斧:iftop 看连接——是哪个外部 IP 在狂传

确认被跑满后,下一步是看"和谁在传"。iftop 基于 libpcap 抓包,按每条连接显示实时带宽,能直接列出此刻占用最高的对端 IP 和端口。它比 nload 更近一步,告诉你"流量去哪儿了"。

安装与常用参数:

sudo apt install -y iftop
sudo iftop -i eth0 -n -N -P

参数含义:-i 指定网卡;-n 不解析域名(更快、更准);-N 不把端口转成服务名;-P 显示端口号。运行后,中间那列箭头表示流量方向(<=> 双向、=> 出站、<= 入站),右边三列是 2 秒/10 秒/40 秒的平均速率。

几个实用操作:

  • t 切换显示模式(按主机 / 按端口 / 按连接);
  • n 切换是否解析域名;
  • p 暂停,方便你截图记录可疑 IP;
  • sd 可以只显示源或目的,过滤掉噪音。

iftop 的局限在于:它只能看到 IP 和连接,看不到进程名。所以如果你的 VPS 上只跑了一个 Nginx,那它能直接定位;但如果你跑了一堆 Docker 容器,它分不清到底是哪个容器。这时就需要第三板斧。

三、第三板斧:nethogs 按进程——直接锁定元凶 PID

nethogs 是整个排查里最"杀手锏"的工具,因为它直接按 Linux 进程(PID)显示带宽占用,哪个程序在吃流量,一眼看穿。配合 Docker 命令,你还能直接定位到是哪一个容器。

sudo apt install -y nethogs
sudo nethogs eth0     # 指定网卡;不加参数会监听所有接口

界面最左边是 PID 和进程名(比如 1234/nginx2066/dockerd),右边是收/发速率和总计。占用最高的永远排在最上面。常见场景:

  • 看到某个 /usr/bin/.systemd-xxxx 之类的怪名字狂发流量,基本就是被植入的恶意程序;
  • 看到 PID 属于 dockerd 或某个 containerd-shim,说明流量来自容器,记下这个 PID;
  • 看到 python3 / java 之类业务进程异常高,可能是代码里有死循环请求或被人刷接口。

如果流量来自 Docker 容器,怎么把 PID 映射到容器?两步:

# 1) 用 PID 查它属于哪个容器(返回容器 ID)
sudo docker top <PID>     # 若 PID 是容器内的进程,可反查;更常用下面这条
# 2) 列出所有容器及其 PID 映射
docker ps -q | xargs -I {} docker inspect -f '{{.State.Pid}} {{.Name}}' {}
# 或更直接:看哪个容器在跑
docker stats --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.NetIO}}"

顺带一提,Docker 给每个容器在宿主机上都有一个真实的 shim 进程(State.Pid),nethogs 抓到的往往就是这个;结合 docker statsNetIO 列,基本能锁定"就是它"。

四、辅助定位:ss / lsof 把端口钉到进程

有时候 iftop 发现一个陌生端口在狂传,你想知道是谁在监听它,可以用 ss:

sudo ss -tnap | grep ':5432'      # 看哪个进程占了 5432
sudo lsof -i :5432                # 等价方式,部分系统需另装

如果怀疑是更底层的扫描或异常握手,tcpdump 能抓包存证(注意输出可能很大,生产机慎用):

sudo tcpdump -i eth0 -w capture.pcap   # 抓下来用 Wireshark 慢慢分析

五、发现异常,立刻止损

找到元凶后,分秒必争。按"先止血、再溯源"的原则处理。

5.1 临时封禁恶意 IP(iptables)

如果是来自某个固定 IP 的刷流量/攻击,直接 DROP 它,立竿见影:

sudo iptables -A INPUT -s 1.2.3.4 -j DROP
sudo iptables -A INPUT -s 1.2.3.0/24 -j DROP   # 封整个段

要让它重启后还在,同样用 iptables-persistent 保存,或写进 after.rules。也别忘了 UFW 本身就能做:sudo ufw deny from 1.2.3.4。如果攻击来自 UDP 放大类(比如被当成反射源),还要在出方向也限制,并联系服务商临时清洗。

5.2 干掉异常进程 / 容器

如果是本机进程在作妖,先杀进程:

kill -9 <PID>            # 普通进程
docker stop <容器名>      # 容器
docker rm -f <容器名>     # 连容器一起删

但注意:杀进程只是止血,不查根因会反复复发。杀完一定要去翻日志(docker logs <容器>journalctl -u docker/var/log/),找出它是怎么进来的——弱口令?暴露的端口?有漏洞的镜像?把口子补上才算完。

5.3 事后监控与告警(vnstat)

流量被刷爆往往发现得太晚,所以平时要装个"电表"。vnstat 是个轻量守护进程,持续记录历史流量,能生成日/月报表,几乎不占资源。

sudo apt install -y vnstat
sudo systemctl enable --now vnstat
vnstat            # 看总览
vnstat -d         # 按天
vnstat -m         # 按月
vnstat -l -i eth0 # 实时监视

配合一个简单的阈值告警脚本(比如用 cron 每分钟跑一次,当本月已用超过 80% 就发邮件/Telegram),就能把"事后救火"变成"事前预警"。很多国外 VPS 是按流量计费或超量即扣款,这套监控能帮你省钱又保命。

#VPS #带宽 #流量 #iftop #nethogs #nload #vnstat #排查 #安全