1. 为什么你需要监控Ubuntu的网络流量?
不知道你有没有遇到过这种情况:明明没在下载大文件,也没看高清视频,但家里的网络突然就变得很慢,甚至卡顿。或者,你管理的服务器每个月流量费用莫名超标,却找不到“元凶”。如果你用的是Ubuntu系统,无论是桌面版还是服务器版,学会监控网络流量绝对是一项能让你省心又省钱的技能。
我自己就吃过亏。几年前我跑一个个人项目,租了一台最便宜的云服务器,结果月底账单出来,流量费比月租还贵!当时完全懵了,根本不知道流量花在哪了。后来才知道,是项目里一个日志上报功能写错了,一直在疯狂发送数据。从那以后,我就养成了定期检查服务器流量的习惯。
在Ubuntu上,监控流量主要有两个方向:实时监控和历史统计。实时监控就像看直播,能立刻看到哪个程序正在“偷跑”流量;历史统计则像看账单,帮你分析过去一段时间(比如昨天、上周、上个月)的流量消耗趋势。今天要介绍的两个神器——nethogs和vnstat,正好完美覆盖了这两个需求。nethogs帮你抓“现行犯”,vnstat帮你做“数据分析”。对于开发者、运维同学,甚至是好奇的极客用户,掌握它们都能让你对系统的网络行为了如指掌。
2. 实时流量侦探:nethogs深度使用指南
当你感觉网络变慢,第一反应肯定是:“哪个程序在占网速?”这时候,系统自带的netstat、iftop虽然也能看连接,但不够直观。而nethogs的强大之处在于,它能直接按进程(Process) 来显示实时流量,界面简单粗暴,一眼就能锁定目标。
2.1 安装与快速上手
在Ubuntu上安装nethogs非常简单,因为它就在官方软件源里。打开终端,输入以下命令:
sudo apt update
sudo apt install nethogs
安装完成后,最基本的用法就是直接以root权限运行:
sudo nethogs
你会看到一个不断刷新的界面,大概长这样:
PID USER PROGRAM DEV SENT RECEIVED
1234 alice firefox wlp3s0 12.123 5.456 KB/sec
5678 bob /usr/lib/chromium wlp3s0 0.000 1.234 KB/sec
... ... ... ... ... ...
这个界面里,SENT和RECEIVED就是该进程每秒发送和接收的数据量,单位默认是KB/sec。流量大的进程自然会排在上面。想退出?按 q 键就行。
2.2 进阶技巧与实用参数
只会用sudo nethogs可不够,下面这几个参数能帮你应对更复杂的场景:
-
指定监控的网络接口:如果你的电脑有有线网卡(比如
eth0)和无线网卡(比如wlan0),你可以只监控其中一个。sudo nethogs eth0 # 只监控有线网络 sudo nethogs wlp3s0 # 只监控无线网络(接口名可能不同)怎么知道自己的接口名?用
ip addr或ifconfig命令查看。 -
调整刷新频率:默认每秒刷新一次,如果你觉得太快或太慢,可以用
-d参数指定刷新间隔(单位秒)。sudo nethogs -d 5 # 每5秒刷新一次 -
追踪模式:有时候某个进程一闪而过,用普通模式看不清。可以用
-t参数进入追踪模式,它会持续捕获所有网络活动,直到你手动停止(Ctrl+C)。sudo nethogs -t -
查看累计流量:默认显示的是实时速率。加上
-v 2参数,可以查看自nethogs启动以来,每个进程的总发送和接收流量。这在排查某个程序一共上传/下载了多少数据时非常有用。sudo nethogs -v 2
注意:nethogs需要root权限才能访问所有进程的网络套接字信息,所以记得前面一定要加
sudo。如果不加,它可能只能看到你当前用户启动的进程,信息不全。
2.3 实战排查案例:揪出“流量小偷”
光说不练假把式。我来分享一个真实案例。有一次,我发现办公室的NAS服务器上传灯狂闪,但大家都没在访问。我立刻SSH连上去,运行 sudo nethogs。
一眼就看到一个陌生的进程backup-agent,正在以每秒几MB的速度持续上传。PID是7890。我马上用 ps aux | grep 7890 查了一下,发现是某个测试用的备份脚本,因为配置错误,陷入了死循环,不停地把本地文件往一个错误的远程地址上传。
解决方法很简单:先用 kill 7890 终止这个进程,止住血。然后去修正那个备份脚本的配置逻辑。整个过程不到3分钟。如果没有nethogs,我可能得去翻遍各种日志,花上几个小时。
所以,当你遇到网络异常时,第一步就打开nethogs,按流量排序,往往能瞬间定位问题根源。它就像给系统装了一个“流量仪表盘”,所有程序的网络行为都一目了然。
3. 历史流量分析师:vnstat配置与详解
nethogs解决了“当下谁在搞鬼”的问题,但如果你想回答“过去一周我的服务器用了多少流量?”或者“每天下午流量高峰是不是规律性的?”,就需要一个能长期、安静记录数据的工具。vnstat就是干这个的。它是一个轻量级的命令行网络流量统计器,后台有一个守护进程(daemon)默默收集数据,几乎不消耗系统资源。
3.1 安装与初始配置
安装同样简单:
sudo apt update
sudo apt install vnstat
安装完成后,最关键的一步是初始化数据库和启动服务。很多新手卡在这里,运行vnstat命令却看到“数据库不存在”或“没有足够数据”的提示。
-
初始化数据库:vnstat需要为你监控的网卡创建一个数据库文件。通常安装程序会尝试自动完成,但手动确认一下更稳妥。假设你的网卡是
eth0(服务器常见)或wlp3s0(桌面常见):sudo vnstat -u -i eth0这个命令会为
eth0接口创建数据库。你可以用vnstat --iflist命令查看系统所有可监控的接口。 -
启动并启用服务:确保vnstat守护进程在运行,并且开机自启。
sudo systemctl start vnstat # 立即启动服务 sudo systemctl enable vnstat # 设置开机自启 sudo systemctl status vnstat # 检查服务状态看到状态是
active (running)就对了。
3.2 常用命令与数据解读
配置好之后,vnstat用起来就非常直观了。下面是一些最常用的命令:
-
查看今日/本月摘要:
vnstat输出示例:
eth0 since 2023-10-01 rx: 25.67 GiB tx: 3.45 GiB total: 29.12 GiB monthly rx | tx | total | avg. rate ---------------------+-------------+-------------+--------------- Sep '23 15.32 GiB | 1.12 GiB | 16.44 GiB | 5.61 kbit/s Oct '23 25.67 GiB | 3.45 GiB | 29.12 GiB | 9.88 kbit/s ---------------------+-------------+-------------+--------------- estimated 34 GiB | 5 GiB | 39 GiB |这里
rx是接收(下载),tx是发送(上传)。它显示了本月至今的流量,以及上个月的对比,甚至还会根据当前使用率估算本月结束时的总流量,非常贴心。 -
查看每日详细流量:
vnstat -d这会列出最近30天的每日流量,帮你找出流量异常的具体是哪一天。
-
查看每周流量概览:
vnstat -w -
查看每月流量概览:
vnstat -m -
查看实时流量速率(类似简易版iftop):
vnstat -l这会进入一个实时监控模式,显示当前接口的瞬时上传下载速度,按Ctrl+C退出。
-
以小时为维度查看流量(排查高峰时段):
vnstat -h
3.3 常见问题与故障排除
vnstat很稳定,但偶尔也会遇到小问题,主要集中在数据不更新或没数据上。
-
问题:运行
vnstat提示“数据库未找到”或“没有足够数据”。- 检查1:服务是否运行?
systemctl status vnstat。如果没运行,就sudo systemctl restart vnstat重启它。 - 检查2:数据库目录权限。vnstat的数据存在
/var/lib/vnstat/。确保这个目录属于vnstat用户和组。sudo chown -R vnstat:vnstat /var/lib/vnstat/ - 检查3:是否初始化了正确的接口? 用
vnstat --iflist看,然后用sudo vnstat -u -i 你的接口名为它创建数据库。
- 检查1:服务是否运行?
-
问题:服务器重启后,流量统计不连续?
- 这是正常的。vnstat统计的是系统启动后的流量。重启后,它会从0开始新周期。但别担心,每日(
-d)、每月(-m)的统计是基于日历日期,重启不会影响这些汇总数据。只是“since”后面的日期会变成最近一次启动的时间。
- 这是正常的。vnstat统计的是系统启动后的流量。重启后,它会从0开始新周期。但别担心,每日(
-
问题:我想监控多个网卡(比如eth0和docker0)怎么办?
- vnstat默认会自动监控它识别到的主要接口。你也可以为多个接口分别创建数据库并监控。
sudo vnstat -u -i eth0 sudo vnstat -u -i docker0
查看时指定接口即可:
vnstat -i eth0或vnstat -i docker0。 - vnstat默认会自动监控它识别到的主要接口。你也可以为多个接口分别创建数据库并监控。
vnstat的数据文件很小,却记录着宝贵的网络使用历史。对于服务器运维来说,定期查看vnstat -m的输出,是进行流量成本分析和容量规划的基础。
4. 组合拳实战:从监控到分析与优化
单独使用nethogs和vnstat已经很强大了,但如果把它们结合起来,甚至搭配其他命令,就能形成一套完整的网络流量监控分析工作流。
4.1 场景化组合使用
-
场景一:发现本月流量异常偏高
- 先用
vnstat -m确认是哪个月份流量激增。 - 再用
vnstat -d定位到具体是哪几天出了问题。 - 在问题日期附近,虽然无法回溯当时的实时进程,但你可以现在就运行
sudo nethogs,观察是否仍有异常进程在持续运行。很多时候,流量异常是由一个长期存在的后台进程引起的。
- 先用
-
场景二:服务器响应变慢,怀疑被攻击或爬虫骚扰
- 立刻用
sudo nethogs查看实时连接,寻找发送流量异常高的陌生进程或连接。 - 同时,用
vnstat -l查看实时总速率,感受攻击的强度。 - 如果发现可疑IP,可以结合
netstat -tunp | grep <IP>来查找对应的进程ID,进行更深度的分析。
- 立刻用
-
场景三:为家庭服务器或VPS设置流量警报 vnstat本身没有警报功能,但我们可以用它的输出结合简单的Shell脚本实现。比如,写一个每日检查的脚本,如果当日流量超过10GB,就发送邮件通知自己。
#!/bin/bash TODAY_RX=$(vnstat -d | grep `date +"%m/%d"` | awk '{print $2}') # 这里需要根据vnstat -d的实际输出格式调整awk字段,以上仅为思路示例 # 如果TODAY_RX大于某个阈值,就调用邮件命令发送警报这个脚本可以放到cron里每天定时执行。
4.2 数据持久化与可视化(可选进阶)
对于长期运维,你可能希望把vnstat的历史数据保存下来,甚至做成图表。这里有个小技巧:vnstat的数据是纯文本的,但你可以用vnstat --json输出JSON格式,然后用Python、Node.js等脚本语言解析,存入数据库(如SQLite、MySQL),或者生成简单的HTML报表。
虽然不如专业的监控系统(如Zabbix, Prometheus+Grafana)强大,但对于个人项目或小团队来说,这套基于nethogs和vnstat的方案,几乎零成本、低消耗,却提供了极其关键的可见性。
说到底,监控的目的不是为了看数字,而是为了理解、诊断和优化。当你对系统的网络流量了如指掌后,很多性能问题、成本问题、安全问题都会迎刃而解。我自己的习惯是,在新服务器上线后,第一件事就是装好vnstat,让它开始默默记录。而当任何网络相关的怪事发生时,第一个打开的终端窗口,一定是运行着nethogs的那个。这两个工具已经成了我工具箱里不可或缺的“瑞士军刀”,希望它们也能帮到你。
4670



被折叠的 条评论
为什么被折叠?



