生产上常常会监控某些具体端口状态,下面介绍具体步骤:json
主机名 |
ip |
操做系统 |
zabbix版本 |
zabbix-server | 172.27.9.63 | Centos7.3.1611 | zabbix_server (Zabbix) 4.4.1 |
zabbix-agent | 172.27.9.65 |
Centos7.3.1611 | zabbix_agentd (daemon) (Zabbix) 4.4.1 |
1.脚本编写
windows
两个脚本,port_alert.sh为端口自发现脚本,port.conf为指定的监控端口号
bash
[root@zabbix-agent ~]# cd /etc/zabbix/script/[root@zabbix-agent script]# more port_alert.sh #/bin/bashCONFIG_FILE=/etc/zabbix/script/port.conf Check(){ grep -vE '(^ *#|^$)' ${CONFIG_FILE} | grep -vE '^ *[0-9]+' &> /dev/null if [ $? -eq 0 ] then echo Error: ${CONFIG_FILE} Contains Invalid Port. exit 1 else portarray=($(grep -vE '(^ *#|^$)' ${CONFIG_FILE} | grep -E '^ *[0-9]+')) fi}PortDiscovery(){ length=${#portarray[@]} printf "{\n" printf '\t'"\"data\":[" for ((i=0;i<$length;i++)) do printf '\n\t\t{' printf "\"{#TCP_PORT}\":\"${portarray[$i]}\"}" if [ $i -lt $[$length-1] ];then printf ',' fi done printf "\n\t]\n" printf "}\n"}port(){ Check PortDiscovery}port
[root@zabbix-agent script]# more port.conf22 80# abc 1#ebc50 3306 8080 10050 10051 3822 21 9100
注意两个脚本属主为zabbix:zabbix。
服务器
配置文件port.conf每一个端口号一行,每行的被监控端口能够有空格,空行和注释行#会被过滤。
微信
2.修改被监控端的zabbix_agent.conf配置文件,新增KEY值port.alerttcp
[root@zabbix-agent ~]# view /etc/zabbix/zabbix_agentd.confUserParameter=port.alert,/etc/zabbix/script/port_alert.sh
重启agent端zabbix服务ide
[root@zabbix-agent ~]# systemctl restart zabbix-agent
3.server端测试测试
[root@zabbix-server ~]# zabbix_get -s 172.27.9.65 -k port.alert{ "data":[ {"{#TCP_PORT}":"22"}, {"{#TCP_PORT}":"80"}, {"{#TCP_PORT}":"50"}, {"{#TCP_PORT}":"3306"}, {"{#TCP_PORT}":"8080"}, {"{#TCP_PORT}":"10050"}, {"{#TCP_PORT}":"10051"}, {"{#TCP_PORT}":"3822"}, {"{#TCP_PORT}":"21"}, {"{#TCP_PORT}":"9100"} ]}
测试成功,返回json格式的合法端口号
spa
4.新建模板,建立自动发现规则操作系统
新建模板:
新建自动发现规则:
自动发现清单中新建监控项原型:
自动发现清单中新建触发器:
添加表达式:
模板关联主机:
查看最新数据:
查看告警信息:
查看微信端告警:
查看邮件报警:
windows服务器监控端口告警;
二、建立脚本文件
在客户端新建discovertcpport.bat文件,放在c:\zabbix\目录中,内容以下:
echo off echo { echo "data":[ for /F "tokens=2 delims= " %%i IN ('netstat -anp tcp^|find /i "LISTENING"') DO for /F "tokens=2 delims=:" %%j IN ("%%i") DO echo {"{#TCP_PORT}":"%%j"}, echo {"{#TCP_PORT}":"10050"} echo ] echo }
脚本说明:
命令netstat -anp tcp ^|find /i "LISTENING" 用来查看监听状态的TCP端口;
for /F "tokens=2 delims= "表示循环输出的截取值,即每行以空格(delims= )分隔的第2段(token=2)值,以变量%%i输出;
以后以一样的循环截取出端口号并格式化输出结果;
这里的输出格式必须按JSON对象格式输出,不然报错“Value should be a JSON object”;
特别要注意最后一行没有逗号,所以单独添加一行echo {"{#TCP_PORT}":"10050"}来结束,以知足JSON对象格式。
三、修改客户端配置
在客户端的zabbix_agentd.conf中添加如下内容:
UnsafeUserParameters=1 UserParameter=tcpportlisten,c:\zabbix\discovertcpport.bat
说明:第一条表示容许使用用户自定义参数,第二条设置用户参数,名称tcpportlisten是自定义的KEY名,后接KEY要执行的命令或脚本文件。
从新启动zabbix agentd服务
客户端测试
以管理员身份运行CMD,cd到c:\zabbix目录,输入脚本文件名,回车:
说明:上图是在我笔记上测试的,扫描出的端口并不是监控主机10.188.1.44的。
JSON格式说明:#TCP_PORT是变量名称,后面的数值是变量的值。
五、服务端测试
[root@zabbix ~]# zabbix_get -s 10.32.11.158 -k tcpportlisten
说明:能够看到监控主机扫描出的端口中已有10050,而我在后面添加了一个10050,没关系,接着往下看。