zabbix-agent客户端在Linux服务器安装之后,服务器端配置上Template OS Linux这个模板 ,就会自动搜索该服务器上的所有网卡,然后实时记录income流量和outcome流量,并绘制成图标显示,如下。
有这个粗略的统计可以帮助运维人员了解服务器的健康情况,但是有时候我们需要更加精细的监控,监控粒度要精细到某个端口和IP,比如统计80端口,443端口以时间为轴的流量变动情况。或者统计来自192.168.1.*和192.168.2.*流量的变化情况,甚至更进一步,统计192.168.1.1访问本机80端口产生的流量。这种需求使用基于网卡的监控已经不足以实现,必须使用新方法。
好在Linux网络流量都会经过iptables内核模块,iptables能够以极高的效率进行IP协议数据包和流量的统计,在记录和统计时几乎不影响系统性能,而且查询计数器和清零计数器也以毫秒为单位。通过iptables灵活的过滤命令,我们可以像配置防火墙一样配置我们需要监控的流量,然后配合zabbix自定义轮训取值功能,将客户机iptables统计的结果收集到zabbix server当中,并绘制图形,就可以直观准确的分析流量了。
首先我们要补充一些iptables知识,这里我就不赘述了,可以看下面这篇文章
https://www.cnblogs.com/pangguoping/p/5715539.html
大体来说,就是通过在Filter表中添加相关端口和IP的监控条目,然后定时使用iptables -v命令查看数据包的数量和流量大小,并定期使用iptables -Z命令清空计数器。最后就得到每分钟或每小时某端口的流量了。
我目前设计了两个场景,一个是统计某Linux服务器22端口的流量变化情况,另一个是统计192.168.1.1访问某LInux服务器9080端口的流量情况,zabbix服务器每30秒收集一次数据,并清空iptables计数器,然后把收集到的数据除以30,就是平均每秒的流量。
首先我们设置iptables规则
iptables -I INPUT -p tcp --dport 22
iptables -I INPUT -p tcp -s 192.168.1.1 --dport 9080
然后写一个脚本,用来调用iptables,获取当前一段时间统计的流量
#!/bin/bash
#echo $(sudo /sbin/iptables -vxn -L)
output=$(sudo /sbin/iptables -vxn -L | awk -v nr=$1 'NR==nr {print $2}')
sudo /sbin/iptables -Z > /dev/null
output=$(($output / $2))
if [ -z $output ]
then echo "0"
else echo $output
这个脚本传入了两个参数,$1是取iptables -v结果的第几行,一般从第三行开始就是具体规则统计的信息了,通过上面-I命令,观察后得出是第三行和第四行
$2是zabbix server来取值的间隔,单位是秒,通过某段时间的流量除以这段时间的长度就得出每秒的流量,返回给zabbix server。
由于iptables只能由root用户进行调用,zabbix客户端的用户为zabbix,没有权限使用iptables,如果不加sudo,调用时就会报错:
所以要添加sudo,可是Linux用户并不是想用sudo就可以用sudo的,根据我另一篇关于zabbix权限的博客经验 《 Zabbix远程命令权限不足问题解决方法》,通过修改/etc/sudoers文件来使zabbix用户可以使用sudo命令。方法就是在/etc/sudoers文件中添加下面一行
zabbix ALL=NOPASSWD: /sbin/iptables
另外centos7以上不要忘了把selinux也一并关闭
setenforce 0
此时我们就可以在客户机上测试这个脚本是不是可以正常取到流量值了,单位为Byte
sudo -u zabbix /usr/local/bin/trafic_status 3 1
上面就是以zabbix用户运行脚本文件,取iptables -v结果的第四行中流量值的大小,结果应为正整数,如下图
然后需要为zabbix server设置一个key,用于取值,此时我们需要在zabbix-agent的配置文件夹中增加一个文件,配置自定义监控键,我的配置文件夹为/etc/zabbix/zabbix_agentd.d/,我在里面新建了一个文件名为userparameter_trafic.conf,内容如下
UserParameter=custom.trafic[*],/usr/local/bin/trafic_status $1 2>/dev/null
然后我们客户端的工作就已经做好了,此时需要重启zabbix-agent以生效
service zabbix-agent restart
然后我们登录zabbix-server服务器,先使用zabbix-get命令查看一下能否成功取到监控值
zabbix_get -s 192.168.2.1 -k "custom.trafic[3,30]"
上面192.168.2.1就是zabbix客户机的地址,custom.trafic是我们上面客户机配置文件中配置的UserParameter,3是iptables -v输出结果的第三行,对应着Filter表第一条INPUT条目监控的流量。30是把获得流量除以30,因为我设置30秒收集一次并清空计数器,所以每秒的平均流量就除以30,你也可以设置10秒或15秒,不过太频繁也没有必要。
如果能取到正整数,那么我们客户机配置的没有问题,如果取不到,可以逐行屏蔽上面的脚本进行调试。一般问题容易出在iptables的权限上面。
然后我们就可以到zabbix-server的控制台增加监控项和图表了,如下图,主要就是设置更新间隔和第几行,保证更新间隔(秒)和第二个参数一致
配置图表,如下
主要就是将刚才设置的监控项放进去,然后调整一下坐标Y轴和线的颜色
配置完成后等待几分钟,就可以看到图了,如下
如果没有线出现,那么就到zabbix的”检测中“-“最新数据” 里查看报错内容,如下
很多人在监控的时候还需要同时监控TCP连接情况,尤其是ESTABLISHED和FIN_WAIT状态的TCP连接数量,和上面一样,可以通过脚本并授权root用户获取
/etc/zabbix/zabbix_agentd.d/userparameter_sstcp.conf
UserParameter=custom.sstcp[*],/usr/local/bin/tcp_status $1 2>/dev/null
可执行脚本文件:/usr/local/bin/tcp_status,第一个参数为TCP状态,如ESTAB
#monitor tcp
UserParameter=custom.sstcp[*],/usr/local/bin/tcp_status $1 2>/dev/null
[root@emessage zabbix_agentd.d]# cat /usr/local/bin/tcp_status
#!/bin/bash
#xiaoluo
#scripts for tcp status
function SYNRECV {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'SYN-RECV' | awk '{print $2}'
}
function ESTAB {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'ESTAB' | awk '{print $2}'
}
function FINWAIT1 {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'FIN-WAIT-1' | awk '{print $2}'
}
function FINWAIT2 {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'FIN-WAIT-2' | awk '{print $2}'
}
function TIMEWAIT {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'TIME-WAIT' | awk '{print $2}'
}
function LASTACK {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'LAST-ACK' | awk '{print $2}'
}
function LISTEN {
/usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'LISTEN' | awk '{print $2}'
}
output=$($1)
if [ -z $output ]
then echo "0"
else echo "$output"
fi
zabbix-server的监控项配置如下
图形配置如下
然后就可以查看TCP连接状态的效果图了
可以明显的看到,白天时候的TCP连接数比晚上的多。而且通过这种方式,可以直观的看出有没有TCP连接泄露(open之后不close)的连接