zabbix自动发现端口并监控报警
时间: 2025-03-25 22:13:26 浏览: 50
### 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)
```
阅读全文
相关推荐








