利用 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

搞定。

leeway

继续阅读此作者的更多文章

comments powered by Disqus