个人博客

zabbix对服务器接入IP流量监控

01 09月
作者:西洪室|分类:技术
实施目的:监控数据库服务器上连接的客户端流入、流出数据,通过该监控分析客户端流量,数据超过警戒值,通过钉钉告警
一、创建发现脚本,将连接到服务器的ip地址记录下来,并在zabbix里生成监控项
1、创建脚本调用的配置文件,存放在zabbix_agentd.conf.d目录中,在UserParameter定义发现和流量监控键值
[root@master zabbix_agentd.conf.d]# cat connected_ip.conf
UserParameter=ip.discovery,/opt/zabbix/scripts/ip_dis.sh    #IP地址发现脚本
UserParameter=ip.traffic[*],/opt/zabbix/scripts/traffic.sh $1 $2    #记录流量
2、编辑ip地址发现脚本,脚本包含检测过程,检测ip是否在ipset集合中,没有就添加进集合;如果ip连接已经断开,就在ipset集合中删除该ip。最后按照json格式打印已连接的ip地址
[root@master scripts]# cat ip_dis.sh
#!/bin/bash
#服务器ip地址和端口
host_ip="192.168.1.10:2345"
#检查是否创建ipset集合,没有则生成流入和流出集合
ins=$(ipset list|grep in_traffic|wc -l)
outs=$(ipset list|grep out_traffic|wc -l)
if [ ${ins} -eq 0 ];then
    ipset create in_traffic hash:ip counters
fi
if [ ${outs} -eq 0 ];then
    ipset create out_traffic hash:ip counters
fi
#检查是否创建iptables流入流出规则,没有生成规则
in_state=$(iptables -L INPUT|grep "in_traffic src"|wc -l)
out_state=$(iptables -L OUTPUT|grep "out_traffic dst"|wc -l)
if [ ${in_state} -eq 0 ];then
    iptables -I INPUT -m set --match-set in_traffic src
fi
if [ ${out_state} -eq 0 ];then
    iptables -I OUTPUT -m set --match-set out_traffic dst
fi
#检查连接到服务器的ip
netstat -anltpu|grep ${host_ip}|awk '{print $5}'|awk -F':' '{print $1}' > /tmp/connects.txt
sort /tmp/connects.txt |uniq > /tmp/all_ip.txt
ips=($(cat /tmp/all_ip.txt))
#检查连接到服务器的ip是否加入到ipset集合,将新ip加入ipset集合
for ((i=0;i<${#ips[@]};i++))
do
    if [[ $(ipset list in_traffic|grep packets|awk '{print $1}'|grep ${ips[i]}|wc -l) -eq 0 ]];then
        ipset add in_traffic ${ips[i]}
    fi
    if [[ $(ipset list out_traffic|grep packets|awk '{print $1}'|grep ${ips[i]}|wc -l) -eq 0 ]];then
        ipset add out_traffic ${ips[i]}
    fi
done
#检查该次运行脚本时,现在没有连接服务器的ip,并在ipset集合中删除该ip
ipset_in=($(ipset list in_traffic|grep packets|awk '{print $1}'))
ipset_out=($(ipset list out_traffic|grep packets|awk '{print $1}'))
for ((i=0;i<${#ipset_in[@]};i++))
do
    if [[ $(cat /tmp/all_ip.txt|grep ${ipset_in[i]}|wc -l) -eq 0 ]];then
        ipset del in_traffic ${ipset_in[i]}
    fi
done
for ((i=0;i<${#ipset_out[@]};i++))
do
    if [[ $(cat /tmp/all_ip.txt|grep ${ipset_out[i]}|wc -l) -eq 0 ]];then
        ipset del out_traffic ${ipset_out[i]}
    fi
done
#打印新增的ip,并添加到ipset集合
printf "{\n"
printf  '\t'"\"data\":["
    for ((i=0;i<${#ips[@]};i++))
    do
        printf '\n\t\t{'
        printf "\"{#CONNECT_IP}\":\"${ips[i]}\"}"
        if [ $i -lt $[${#ips[@]}-1] ];then
                printf ','
        fi
    done
printf  "\n\t]\n"
printf "}\n"
3、在zabbix里添加模板,自动发现规则,键值按照UserParameter里面的ip.discovery填写

image.png
二、创建流量监控脚本,对已经发现的ip进行流量监控,每分钟采集一次数据,通过【进程-预定步骤-每秒更改】计算每秒流量。
1、编写流量监控脚本,将每次运行脚本的ip流量记录到文件里,通过前后两次流量记录,计算每次运行脚本的流量变化。每次运行的时候,删除两天前的流量记录文件。变量$1是输入输出,变量$2是IP地址
[root@master scripts]# cat traffic.sh
#!/bin/bash
traffic=$1
ips=$2
#清理两天前的流量记录文件
find /tmp -name in-* -mtime +2 -exec rm -f {} \;
find /tmp -name out-* -mtime +2 -exec rm -f {} \;
case ${traffic} in
    in_traffic)
        #记录ip流量到文件
        ipset list ${traffic}|grep ${ips}|awk '{print $NF}' >> /tmp/in-${ips}-$(date +%F).log
        #如果文件中记录行数超过1次,计算本次流量和上次流量的差值,否则显示差值为0
        if [[ $(cat /tmp/in-${ips}-$(date +%F).log|wc -l) -gt 1 ]];then
            in_old=$(tac /tmp/in-${ips}-$(date +%F).log|sed -n 2p)
            in_new=$(tac /tmp/in-${ips}-$(date +%F).log|sed -n 1p)
            echo $[${in_new}-${in_old}]
        else
            echo 0
        fi
        ;;
    out_traffic)
        ipset list ${traffic}|grep ${ips}|awk '{print $NF}' >> /tmp/out-${ips}-$(date +%F).log
        if [ $(cat /tmp/out-${ips}-$(date +%F).log|wc -l) -gt 1 ];then
            out_old=$(tac /tmp/out-${ips}-$(date +%F).log|sed -n 2p)
            out_new=$(tac /tmp/out-${ips}-$(date +%F).log|sed -n 1p)
            echo $[${out_new}-${out_old}]
        else
            echo 0
        fi
        ;;
esac
2、在zabbix模板里添加监控原型,其中ip地址变量已经在发现脚本中定义为:{#CONNECT_IP},流量监控脚本键值:ip.traffic[in_traffic,{#CONNECT_IP}]中,[]里第一个变量是“流量输入输出”,第二个变量是IP地址。

image.png
在“进程”中添加 【预定步骤-每秒更改】

image.png


浏览180 评论0
返回
目录
返回
首页
zabbix 4.4.4升级5.0.2(编译安装,数据库:TimescaleDB) 解决使用timescaledb的PostgreSQL内存不足问题(4.0)

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。