Zabbix实现自动发现端口并监控

本文详细介绍如何使用Zabbix实现自动发现并监控Linux系统上的端口。从编写客户端脚本开始,逐步介绍如何配置Zabbix代理,添加自动发现规则及触发器原型,最终实现端口状态的实时监控。

Zabbix实现自动发现端口并监控

1、新建客户端需要的脚本

# vim discover_tcp_port.sh

#!/bin/bash
portarray=(`sudo netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`)
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"

2、客户端增加discovery的key和sudoers添加netstat

UserParameter=tcpportlisten,/usr/local/zabbix_agent/sbin/discover_tcp_port.sh "$1"

zabbix   ALL = NOPASSWD: /usr/sbin/asterisk,/bin/netstat

3、重启zabbix_agentd服务

# /etc/init.d/zabbix_agentd restart

4 、服务端测试

# /usr/local/zabbix/bin/zabbix_get -s 192.168.0.111 -k tcpportlisten
{
"data":[
{"{#TCP_PORT}":"10050"},
{"{#TCP_PORT}":"22"},
{"{#TCP_PORT}":"80"}
]
}

返回类似以上内容即为正常

5、在Linux模板中创建端口自动发现规则

然后创建项目原型

此处要确实注意端口变量{#TCP_PORT}名称要与上面脚本中的保持一致。

再创建触发器原型

到此,监控端口已经完成。

-------------------------------------------------------

可能遇到的问题:

1 、 执行脚本的时候发现提示  Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) 应该是没权限的意思,

2  、添加完自动发现规则之后,提示  Value should be a JSON object 这个错误

解决办法是 vim /etc/sudoers

#Defaults    requiretty  注释掉这个

zabbix  ALL=(ALL)      NOPASSWD: ALL 添加此行

 

然后在上面的脚本里面加上sudo netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq

--------------------------------------------

附:tomcat端口监控脚本

复制代码

#!/bin/bash
sudo netstat -tnlp|grep "java"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq >/tmp/tomcat
portarray=(`sudo grep "^$1$" /tmp/tomcat`)
length=${#portarray[@]}
printf "{\n"
printf  '\t'"\"data\":["
for ((i=0;i<$length;i++))
  do
     printf '\n\t\t{'
     printf "\"{#TOMCAT_PORT80}\":\"${portarray[$i]}\"}"
     if [ $i -lt $[$length-1] ];then
                printf ','
     fi
  done
printf  "\n\t]\n"
printf "}\n"

复制代码

 

UserParameter=tomcat_port8080[*],/etc/zabbix/monitor_scripts/discover_tomcat8080.sh $1

#  zabbix_get -s 172.17.213.62 -k tomcat_port8080[8080]

{
"data":[
{"{#TOMCAT_PORT8081}":"8081"}
]
}

### 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) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值