服务器探针与流量重置

之前薅了 azure 的羊毛,想想每个月 15g 流量,还是挂个探针吧。我之前一直在用 cppla/ServerStatus: 云探针、多服务器探针、云监控、多服务器云监控,演示: https://tz.cloudcpp.com/,因为它可以通过定时连接三网官网去探测服务器的延迟,好多画风更棒的探针都没这个功能(但准不准就不知道了,起码每天测出来的数据都是电信爆炸,这个我觉得是准的)。

ServerStatus 安装

需要一台安装了 docker ,拥有公网 ip 的探针面板机,我选择装在境内的 tx 云学生机上,等过期了可能就装到家里的 n1 上然后靠 frp 端口透穿(

面板机配置

下载配置文件,我习惯在 root 下单开文件夹:

1
2
3
mkdir -p /root/docker-compose/serverstatus
cd /root/docker-compose/serverstatus
wget https://raw.githubusercontent.com/cppla/ServerStatus/master/autodeploy/config.json

并修改。默认配置文件中有四个文件块,对应着四个服务器,如果你手上没那么多 vps,可以酌情增减。抽出其中一个文件块来看。

1
2
3
4
5
6
7
8
{
"username": "s01", #待会在客户端服务器中设置的用户名
"name": "node1", #在 web 面板中显示的节点名
"type": "xen", #在 web 面板中显示的服务器系统类型
"host": "host1", #没啥用,作者在issue中说单纯为了区分用
"location": "cn", #在 web 面板中显示的服务器地区
"password": "USER_DEFAULT_PASSWORD" #待会在客户端服务器中设置的密码
},

设置好后,运行(80 port 太多东西占了,先调到 100 去)

1
docker run -d --restart=always --name=serverstatus -v /root/docker-compose/serverstatus/config.json:/ServerStatus/server/config.json -p 100:80 -p 35601:35601 cppla/serverstatus

客户机配置

debian 默认带 python2,不用装了。直接下载(假设直接下到 /root 下)

1
wget --no-check-certificate -qO client-linux.py 'https://raw.githubusercontent.com/cppla/ServerStatus/master/clients/client-linux.py'

运行:

1
python client-linux.py SERVER=[宿主服务器ip] USER=[宿主机配置中对应代码块的用户名] PASSWORD=[宿主机配置中对应代码块的密码]

如果显示 ipv4 granted 之类的消息,那就证明连接正常。然后做后台运行和自启,请出老朋友 supervisor。

安装

1
apt install supervisor -y

新建文件 tanzhen.conf

1
2
3
4
5
6
7
[program:tanzhen]
user=root
command=python client-linux.py SERVER=[宿主服务器ip] USER=[宿主机配置中对应代码块的用户名] PASSWORD=[宿主机配置中对应代码块的密码]
autostart=true
redirect_stderr = true
stdout_logfile_maxbytes = 1MB
stdout_logfile = /tmp/tanzhen.log

放入 /etc/supervisor/conf.d 中。重载配置:

1
supervisorctl reload

访问 [面板机ip]:100,正常的话就能看到客户端已连接。


这么配置,总流量是找 /proc/net/dev 要的,于是出现两个问题:

  1. 重启后流量显示重置
  2. 每月重置流量没法实现

项目 issue 服务器流量统计怎么清零 · Issue #54 · cppla/ServerStatus 里面,作者建议用 vnstat 来探测流量。

vnstat 探测流量与流量重置

安装与使用

安装 vnstat

1
apt install vnstat

安装后重启一遍服务,以网络获取接口情况;或者直接新建接口。

1
2
3
service vnstat restart
#上面这个命令或者下面这个命令,二选一,假设网卡名为 eth0
#vnstat --create -i eth0

输入

1
vnstat -q

出现类似

就算成功。因为 5 分钟才刷新一次流量显示,所以 5 分钟后再次输入 vnstat -q 才会有正确的流量数据出现。类似于:

当然,如果等的不耐烦,也可以直接输入 vnstat -u 手动刷新流量显示值,然后输入 vnstat -q 查看。

整合进探针中

编辑探针客户端的 client.py 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def liuliang():
NET_IN = 0
NET_OUT = 0
with open('/proc/net/dev') as f:
for line in f.readlines():
netinfo = re.findall('([^\s]+):[\s]{0,}(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)', line)
if netinfo:
if netinfo[0][0] == 'lo' or 'tun' in netinfo[0][0] \
or 'docker' in netinfo[0][0] or 'veth' in netinfo[0][0] \
or 'br-' in netinfo[0][0] or 'vmbr' in netinfo[0][0] \
or 'vnet' in netinfo[0][0] or 'kube' in netinfo[0][0] \
or netinfo[0][1]=='0' or netinfo[0][9]=='0':
continue
else:
NET_IN += int(netinfo[0][1])
NET_OUT += int(netinfo[0][9])
return NET_IN, NET_OUT

替换为

1
2
3
4
5
6
7
8
9
10
11
def liuliang():
NET_IN = 0
NET_OUT = 0
vnstat=os.popen('vnstat --dumpdb').readlines()
for line in vnstat:
if line[0:4] == "m;0;":
mdata=line.split(";")
NET_IN=int(mdata[3])*1024*1024
NET_OUT=int(mdata[4])*1024*1024
break
return NET_IN, NET_OUT

重载 supervisor 即可生效。

(21.3.31 更新) 在某些系统(比如 ubuntu 中),安装的 vnstat 版本不是 v1.x 而是新的 v2.x,剔除了 vnstat --dumpdb 这个命令导致上面这行代码无法工作。需要更换为:

1
2
3
4
5
6
7
8
9
10
11
12
13
def liuliang():
NET_IN = 0
NET_OUT = 0
vnstat=os.popen('vnstat --oneline').readlines()
for line in vnstat:
mdata=line.split(";")
NET_IN=str(mdata[8])
NET_IN=re.findall('\d+\.\d*', NET_IN)
NET_IN=int(float(NET_IN[0])*1024*1024*1024)
NET_OUT=str(mdata[9])
NET_OUT=re.findall('\d+\.\d*', NET_OUT)
NET_OUT=int(float(NET_OUT[0])*1024*1024*1024)
return NET_IN, NET_OUT

配置定时重置和刷新时间

vnstat 的配置放在 /etc/vnstat.conf 中。默认情况下每月流量重置时间为 1 号。如果需要修改,可以修改 MonthRotate 参数。

1
2
# on which day should months change
MonthRotate 1

流量总量显示 5 分钟刷新一次,有点久。可以修改

1
2
3
# how often (in minutes) bandwidth detection is redone when
# BandwidthDetection is enabled (0 = disabled)
BandwidthDetectionInterval 5

不过再怎么修改也没有默认的实时更新快。。。这也是使用 vnstat 代替默认方法的缺点之一。

还有,每月重置时间这个,如果你手动修改后再修改时区到最近的 0 点想看看能不能生效,多半是看不到的。根据:[SOLVED] vnstat not changing the start of the month [day]

1
2
3
Having been in contact by e-mail with vnstat's author, Teemu Toivola, it was revealed that [as I suspected/hoped for] the new setting to MonthRotate will not take effect on the same month that it was done; so I will definitely have to wait until June 10th to confirm this feature of vnstat. Until then, I will keep this thread open.
Oddly enough, despite my intense searching for an answer to this fact, I never read any explanation for it anywhere else; well, there is one now, right here!
Thank you, Habitual, for the assistance.

也就是说一定要等到真实时间的下个月才会重置流量。(当然把时间调到下个月能不能成功我就不知道了,懒得试)

手动重置流量信息

我还不知道上面这个方法能不能生效。。。如果不行的话,那就只能手动重置流量。

删除流量数据

1
2
rm -r /var/lib/vnstat/.* 
rm -r /var/lib/vnstat/*

重启 vnstat

1
service vnstat restart

改一改写进 crontab 也能达成自动重置流量的目的。


如果删除后重启,查看 service vnstat status 发现遭遇文件权限问题:

1
chown -R vnstat:vnstat /var/lib/vnstat

另外,vnstat 的日志中还发现有一个叫 vnstat daemon,也就是叫 vnstatd 的东西。其实 vnstat 和 vnstatd 是同一个服务。操作(start/stop/restart/status)的时候只用操作其中一个就好。