Linux服务器如何监控网络流量?常用命令与实时分析工具介绍

网站突然变慢,CPU 和内存都正常,磁盘也没问题——这时候最该看的是网络。带宽被跑满、某个进程在偷偷对外发包、被 CC 攻击、网卡出现丢包或错包,这些都会表现为"服务慢"而不是"服务挂"。Linux 下监控网络流量的工具分三层:看总量的(sar、vnstat、/proc/net/dev)、看实时速率的(iftop、nload、bmon)、看进程与连接归属的(nethogs、ss、tcpdump)。本文按这三层组织,给出每个工具的准确用法、输出解读和选型建议,并附一套带宽打满时的标准排查流程。

一、基础层:从内核计数器读总量

内核在 /proc/net/dev 里维护了每个网卡的收发统计,这是所有流量工具的数据源头。直接读它能获得最原始、无依赖的数据。

# 查看各网卡累计收发字节、包数、错误数
cat /proc/net/dev

# 更易读的形式(需要 iproute2)
ip -s link
ip -s -h link show eth0

# 传统方式
netstat -i
ifconfig eth0

ip -s link 的输出里,每个网卡下面有两段统计:RX(接收)与 TX(发送),字段包括 bytes(累计字节)、packets(包数)、errors(错误包)、dropped(丢弃包)、overrun(溢出)、multicast。判断标准:dropped 或 errors 持续增长就是异常,常见于网卡 ring buffer 不足、驱动问题或交换机端口协商异常;偶发的少量 dropped 可以忽略,但每分钟涨几十个就要处理。

1.1 sar:带历史数据的主力工具

sar 属于 sysstat 软件包,它既能看实时,也能看历史(数据由 sadc 每 10 分钟采集一次,保存在 /var/log/sa/)。这是事后复盘"昨天下午三点流量什么样"的唯一手段。

# 安装与启用
yum install -y sysstat      # 或 apt install -y sysstat
systemctl enable --now sysstat

# 实时采样:每秒 1 次,共 5 次,看各网卡流量
sar -n DEV 1 5

# 只看某个网卡
sar -n DEV 1 5 | grep eth0

# 看历史(sa18 表示 18 号的数据)
sar -n DEV -f /var/log/sa/sa18
sar -n DEV -f /var/log/sa/sa18 -s 14:00:00 -e 16:00:00

# 看 TCP 连接与重传
sar -n TCP,ETCP 1 5

# 看错误包
sar -n EDEV 1 5

怎么读 sar -n DEV 的输出:关键三列是 rxkB/s(每秒接收 KB)、txkB/s(每秒发送 KB)、%ifutil(带宽利用率)。判断标准:%ifutil 持续超过 70% 说明带宽接近饱和,需要考虑扩容或限流;把 rxkB/s 乘以 8 再除以 1000 可以粗略换算成 Mbps(1 MB/s ≈ 8 Mbps),例如 rxkB/s 为 12500 约等于 100 Mbps。

1.2 vnstat:轻量长期统计

vnstat 后台常驻,按小时/天/月累计流量,占用极低,适合长期观察月度流量与判断是否超套餐。

# 安装并启动
yum install -y vnstat
systemctl enable --now vnstat

# 查看日报、月报
vnstat
vnstat -d        # 日
vnstat -m        # 月
vnstat -h        # 按小时

# 实时模式
vnstat -l -i eth0

# 指定网卡
vnstat -i eth0

二、实时层:看当前速率和流向

2.1 iftop:看"谁在跟谁通信"

iftop 是排查带宽问题的第一工具,它按连接(IP 对)展示实时速率,能直接看出是哪一个远端 IP 在吃带宽。

# 安装
yum install -y iftop      # 需 EPEL 源
apt install -y iftop

# 基本用法
iftop -i eth0

# 不解析主机名、以端口显示(强烈推荐,避免 DNS 拖慢)
iftop -n -i eth0
iftop -nNP -i eth0

# 只显示某个网段的流量
iftop -n -F 10.0.0.0/24 -i eth0

# 以字节而非比特显示
iftop -B -i eth0

界面解读:顶部刻度条显示当前速率峰值;中间三列分别是 最近 2 秒、10 秒、40 秒的平均速率,两侧箭头指示方向(=> 为发送,<= 为接收);底部三行累计值是 TX 累计、RX 累计、总计,以及对应的 2s/10s/40s 峰值速率。常用交互键:P 切换显示端口、T 切换显示累计流量、s/d 切换只显示源/目的、L 打开刻度对数、q 退出。

判断方法:如果某一个远端 IP 长期占据 top 且速率接近带宽上限,基本可以锁定流量来源;如果大量不同 IP 且每个速率都不高,但总量很高,多半是扫描或 CC 攻击。

2.2 nload:只看总速率曲线

当你只想快速知道"现在上/下行各跑了多少"时,nload 最直观,它画实时曲线。

nload eth0
nload -m -u M eth0       # -m 只显示一个设备,-u M 以 MB/s 为单位
nload -t 1000 eth0       # 刷新间隔 1000ms

输出分为 Incoming(入)与 Outgoing(出)两块,各含当前值(Curr)、平均值(Avg)、最小值(Min)、最大值(Max)与总传输量(Ttl)。判断标准:把 Curr 与购买的带宽上限对比,例如 5Mbps 带宽对应约 600KB/s,如果 Curr 长期顶在这个值附近,说明带宽已打满。

2.3 其他实时工具速览

# bmon:图形化展示各网卡,支持多网卡
bmon -p eth0

# dstat:同时看 CPU/磁盘/网络/内存
dstat -n -N eth0 1
dstat -tnf 1              # 时间+网络+系统统计

# nmon:综合性能工具,按 n 看网络
nmon

# iptraf-ng:菜单式,可看按端口/按协议的细分统计
iptraf-ng

# tcptrack:按 TCP 连接展示速率
tcptrack -i eth0

三、归属层:找出是哪个进程在跑流量

iftop 只能看到 IP 和端口,要知道"哪个进程",需要下面这些工具。

3.1 nethogs:按进程统计流量

# 安装
yum install -y nethogs    # 需 EPEL
apt install -y nethogs

# 查看按进程的实时流量
nethogs eth0

# 指定刷新间隔(秒)
nethogs -d 5 eth0

# 只看 TCP/UDP 某一种
nethogs -t eth0           # tracemode,适合脚本采集

输出列依次为 PID、用户、程序名、网卡、发送速率、接收速率。nethogs 是"挖矿木马排查"的利器:如果看到一个陌生进程持续占用几 Mbps 的上行流量,基本可以确定异常。注意它需要 root 权限,且在某些容器/虚拟化环境下可能无法准确映射进程。

3.2 用 ss 定位连接与进程

# 查看已建立连接及其进程,按远端 IP 统计
ss -antp | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head

# 统计本机各端口的连接数
ss -ant | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn | head

# 找出连接数最多的远端 IP(疑似攻击源)
ss -ant | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10

# 按进程维度统计连接数
ss -antp | grep -oP 'users:\(\("\K[^"]+' | sort | uniq -c | sort -rn

判断标准:单个 IP 建立数百上千条 ESTABLISHED 连接,是典型的 CC 攻击或异常客户端特征;正常浏览器一般不会超过几十条。

3.3 tcpdump:抓包看细节

# 抓取 eth0 上 80 端口的包,只抓 1000 个后停止
tcpdump -i eth0 -nn -c 1000 tcp port 80

# 抓取某主机的包
tcpdump -i eth0 -nn host 10.0.0.20

# 抓取并保存供 Wireshark 分析
tcpdump -i eth0 -nn -s 0 -w /tmp/capture.pcap host 10.0.0.20 and port 443

# 只抓 SYN 包,看连接建立情况
tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0'

# 统计每秒包数(判断 PPS 攻击)
tcpdump -i eth0 -nn | awk '{print $1}' | uniq -c

参数说明:-nn 不解析主机名与端口名(必须加,否则慢且不利于分析);-c 限制抓包数量;-s 0 抓取完整包长;-w 写入文件。抓包会产生额外 I/O 与 CPU 开销,生产环境务必加 -c 限制数量,避免把本来紧张的机器压垮。

四、工具选型对比

工具维度是否有历史安装需求最适合场景
ip -s link网卡累计与错误否系统自带快速看丢包/错包
sar -n DEV网卡速率与利用率是sysstat事后复盘历史流量
vnstat小时/日/月累计是vnstat月度流量与套餐核对
iftop按 IP 连接的实时速率否iftop(EPEL)带宽被谁吃了
nload总上下行曲线否nload一眼看当前跑多少
nethogs按进程的流量否nethogs(EPEL)定位异常进程/挖矿
ss / netstat连接与进程归属否iproute2 / net-tools看连接数、找攻击源
tcpdump数据包内容否(可存 pcap)tcpdump协议级深度分析
Zabbix/Prometheus长期趋势与告警是需部署常态化监控与阈值告警

五、带宽打满时的排查步骤清单

  1. 确认是否真的打满:sar -n DEV 1 5 看 %ifutil 与 rxkB/s、txkB/s,换算成 Mbps 与购买带宽对比;同时 nload 看实时曲线。
  2. 看是入还是出:入向打满常见于下载服务、镜像同步、被刷流量;出向打满常见于对外提供大文件、CDN 回源、数据泄露或挖矿外联。
  3. 锁定流向:iftop -nNP -i 网卡,看 top 连接的远端 IP 与端口。
  4. 锁定进程:nethogs 网卡 找到 PID,再 ps -fp PID 确认是什么程序、跑在哪个目录。
  5. 统计连接来源:ss -ant | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head,识别异常 IP。
  6. 判断是否攻击:单一 IP 连接数异常高、SYN 大量未建连、User-Agent 高度一致 → 考虑 iptables/防火墙限流或接入高防;正常业务增长 → 考虑扩容带宽或做缓存/CDN。
  7. 检查异常外联:若出向流量集中在陌生远端端口(如 3333、8080 等非业务端口),应立即隔离排查木马,检查 crontab、/tmp 与 systemd 服务。
  8. 应急处理:临时用 iptables 或 wondershaper/tc 限速,保证核心业务可用;事后用 ss -antp 与审计日志复盘。
  9. 建立常态监控:把网卡流量、错包数、连接数纳入 Zabbix/Prometheus,设置带宽 70% 预警、90% 严重告警。

六、单位换算与判断阈值速查

指标换算/阈值说明
字节与比特1 MB/s = 8 Mbpssar 输出的是 kB/s,乘 8 除以 1000 得 Mbps
带宽利用率%ifutil > 70% 需关注,> 90% 紧急sar -n DEV 的最后一列
丢包dropped 持续增长即异常ip -s link 或 sar -n EDEV
单 IP 连接数超过数百条高度可疑ss 统计 ESTABLISHED
PPS小包攻击看每秒包数而非带宽sar -n DEV 的 rxpck/s、txpck/s
TIME_WAIT超过数万需关注ss -ant 统计,短连接服务常见

小结

网络流量监控的思路是从粗到细逐层收敛:先用 sar/nload 确认"总量是否异常以及是入还是出",再用 iftop 锁定"跟哪些 IP 通信",再用 nethogs/ss 定位"是哪个进程、哪些连接",最后必要时用 tcpdump 做协议级取证。日常建议:sysstat 必须装并开启(否则事后无法复盘)、iftop 和 nethogs 预装到运维镜像里(出事时才不用现装)、把带宽利用率与错包数接入监控告警。有了这三层工具链,"服务突然变慢"这类模糊问题就能被快速定位到具体的 IP 和进程。

避坑清单

  • iftop 不加 -n 会因 DNS 反查变慢,始终使用 iftop -nNP。
  • tcpdump 在生产环境必须加 -c 限制,无限制抓包可能写满磁盘或加剧负载。
  • 容器内看到的流量统计可能不准,网络命名空间隔离会导致部分工具失效,需在宿主机或网络命名空间内执行。
  • sar 没历史数据通常是 sysstat 采集没启用,光装包不够,要 systemctl enable --now sysstat。
  • 不要把 kB/s 当成 kb/s,大小写 B 含义不同,差 8 倍,这是容量评估出错的常见原因。
  • 网卡名不一定是 eth0,新发行版可能是 ens33、enp0s3 等,先用 ip link 确认。
  • nethogs 需要 root 权限,且在部分内核/容器组合下无法正确映射进程,此时改用 ss -antp 辅助判断。
  • 限速类操作(tc)误配会直接断网,务必提前准备恢复命令并保留带外管理通道。