利用 Vnstat 监控 VPS 流量

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. 思路

  1. vnstat 输出流量信息到文本
  2. 读取流量信息文件,判断若超出则停止 ss
  3. 以上写一个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