生产上经常会监控某些具体端口状态,下面介绍具体步骤:


主机名
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.脚本编写

两个脚本,port_alert.sh为端口自发现脚本,port.conf为指定的监控端口号

[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.alert

[root@zabbix-agent ~]# view /etc/zabbix/zabbix_agentd.confUserParameter=port.alert,/etc/zabbix/script/port_alert.sh

重启agent端zabbix服务

[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格式的合法端口号


4.新建模板,创建自动发现规则

新建模板:

Zabbix监控指定端口;_第1张图片

新建自动发现规则:

Zabbix监控指定端口;_第2张图片

自动发现清单中新建监控项原型:

Zabbix监控指定端口;_第3张图片

自动发现清单中新建触发器:

Zabbix监控指定端口;_第4张图片

添加表达式:

Zabbix监控指定端口;_第5张图片

模板关联主机:

Zabbix监控指定端口;_第6张图片

查看最新数据:

Zabbix监控指定端口;_第7张图片

查看告警信息:

Zabbix监控指定端口;_第8张图片

查看微信端告警:

Zabbix监控指定端口;_第9张图片

查看邮件报警:

Zabbix监控指定端口;_第10张图片





windows服务器监控端口告警;


2、创建脚本文件

在客户端新建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对象格式。


3、修改客户端配置


在客户端的zabbix_agentd.conf中添加以下内容:


UnsafeUserParameters=1

UserParameter=tcpportlisten,c:\zabbix\discovertcpport.bat


说明:第一条表示允许使用用户自定义参数,第二条设置用户参数,名称tcpportlisten是自定义的KEY名,后接KEY要执行的命令或脚本文件。

重新启动zabbix agentd服务


客户端测试


以管理员身份运行CMD,cd到c:\zabbix目录,输入脚本文件名,回车:


Zabbix监控指定端口;_第11张图片


说明:上图是在我笔记上测试的,扫描出的端口并非监控主机10.188.1.44的。

JSON格式说明:#TCP_PORT是变量名称,后面的数值是变量的值。


5、服务端测试

[root@zabbix ~]# zabbix_get -s 10.32.11.158 -k tcpportlisten

Zabbix监控指定端口;_第12张图片


说明:可以看到监控主机扫描出的端口中已有10050,而我在后面添加了一个10050,不要紧,接着往下看。