导读:不限流量的套餐越来越少,主流VPS基本都按月给固定流量:500G、1T、2T。多数商家对超额的处理是按GB加收费用,单价还远高于套餐内均价。而系统自带的流量工具要么重启清零、要么只看实时速率,根本没有“本月已用多少”的概念。这篇用vnstat搭建月流量账本:数据落盘不怕重启、按月自动归档、流量过线自动告警,一条命令随时查账。
一、先搞清楚:为什么不用现成工具
很多人查流量用商家后台面板或iftop/nload:
商家面板的问题:更新延迟大(有的半小时才刷新一次)、统计口径和账单不完全一致、商家跑路或面板维护时你看不到数据;
iftop/nload的问题:它们只显示“实时速率”,关掉就忘,没有任何历史累计,回答不了“这个月用了多少”。
vnstat的本质区别:它是守护进程,持续把每个网卡的收发字节数落盘成数据库,独立于商家统计,重启不丢数据,随时回看任意月份的用量。
二、安装与首次配置
Debian / Ubuntu:
apt install vnstat
CentOS系需要先装epel源。安装完成后确认服务状态:
systemctl enable --now vnstat
刚启动时数据库还没建立,执行vnstat可能提示无数据,等几分钟自动开始记录。
三、日常查账:三条命令看明白
无参数直接查当月汇总:
vnstat
输出里重点看eth0的last month和估算行:它会根据当前速率预估月底总流量,这个数字最能提醒你会不会超额。
按天看细节:
vnstat -d
流量异常暴涨时,用它定位是哪一天开始出的问题。
按小时看规律:
vnstat -h
可以看清流量高峰在什么时段,判断是正常访问还是被扫被刷。
四、修改计费重置日(重要)
一个容易踩的坑:商家账单日未必是每月1号。如果你的套餐是每月15号出账,而vnstat按自然月统计,两边数字就对不上。
编辑 /etc/vnstat.conf,找到:
MonthRotate 1
改成你的账单日(比如15号就改成 MonthRotate 15),然后重启服务:
systemctl restart vnstat
从此vnstat的“当月”和商家的计费周期对齐,统计才有对照意义。
五、流量过线自动告警
vnstat本身不带告警,配一个cron脚本补齐。思路:每天检查一次当月用量,超过阈值就推送通知。
先装jq(解析JSON用):
apt install jq
再写检查脚本 /root/check_traffic.sh:
#!/bin/bash
LIMIT_MB=1048576
USED_MB=$(vnstat --json m | jq '.interfaces[0].traffic.month[0].rx / 1048576')
WARN=$(echo $USED_MB | awk -v lim=$LIMIT_MB '{if ($1*100/lim > 80) print 1; else print 0}')
if [ $WARN -eq 1 ]; then
curl -s 你的通知接口地址 -d text=流量已用超八成_请关注
fi
脚本逻辑:取本月接收字节数换算成MB,用量到80%就推送提醒。通知渠道任选:Server酱、Telegram Bot、邮件接口都行,一行curl的事。不想依赖外部服务的,最简单粗暴版可以让它给root发本地邮件。
加执行权限并配cron:
chmod +x /root/check_traffic.sh
crontab -e
写入(每天早上8点检查):
0 8 * * * /root/check_traffic.sh
六、几个实用细节
1. 多网卡机器:vnstat会为每个网卡建独立数据库,查特定网卡用 vnstat -i eth1。VPS上主网卡一般是eth0或ens3,不确定的话 ip addr 看一眼;
2. 数据库位置:/var/lib/vnstat/,想备份统计历史就把这个目录打包;
3. 卸载重装不清零:数据库独立于软件包,卸载重装后历史数据还在;
4. 和商家数字有小出入是正常的:统计口径、计费周期起点不同导致,差距在几个百分点内不用担心,差出一倍才需要找商家对账。
结语
流量超额是VPS账单里最冤的一笔钱:不是机器出问题,纯粹是没人提醒你。vnstat加一个cron脚本,十分钟配完,从此流量账目心里有数:什么时候用得多、还剩多少、什么时候该收敛或升配。
建议装机初始化时就把vnstat装上,和安全加固、备份配置一起列入新机到手的标准动作清单——它不占资源、不需要维护,只在关键时刻救你的钱包。




