Vnstat: 简单实用的网络流量统计工具,优点是可以直接可以输出流量统计图。
我们可以利用这个工具来进行流量控制,对于采用流量计费的 vps,例如阿里云,万一哪天收到天价账单就亿脸懵逼了。
利用 Vnstat ,配合一些简单的脚本即可对 ss 流量进行预警——超出一定流量立即停止 ss 进程,这比搭建个 ss-panel 便捷多了;另外一定程度也能预防 cc 攻击带来的流量悲剧。
以下命令均为 debian 环境,其他系统请自行更改命令。
一、安装
apt-get install vnstat vnstati
初始化数据库,即对网卡进行操作
vnstat -u -i eth0
启动 daemon 进程
/etc/init.d/vnstat start
开机启动
insserv vnstat
二、操作
直接输入 vnstat ,或后面加相应的参数
vnstat -d #日流量信息
vnstat -m #月流量信息
vnstat -m -i eth1 #指定网卡为eth1
vnstat -l #实时监控状态
man vnstat #显示详细参数
#输出每月参数到文本
vnstat -m > /root/month.txt
#输出每月参数到图形
vnstati -i eth0 --months --output /root/month.png
三、流量控制
1. 目的
监控 VPS 流量,若超过 50G 则直接关闭 ss 服务
2. 思路
- vnstat 输出流量信息到文本
- 读取流量信息文件,判断若超出则停止 ss
- 以上写一个python程序,每隔半小时执行一次
3. 操作
直接撸代码,以下存为 txss.py
# -*- coding:utf-8 -*-
import os
import re
import time
# 流量数据写入文件
# 这里自己指定网卡,一般是 eth0,阿里云是 eth1
os.system("vnstat -m -i eth1 > /root/tx.txt")
time.sleep(1) # 保险起见延迟1秒,给予命令执行时间
# 获取当前月份
def get_now_month():
now_month_num = time.strftime("%m")
# 月份数字转英文
num_to_en = {'01':'Jan','02':'Feb','03':'Mar','04':'Apr','05':'May','06':'Jun','07':'Jul','08':'Aug','09':'Sept','10':'Oct','11':'Nov','12':'Dec'}
return num_to_en[now_month_num]
# 读取文件
f = []
for line in open("/root/tx.txt"):
f.append(line),
# 定位到 tx 所在行
def ftext():
for i in range(0,len(f)):
if re.search(get_now_month(),f[i]):
return f[i]
# 提取 tx 所在的字符位置
tx = re.findall(r"\|(.*?)\|",ftext())[0]
if re.search(r"GiB",tx): # 若单位不是 GiB 就直接跳过
#处理字符串得到具体的 tx 数值
tx_data = float(re.sub(r"\s","",tx)[:-3])
#若大于 50G 直接关闭ss服务,并记录日志方便查看
if tx_data > 50:
os.system("/root/shadowsocks/stop.sh") #自行修改停止ss的命令
os.system("date=`date +%Y-%m-%d_%H:%M:%S` && echo ${date}' 服务器出向流量已超过50G,自动关闭shadowsocks' >> /root/stopss.log")
else:
cmd = "date=`date +%Y-%m-%d_%H:%M:%S` && echo ${date}' 服务器当前已使用流量 "+str(tx_data)+" GiB' >> /root/stopss.log"
os.system(cmd)
else:pass
编辑 cron 定时脚本
crontab -e
添加如下:
*/30 * * * * python /root/txss.py
搞定。
备注:可能出现的错误
在 ubuntu 15+,deabin 9+ 如果出现 vnstat 数据不更新,那多半是因为权限原因导致的。可以运行这个来排查:
ll /var/lib | grep vnstat
drwxr-xr-x 2 root root 4096 Nov 17 00:34 vnstat
如果显示所有者是 root,就会出这个问题。具体情况可以进一步查看日志/var/log/syslog
,日志会给出“不能创建数据库”的错误记录:
Nov 22 21:53:12 ... vnstatd[8782]: Error: Unable to create database backup "/var/lib/vnstat/.eth0".
现在只需赋予权限后,重新运行 vnstat 即可:
chown -R vnstat:vnstat /var/lib/vnstat
/etc/init.d/vnstat restart
参考资料:https://askubuntu.com/questions/500663/vnstat-not-updating