当你的Ubuntu服务器网络吞吐量突然飙高或者莫名其妙变慢,第一件事不是重启,而是用iftop和nethogs这两个工具快速定位到底是哪个连接、哪个进程在疯狂吃带宽。iftop看的是网络连接层面的流量,能精确到每个IP对之间的实时带宽占用;nethogs看的是进程层面,直接告诉你哪个程序在偷偷跑流量。两个工具配合使用,基本能在五分钟内锁定问题根源。

很多运维同学遇到网络异常只会用ping或者traceroute,但这些工具只能告诉你通不通、延迟多少,完全无法回答"谁在占带宽"这个核心问题。iftop和nethogs就是专门解决这个痛点的,一个从连接维度,一个从进程维度,形成完整的排查闭环。下面我把这两个工具的安装、使用、进阶技巧和实战排查流程全部讲透。

一、iftop和nethogs的核心区别与适用场景

先搞清楚这两个工具到底干什么,别混着用。iftop本质上是一个基于ncurses的交互式网络流量监控工具,它监听网卡上的数据包,按源IP和目的IP分组统计实时带宽。你看到的是类似"192.168.1.100 -> 103.28.54.1: 2.3Mbps"这样的连接级信息。nethogs则是按进程分组,它从/proc/net/tcp读取信息,把流量归因到具体的PID和程序名上,你看到的是"nginx: 15Mbps, python3: 8.7Mbps"这样的进程级数据。

什么时候用iftop?当你发现整体带宽被打满,但不知道是内网还是外网、是哪对IP在通信的时候。什么时候用nethogs?当你已经知道有异常流量,但不确定是哪个应用程序在搞鬼的时候。实际排查中,我建议先跑iftop看连接,再跑nethogs看进程,两步走完基本定位。

二、iftop的安装与基础使用

Ubuntu上安装iftop非常简单,一条命令搞定:

sudo apt update && sudo apt install iftop -y

安装完直接运行sudo iftop,它会自动监听默认网卡。如果你的服务器有多块网卡,比如eth0和ens33,需要指定网卡:

sudo iftop -i ens33

进入iftop界面后,你会看到三列数据:左边是源IP,右边是目的IP,中间是流量条和具体数值。顶部有三个流量刻度,分别是2Mbit、20Mbit、200Mbit,流量条超过哪个刻度就用哪个单位。底部是累计的TX(发送)和RX(接收)总量。

几个常用的交互按键必须记住:按P可以切换显示端口信息,按S可以切换显示源或目的地址,按D可以切换显示DNS名称(但会增加DNS查询负载,生产环境慎用),按t/T/s/S可以切换不同的流量显示模式。按q直接退出。

三、iftop进阶:过滤和输出技巧

默认的iftop会显示所有连接,信息量太大反而看不清重点。你可以用过滤参数只看特定IP或端口的流量:

sudo iftop -i ens33 -f "port 80 or port 443"

这条命令只显示80和443端口的HTTP/HTTPS流量,排查Web服务异常时特别有用。也可以按IP过滤:

sudo iftop -i ens33 -F 192.168.1.0/24

只显示192.168.1.0网段的流量。还有一个实用技巧是把iftop输出到文件,方便事后分析:

sudo iftop -i ens33 -t -s 5 > /tmp/iftop_log.txt

这里-t去掉了顶部的流量刻度,-s 5表示每5秒采样一次,输出重定向到文件。这样你可以在后台跑iftop,过一段时间再分析日志。

四、nethogs的安装与基础使用

nethogs的安装同样简单:

sudo apt update && sudo apt install nethogs -y

运行方式:

sudo nethogs ens33

nethogs启动后会显示一个进程列表,每行包含PID、用户、程序路径、发送速率、接收速率、总速率。默认刷新间隔是1秒,你可以用-d参数调整:

sudo nethogs ens33 -d 3

每3秒刷新一次,适合流量不是特别大的场景。如果你想只看某个用户的进程,可以用-u参数:

sudo nethogs ens33 -u www-data

只显示www-data用户下的进程流量,排查Web服务时很精准。nethogs还支持把输出写到文件:

sudo nethogs ens33 -t -c 3 > /tmp/nethogs_log.txt

-t表示文本模式输出,-c 3表示每3秒记录一次。

五、实战排查流程:从发现异常到定位根因

下面我用一个真实场景带你走一遍完整排查流程。假设你的Ubuntu服务器是一台Web服务器,突然监控告警显示带宽从平时的10Mbps飙到了90Mbps。

第一步,先用iftop快速扫描。运行sudo iftop -i ens33,观察哪些连接在大量传输。如果看到大量来自某个外网IP的连接,比如"103.28.54.1 -> 你的服务器IP: 85Mbps",说明是外部流量打进来了,可能是被攻击或者有异常下载。如果看到大量内网IP之间的通信,比如"192.168.1.50 -> 你的服务器IP: 70Mbps",那问题在内网,可能是备份任务、同步任务或者某台机器中了挖矿木马。

第二步,用nethogs定位进程。运行sudo nethogs ens33,看哪个进程在吃带宽。如果发现是某个不认识的进程,比如/tmp/.xmrig或者一个随机名的二进制文件,基本可以判定是挖矿程序。如果是nginx或mysqld在大量发送数据,那可能是正常业务但需要优化,也可能是数据库被拖库。

第三步,结合进程PID进一步追查。在nethogs中记下可疑进程的PID,然后用以下命令查看进程详情:

ps aux | grep <PID>
ls -la /proc/<PID>/exe
cat /proc/<PID>/cmdline | tr '\0' ' '

这些命令能告诉你这个进程的完整路径、启动命令和运行用户。如果路径在/tmp或者/var/tmp下,基本是恶意程序无疑。如果是正常程序但流量异常,就需要检查程序本身的配置和日志。

六、常见异常场景与解决方案

场景一:某个进程持续占用大量带宽但你不知道为什么。先用nethogs确认进程名,然后用lsof查看这个进程打开了哪些网络连接:

sudo lsof -i -P -n | grep <PID>

这能看到进程具体连接了哪些远程IP和端口,结合iftop的信息交叉验证。

场景二:带宽被打满但iftop和nethogs都看不到明显的大流量连接。这种情况通常是大量小连接累积的结果,比如SYN flood攻击或者大量短连接的爬虫。这时候需要用ss或netstat看连接数:

ss -s
netstat -an | awk '{print $6}' | sort | uniq -c | sort -rn

如果TIME_WAIT或ESTABLISHED连接数异常高,就需要从防火墙层面做限流了。

场景三:内网机器之间带宽异常。用iftop过滤内网段,找到流量大的那对IP,然后登录到源机器上用同样的方法排查。很多时候是rsync备份、日志同步或者监控agent在后台跑大量数据。

七、长期监控与自动化建议

iftop和nethogs都是交互式工具,适合临时排查。如果需要长期监控,建议配合其他工具。比如用vnstat做历史流量统计,用sar做系统级资源监控,用iftop的-t模式配合cron定时采集数据:

0 */2 * * * root /usr/sbin/iftop -i ens33 -t -s 10 -c 6 > /var/log/iftop_$(date +\%Y\%m\%d_\%H).log 2>&1

这条cron每两小时跑一次iftop,采样10秒,记录6次,日志按日期命名。虽然不能完全替代专业监控系统,但对于中小规模服务器来说足够用了。

另外一个建议是把nethogs也加入定时任务,特别是在你怀疑有挖矿或者异常程序的时候。两个工具的日志交叉对比,能帮你建立流量基线,一旦出现偏离就能快速告警。

八、总结与排查口诀

最后给你一个排查口诀,遇到网络吞吐量异常直接按这个顺序来:先iftop看连接,再nethogs看进程,然后lsof查详情,最后ss看连接数。四步走完,90%的带宽异常都能定位。iftop和nethogs这两个工具虽然看起来简单,但在实际运维中是真正的排查利器,比那些花里胡哨的图形化监控工具来得更直接、更快速。记住,运维排查的核心不是工具多高级,而是你能不能在最短时间内找到问题在哪。