用 VnStat 和 Picosnitch 持续统计 Linux 流量

目录

VPS 的流量异常时,通常要回答两个问题:哪个网卡在什么时候跑了多少流量,以及到底是哪个服务跑掉的。

vnStat 记录网卡接口的收发流量,适合看总出口和按小时、天、月的趋势。picosnitch 记录每个可执行文件发起的连接,能继续查到进程、域名、端口和收发字节数。两个工具都在后台持续写数据,但统计维度不同,放在一起正好补全。

vnStat:按网卡统计

vnStat 不是抓包工具。它读取内核提供的网卡计数器,vnstatd 定时将数据写入数据库,资源占用很低。它会保存 5 分钟、小时、天、月和年的统计记录。

Arch Linux 安装并启动服务:

sudo pacman -S vnstat
sudo systemctl enable --now vnstat

服务首次启动时会为当前可用网卡创建数据库记录。先看已记录的接口:

vnstat --dbiflist

之后新增的接口可以手动加入,例如 Tailscale 创建了 tailscale0

sudo vnstat --add -i tailscale0

常用的总览查询:

# 默认摘要:今天、当前月、累计
vnstat -i wlan0

# 短格式摘要
vnstat -i wlan0 -s

# 一行可解析输出,适合脚本
vnstat --oneline -i wlan0

# 最近 7 天、12 小时、最近月份
vnstat -i wlan0 -d 7
vnstat -i wlan0 -h 12
vnstat -i wlan0 -m

要查异常发生的时间段,--begin--end 可以配合每日、每小时或 5 分钟列表使用。指定 --end 后,列表末尾会多出一行 sum,就是整个区间的上下行合计。

# 每日统计和区间合计
vnstat -i wlan0 -d --begin 2026-07-20 --end 2026-07-31

# 一天内按小时查,时间精确到分钟
vnstat -i wlan0 -h --begin "2026-07-28 08:00" --end "2026-07-28 20:00"

# 高峰时段按 5 分钟查
vnstat -i wlan0 -5 --begin "2026-07-28 12:00" --end "2026-07-28 14:00"

--begin 支持 YYYY-MM-DD HH:MMYYYY-MM-DDtoday--end 支持前两种日期格式。它们只能和列表输出、JSON 或 XML 一起使用。

脚本需要原始字节数时用 JSON:

vnstat -i wlan0 -d --begin 2026-07-28 --end 2026-07-30 --json \
  | jq '.interfaces[0].traffic.days'

实时查看速率和生成图表:

# Ctrl+C 后会显示本次运行期间的统计
vnstat --live -i wlan0

# 最近 24 小时的终端条形图
vnstat -i wlan0 -hg

# 每日统计渲染为 PNG
vnstati -i wlan0 -d -o ~/wlan0.png

默认只保留 48 小时的 5 分钟粒度数据。要更久地保留高峰时段的细粒度记录,修改 /etc/vnstat.conf 中的 5MinuteHours,然后重启服务:

5MinuteHours 336
sudo systemctl restart vnstat

vnStat 从 vnstatd 开始运行后才有数据,无法补回此前经过网卡的流量。

picosnitch:按进程统计

vnStat 能发现哪段时间的总流量增长,但无法说明流量属于谁。picosnitch 是使用 BPF 和 fanotify 的用户态 daemon,按可执行文件记录网络连接,同时写入 SQLite。它会记录可执行文件路径和哈希、父进程、域名、端口、用户,以及收发字节数;容器内的应用也能识别。

picosnitch 上游推荐用全局 pipx 安装。Arch Linux 可以这样部署:

sudo pacman -S python-pipx
sudo pipx install picosnitch --global
sudo picosnitch systemd
sudo systemctl enable --now picosnitch

需要 Python 3.12 或更高版本,以及能运行现代 libbpf CO-RE 程序的 Linux 内核。

数据有三种查看方式:

# 终端 TUI,浏览历史连接
picosnitch tui

# Web UI,默认监听 http://localhost:5100
picosnitch webui

# 实时事件流
sudo picosnitch top

配置在 /etc/picosnitch/config.toml。本地 SQLite 数据库默认位于 /var/lib/picosnitch/picosnitch.db,默认保留 30 天。需要延长历史记录时修改 retention_days,改完重启服务:

[database]
retention_days = 90
sudo systemctl restart picosnitch

Web UI 默认只监听本机。需要让局域网或反代访问时,可以在启动前设置监听地址和端口;公开暴露前应自行做好访问控制:

PICOSNITCH_HOST=0.0.0.0 PICOSNITCH_PORT=5100 picosnitch webui

一起排查流量异常

先用 vnStat 查实际经过网卡的流量,确定异常从哪天或哪个小时开始。时间范围收窄后,打开 picosnitch 的 TUI 或 Web UI,按对应时间查看可执行文件、域名和端口。

例如,vnStat 显示 wlan0 在中午两小时内发送流量异常增长,接着在 picosnitch 中查看同一时间范围。如果流量集中在 caddy,再看它连接到哪些客户端;如果集中在备份程序或下载器,就从对应服务的日志和配置继续排查。网卡统计负责发现问题,进程统计负责定位来源。

目录