# 用 VnStat 和 Picosnitch 持续统计 Linux 流量


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

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

## vnStat：按网卡统计

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

Arch Linux 安装并启动服务：

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

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

```bash
vnstat --dbiflist
```

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

```bash
sudo vnstat --add -i tailscale0
```

常用的总览查询：

```bash
# 默认摘要：今天、当前月、累计
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`，就是整个区间的上下行合计。

```bash
# 每日统计和区间合计
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:MM`、`YYYY-MM-DD` 和 `today`；`--end` 支持前两种日期格式。它们只能和列表输出、JSON 或 XML 一起使用。

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

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

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

```bash
# 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`，然后重启服务：

```ini
5MinuteHours 336
```

```bash
sudo systemctl restart vnstat
```

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

## picosnitch：按进程统计

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

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

```bash
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 内核。

数据有三种查看方式：

```bash
# 终端 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`，改完重启服务：

```toml
[database]
retention_days = 90
```

```bash
sudo systemctl restart picosnitch
```

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

```bash
PICOSNITCH_HOST=0.0.0.0 PICOSNITCH_PORT=5100 picosnitch webui
```

## 一起排查流量异常

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

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


---

> 作者: Nite  
> URL: https://www.nite07.com/zh-cn/posts/linux-traffic-monitoring-vnstat-picosnitch/  

