nethogs按进程实时显示流量,直接定位发包进程;iftop按ip和端口显示通信对象,适合判断异常连接;二者统计口径不同,需配合使用而非互斥。

怎么一眼看出哪个进程在疯狂发包
直接上 nethogs,它专治“不知道谁在偷跑流量”。别的工具按协议或IP分,它按进程分——你看到的每一行就是一个 PID 在实时吞吐,不用再从端口反推服务、从服务查进程。
常见错误现象:用 iftop 看到某个 IP 流量爆了,但查 netstat -tulnp 却发现端口没进程监听;其实是容器、沙箱或短生命周期进程(比如 curl 脚本)干的,nethogs 能当场捕获它们。
- Ubuntu/Debian:运行
sudo apt install nethogs,然后sudo nethogs - RHEL/CentOS/AlmaLinux:先
sudo yum install epel-release,再sudo yum install nethogs - 默认监控
eth0,想换网卡就加参数,比如sudo nethogs ens33 - 交互时按
r按接收排序,s按发送排序,q退出 —— 别等它自动刷新,手动冻结排序(o)才能盯住可疑进程
怎么快速定位是哪个外部IP在猛连我
iftop 是这个问题的秒解。它不关心进程是谁,只告诉你“此刻谁和我在通信、流速多大”,特别适合应急判断是否被扫描、被拖库、或 CDN 回源异常。
使用场景:Web 服务器突发高带宽,nethogs 显示 nginx 占得多,但你不确定是正常用户还是恶意爬虫 —— 这时候切到 iftop,一眼看到 100+ 连接来自同一个 /24 段,基本可以判定。
- 安装:
sudo apt install iftop(Debian系)或sudo yum install iftop(RHEL系) - 启动后默认按 10 秒平均流量排序,按
1/2/3可切换看 2s/10s/40s 流量 - 按
N关闭端口转服务名(避免把 80 显示成 http,干扰判断),按P显示端口号,按f输入host 192.168.1.100过滤特定目标 - 注意:如果网卡是 bond 或 veth(如 Docker 容器),
iftop -i docker0才能抓到容器间流量,别只盯着eth0
为什么 nethogs 显示的总流量和 iftop 对不上
不是 bug,是视角不同导致的统计口径差异。简单说:nethogs 统计的是**进程发起的 TCP/UDP 报文净荷**(payload),而 iftop 统计的是**网卡驱动收到/发出的原始帧**(含 TCP 头、IP 头、以太网头、重传包)。
典型偏差场景:
- 大量小包(如 DNS 查询):
iftop会把每个 60 字节的请求+响应都算进去,nethogs可能归到systemd-resolved但数值偏小 - 启用 TCP Segmentation Offload(TSO)的网卡:硬件把大包拆成小帧发出去,
iftop看到的是拆后的帧流速,nethogs仍按应用层发包量统计 - 容器网络:宿主机上
nethogs看不到容器内进程(除非用--net=host),但iftop -i cni0能看到所有进出容器的流量
所以别纠结“哪个准”,该用 nethogs 查责任人,该用 iftop 查通信对象,两者互补,不是替代。
装完跑不起来?常见权限和依赖坑
nethogs 和 iftop 都需要抓包能力,本质是读取 /dev/net/pf_packet 或调用 libpcap,普通用户没权限 —— 这是最常卡住的地方。
- 报错
Unable to get pid of the process或socket: Operation not permitted:一定是没加sudo,别信“文档说可普通用户运行”,那是旧版本或特殊编译配置 - CentOS 8+/AlmaLinux 9 启用
nf_tables后,iftop可能无法解析连接状态:临时切回iptables(sudo update-alternatives --config iptables),或升级到 iftop 1.1.0+ - Alibaba Cloud Linux 默认禁用 promiscuous 模式:
nethogs -p会失败,去掉-p即可;iftop -p同理 - Docker 容器里装不了?别试了。容器默认没
CAP_NET_RAW权限,且网络命名空间隔离,必须在宿主机运行
真要容器内监控,改用 ss -i + cat /proc/net/snmp 粗略估算,或者挂载宿主机 /proc 和 /sys 后跑 nethogs —— 但这就超出“实时排查”范畴了。










