zabbix 自动发现监控端口

本文介绍如何在Zabbix中实现服务端口的自动发现与监控,通过编写shell脚本来收集服务器上所有开放的TCP端口,并将其配置为Zabbix Agent的自定义参数,最后在Zabbix Server上创建自动发现规则进行监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有些服务器上开启的服务端口非常多  如果一个个添加监控会很繁琐,于是想到了自动发现规则  自动发现服务器上的服务端口并进行监控。

一、配置脚本

1.在被监控的服务器上创建自动发现端口脚本,存放在/etc/zabbix/script:

[root@centos6 script]# vim /etc/zabbix/script/discovery_tcpport.sh

#!/bin/bash
portarray=(`ss -tnlp |awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`)
length=${#portarray[@]}

function zabbix_json(){
  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"
}

function check(){
  #ss -tnlp |grep 'users' |awk -F ':' "/:$1/ {print \$NF}" |cut -d',' -f1 |sed 's@[(,"]@@g' |uniq
  ss -tnlp |grep 'users' |awk -F ':' "/:$1/ {print \$NF}" |grep -oE '\".*\"' |sort  |uniq |head -n1 |sed 's/"//g' |awk -F ',' '{print $1}'
}

[[ $1 = check ]] \
  && $* \
  || zabbix_json

[root@centos6 script]# chown zabbix.zabbix discovery_tcpport.sh 

[root@centos6 script]# chmod a+x discovery_tcpport.sh

2.本地测试脚本

[root@centos6 script]# ./discovery_tcpport.sh   
{
        "data":[
                {"{#TCP_PORT}":"10050"},
                {"{#TCP_PORT}":"22"},
                {"{#TCP_PORT}":"3306"},
                {"{#TCP_PORT}":"80"}
        ]
}

二、修改zabbix客户端配置文件,增加参数

1.修改配置文件,增加参数

[root@centos6 zabbix_agentd.d]# vim /etc/zabbix/zabbix_agentd.d/userparameter_sa_linux.conf

UserParameter=discovery.tcpport[*],/etc/zabbix/script/discovery_tcpport.sh $1 $2

2.重启zabbix客户端

[root@centos6 script]# service zabbix-agent restart
Shutting down Zabbix agent:                                [  OK  ]
Starting Zabbix agent:                                     [  OK  ]

 三、服务端测试连通

在zabbix-server端,使用zabbix_get命令来获取agent端的脚本参数:

[root@centos6 ~]# zabbix_get -s 192.168.10.137 -k discovery.tcpport
{
        "data":[
                {"{#TCP_PORT}":"10050"},
                {"{#TCP_PORT}":"22"},
                {"{#TCP_PORT}":"3306"},
                {"{#TCP_PORT}":"80"}
        ]
}

 四、添加自动发现规则

1.创建发现规则

在自建或已有模板中创建自动发现规则:

2.配置发现规则名称

3.配置监控项原型

4.配置触发器

创建完成

五、进行测试

在agent服务器中,用nginx开启新的端口8080服务

[root@centos6 conf.d]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:10050               0.0.0.0:*                   LISTEN      26909/zabbix_agentd 
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      1356/mysqld         
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      11462/nginx         
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      11462/nginx         
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1578/sshd           
tcp        0      0 :::10050                    :::*                        LISTEN      26909/zabbix_agentd 
tcp        0      0 :::22                       :::*                        LISTEN      1578/sshd           

 在监控页面上可以看到新端口已经添加进来并监控了

现在把端口8080关闭,则出现端口断开警告:

### Zabbix 实现端口自动发现并配置监控与报警 #### 1. 端口自动发现原理 Zabbix自动发现功能可以通过定义低级发现规则 (Low-Level Discovery, LLD) 来动态检测目标主机上的开放端口。LLD 是一种机制,允许管理员创建可重复使用的模板来扫描特定服务或资源[^2]。 当启用端口自动发现时,Zabbix 使用内置脚本 `net.tcp.discovery` 或自定义脚本来探测指定范围内的 TCP 端口状态。一旦发现新的端口处于打开状态,它会将其注册到 Zabbix 数据库中,并应用预设的监控项和触发器。 #### 2. 配置端口自动发现的具体步骤 以下是基于官方文档的最佳实践指南: ##### 创建低级发现规则 进入 **Configuration → Templates**, 添加一个新的模板或者编辑现有的模板,在 “Discovery rules” 菜单下点击 “Create discovery rule”。 - 名称:输入描述性的名称,例如 `"TCP Port Discovery"`。 - 类型:选择 `Simple check`。 - 键名:设定为标准键值 `{#PORT}` 或者使用默认的 `net.tcp.discovery`。 - 更新间隔:建议设置合理的轮询周期(如每分钟一次),即 `60s`。 - 发现条件:如果仅需查找某些类型的端口,则可以在此处添加过滤表达式;否则留空即可全面扫描所有可能的服务端口。 ##### 定义原型项目 在同一页面下方找到 “Items to create”,这里需要至少包含两个基本元素——一个是用于测试连接可用性的布尔型指标,另一个则是记录响应时间的实际数值测量单位毫秒(ms): - 测试连通性 (`tcp_port_status`): ```bash net.tcp.service.perf[{#SERVICE},<host>] ``` - 响应延迟(`tcp_response_time`) : ```bash net.tcp.ping[<port>,<timeout>] ``` 注意替换 `<host>` 和 `<port>` 参数为你实际的目标地址以及对应的侦测端口号变量 {#PORT}. 对于每一个匹配成功的实例都会依据上述模版生成具体的监测条目。 ##### 设置告警阈值 继续向下滚动至 "Triggers to create", 这里应该建立若干逻辑判断语句用来评估当前状况是否正常: 比如我们可以这样写: ```plaintext {Template App Netstat:net.tcp.listen[{HOSTNAME},{#PORT}].last()}=0 and {Template App Netstat:net.tcp.connect[{HOSTNAME},{#PORT}].avg(5)}>50ms ``` 这条指令的意思就是说只要某个本地监听端口突然关闭而且平均访问耗时超过五十毫秒就发出警告信号. 最后保存更改并将此定制化后的模板关联至待管理节点上完成整个部署流程。 #### 3. 示例代码片段 下面给出一段简单的 Python 脚本作为替代方案之一执行相似的任务操作过程演示效果如下所示: ```python import socket from time import sleep def scan_ports(ip_address,start,end): open_ports = [] for port in range(start,end+1): try: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) result=s.connect_ex((ip_address,port)) if not result: print(f'Port {port}: Open') open_ports.append(port) else: pass s.close() except Exception as e: continue return open_ports if __name__=='__main__': ip='your_target_ip' start_port=int(input('Enter starting port number:\n')) end_port=int(input('Enter ending port number:\n')) while True: discovered_ports=scan_ports(ip,start_port,end_port) # Send results back to Zabbix server via userparameter or similar method. sleep(60*interval_in_minutes) ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值