文章总结: 文章介绍了夜莺开源社区开发的SNMP_Zabbix插件,该插件能够直接使用Zabbix的YAML格式模板进行SNMP数据采集,支持自动发现机制和多种数据预处理方式,适合从Zabbix迁移到夜莺或Prometheus生态的场景。目前插件仅支持Zabbix6.0+的YAML格式模板,对7.0+模板兼容性存在问题,且不能完全支持Zabbix的所有功能,需要修改模板才能达到理想效果。
综合评分: 86
文章分类: 网络安全,安全工具,IoT安全,解决方案,安全建设
网络监控:夜莺采集插件加载 Zabbix 生态模版实现大批量 SNMP 设备监控告警
原创
小斐Lab
网络小斐
2025年11月27日 14:59
美国
大家好,我是小斐呀。
前面分享了很多使用 Categraf 下原生 SNMP 插件采集网络设备的指标的最佳实践,相信加入星球的道友们已经体验并用在生产实践中。
由于原生 SNMP 插件采集配置都需要自行编写,由于从零开始写有点复杂,当然大家别怕大部分的品牌的配置我已经适配好,模版都放在星球网盘之中,也算是直接提供开箱即用的配置和可视化模版,减轻各位道友工作量了。
最近夜莺开源社区在 Categraf 项目下新增了 SNMP_Zabbix 插件,顾名思义这个插件就是兼容 Zabbix 采集模板的 SNMP 数据采集插件,其最大特色是能够直接使用 Zabbix 的 YAML 格式模板文件。这意味着您可以利用 Zabbix 丰富的模板生态系统,无需重新编写监控配置(如果需要用的好,还是需要稍微做一些调整工作)。
接下来,我将用几个篇幅和最佳实践来展开聊聊这个插件的细节,同时我也会继续慢慢提供写好的全套模版,实现开箱即用和可视化模版的套用。
插件对比
Categraf 下原生 SNMP 插件和最新的 SNMP_Zabbix 插件有一些特性上的区别:
| 特性 | SNMP_Zabbix 插件 | Categraf 原生 SNMP 插件 |
| — | — | — |
| 配置方式 | Zabbix 模板 + 简单配置 | 手动编写每个 OID采集配置 |
| 自动发现 | 支持 LLD(低级别发现) | 需手动配置 |
| 预处理 | 支持 20+ 种预处理方式 | 基本数值转换 |
| 模板复用 | 可直接使用 Zabbix 模板库 | 需从零开始(我提供了一批) |
| 配置复杂度 | 低(使用现成模板) | 高(逐个配置) |
| 动态监控项 | 支持(通过发现规则) | 不支持 |
SNMP_Zabbix 插件主要有如下功能:
- 完整的
SNMP协议支持:支持SNMPv1、SNMPv2c、SNMPv3所有版本 Zabbix模板兼容:直接使用Zabbix 6.0+的YAML格式模板- 自动发现机制:自动发现网络接口、文件系统等资源并动态创建监控项
- 强大的预处理:支持正则表达式、
JavaScript、数值计算等多种数据预处理方式 - 精细化的调度:支持
item粒度调度采集任务 - 健康检查与自动恢复:自动检测连接状态并重连
上面介绍那么多,在实际场景中什么情况下需要用到这个插件呢,我们又如何可以更好的用这个插件呢,有如下情况的可以使用?
- 之前使用
Zabbix监控网络设备,希望迁移到夜莺生态或者Prometheus生态之中走可观测性指标模式 - 希望复用
Zabbix社区生态丰富的模版资源,并且需要监控大量网络设备(交换机、路由器、防火墙、无线等) - 需要动态发现和监控变化的资源(如网络接口) 需要对采集数据进行复杂预处理
Zabbix生态割裂现在更多的用在网络设备服务器等硬件监控上,希望采集指标从底层(硬件)到上层(应用)形式都统一
Zabbix 模版通常有三种格式文件 YAML 格式、 XML 格式、 JSON 格式,这些格式都是 Zabbix 版本不断在发展后慢慢根据实际需求支持的:
| 模板格式 | 支持版本 | 特点 |
| — | — | — |
| XML | Zabbix 1.x ~ 当前版本 | 最老最常用,兼容性最佳 |
| YAML | Zabbix 5.2 起 | 现代方式,便于 GitOps/DevOps |
| JSON | Zabbix 6.0 起 | 结构清晰,适合程序生成和新 agent2 插件 |
目前 SNMP_Zabbix 插件只支持 YAML 格式模板,如果你的模版文件是 XML 格式的话,可以通过 Zabbix 进行导入和导出生成转换为 YAML 格式,如下所示:
模板文件格式转换(XML to YAML)
- 把
XML模板导入Zabbix - 重新导出为
YAML格式的模板
更加详细模版导入导出步骤可查看:
https://www.zabbix.com/documentation/current/zh/manual/xml_export_import/templates
除此之外这个插件在使用还有一些限制和依赖:
Categraf版本:开源版 >=v0.4.24企业版 >=v0.4.40- 网络要求:能够访问目标
SNMP设备的UDP(默认161) 端口 - 目标设备:启用
SNMP服务的网络设备或服务器或打印机等等 - 模板要求:
Zabbix 6.0+及以上的YAML格式模板(不支持旧版XML格式)
模版获取
既然这个 SNMP_Zabbix 插件就是读取 YAML 模版文件,那么首先需要在 Zabbix 社区中找到符合我们需求的 YAML 模版才行,这里我们展开列举如何获取模版的途径:
如果已经有安装 Zabbix 系统,可以通过导入和导出的方式拿到模版文件:
- 从安装好的
Zabbix中导出需要的内置模版 - 使用官方或社区提供的模板
模版文件导出有多种方式,可以登录 Zabbix Web 界面选择对应的模版导出,可以通过 Zabbix API 导出,还可以去 Zabbix Git 仓库中寻找。
https://github.com/zabbix/zabbix/tree/master/templates/
通过这些 YAML 模版可以知道模版中的一些基础信息,而我们知道一个 Zabbix 模版中有很多对象,而 SNMP_Zabbix 插件并不是支持 Zabbix 模版中所有对象,主要支持 Zabbix 的模版中这几个对象:
- 监控项(
Items) - 触发器(
Triggers) - 发现规则(
Discovery rules) - 值映射(
Value mapping) - 图形(
Graphs) - 仪表盘(
Dashboards) - 宏变量(
macros)
主要就是如下内容,其他都是一些附加内容,什么模版组、标签、主机群组、Web监控等等。
而在 SNMP_Zabbix 插件中主要读取和处理的对象如下三项:
- 监控项(
Items) - 发现规则(
Discovery rules) - 宏变量(
macros)
不管模版中有什么其他的对象,在使用 SNMP_Zabbix 插件时只处理上面的三个对象。
监控架构
既然是使用 Categraf 采集器,那么使用 SNMP_Zabbix 插件也还是围绕夜莺生态来做,看下使用这个插件的单体架构:
最主要的就是模版文件,但也不是所有的模版文件都是可以全面套用的,有时候为了规范需要修改 YAML 模版文件,下面我们来看看华为交换机的 YAML 模版文件是如何利用 SNMP_Zabbix 插件加载采集指标的。
安装部署好 Categraf 开源版,版本必须 >= v0.4.24 同时模版并不需要 mib 文件依赖,都是直接读取数值型 OID 得到对应指标值。
下面使用华为的 Zabbix 的 YAML 模版做一下测试。
首先我们需要下载模版文件,这里以下载 6.0 版本 YAML 模版,放在文件如下文件路径中:
# 模版文件路径
/opt/categraf/templates/huawei/template_net_huawei_snmp.yaml
配置 Categraf 下的 conf/input.snmp_zabbix 中的 zabbix.toml 配置文件,配置文件如下所示:
[[instances]]
agents=[
"udp://172.16.10.1",
"udp://172.16.10.2"
]
community="public"
version=2
timeout="5s"
retries=3
unconnected_udp_socket=true
template_files=[
"/opt/categraf/templates/huawei/template_net_huawei_snmp.yaml"
]
配置文件完整信息:
[[instances]]
# 基础标签
labels={region="beijing",env="production"}
# SNMP 连接配置
agents=[
"192.168.1.0/24", # 扫描整个网段
"core-switch.example.com" # 域名
]
version=2
community="public"
port=161
timeout="5s"
retries=3
max_repetitions=25
# 加载多个模板(会自动合并)
template_files=[
"/etc/categraf/templates/cisco_catalyst.yaml",
"/etc/categraf/templates/custom_oids.yaml"
]
# 设备映射标签
[instances.mappings]
"192.168.1.1"={device_name="core-sw-01",location="DC1"}
"192.168.1.2"={device_name="core-sw-02",location="DC2"}
如果开启 SNMP v3 认证:
[[instances]]
# 基础标签
labels={region="beijing",env="production"}
# SNMP 连接配置
agents=[
"192.168.1.0/24", # 扫描整个网段
"core-switch.example.com" # 域名
]
version=3
username="snmpv3user"
security_level="authPriv"
auth_protocol="SHA"
auth_password="authpass123"
priv_protocol="AES"
priv_password="privpass456"
port=161
timeout="5s"
retries=3
max_repetitions=25
# 加载多个模板(会自动合并)
template_files=[
"/etc/categraf/templates/cisco_catalyst.yaml",
"/etc/categraf/templates/custom_oids.yaml"
]
# 设备映射标签
[instances.mappings]
"192.168.1.1"={device_name="core-sw-01",location="DC1"}
"192.168.1.2"={device_name="core-sw-02",location="DC2"}
测试启动:
# 测试输出指标
/opt/categraf/categraf --test --debug --inputs snmp_zabbix
测试下来发现指标很少,这是由于插件支持的功能和模版并不能完全保持一致,如果需要得到想要的,我们还需要对模版下功夫,调整模版然后采集。
最终在夜莺中得到的指标如下:
snmp_system_cpu_util{component="cpu", ident="alert", index="hwEntityCpuUsage.67108873", item="MPU Board 0: CPU utilization", item_key="system.cpu.util[hwEntityCpuUsage.67108873]", oid="1.3.6.1.4.1.2011.5.25.31.1.1.1.1.5.67108873", plugin="snmp_zabbix", snmp_agent="udp://172.17.14.12:161", snmp_host="172.17.14.12", system_hw_serialnumber="2198010XXXXXX4602201", system_hw_version="VER.B", system_sw_os="Version 5.170 V200R022C00SPC500"} 10
发现得到的指标标签很乱,我们需要对标签做裁剪,同时直接利用模版采集的指标也不全:
综合上面的结果可以看到目前插件还不是很好用,有以下缺陷:
- 目前版本只支持
Zabbix 6.0+模版,对Zabbix 7.0+模版兼容性还有点问题,还需要进一步修复 - 模版并不能开箱即用,有时候为了达到我们想要的指标和标签效果需要对
YAML进行修改 - 并不是完全支持 Zabbix 的所有功能,目前支持的功能如下
| 功能 | 支持情况 | 说明 |
| — | — | — |
| Items | ✅ 部分支持 | 仅 SNMP 类型 |
| Discovery | ✅ 支持 | 完整支持 |
| Triggers | ❌ 不支持 | 插件不处理告警 |
| Graphs | ❌ 不支持 | 忽略图表定义 |
| Dashboards | ❌ 不支持 | 忽略仪表板 |
| Actions | ❌ 不支持 | 不执行动作 |
| Trends | ❌ 不支持 | 不存储趋势数据 |
| Events | ❌ 不支持 | 不生成事件 |
这个比原生的 SNMP 插件好用的一点是支持 LLD 而且对应 OID 的采集周期可以单独定义,但是建议如果是指标类还是建议在 60s 内,这样在做 Time Series 的时候不至于出现间隔太久,步长太长,而出现数据断点的现象出现。
注意:
Zabbix 6.0+ 模版下的 item 下的 snmp_oid 是直接写裸 oid 数值,而对 Zabbix 7.0+ 模版 item 下的 snmp_oid 不在是纯粹的裸 oid 而是变成如下模式:
# zabbix 6.0+
snmp_oid: 1.3.6.1.2.1.25.1.1.0 # 原始 item
snmp_oid: '1.3.6.1.4.1.2011.5.25.31.1.1.10.1.7.{#SNMPINDEX}' # 基于自动发现创建的 item
# zabbix 7.0+
snmp_oid: 'get[1.3.6.1.2.1.25.1.1.0]' # 原始 item
snmp_oid: 'get[1.3.6.1.4.1.2011.5.25.31.1.1.10.1.7.{#SNMPINDEX}]' # 基于自动发现创建的 item
可以看到写 snmp_oid 语法格式有所变化了,故 SNMP_Zabbix 插件对新版本的采集兼容还需要修复,从 纯 OID 变成了 函数式 OID 。
get[]walk[]discover[]
这是 Zabbix 7.x 开始 SNMP 模板采用标准化的 函数式 OID 写法。
后续展望
目前来看改插件用在生产上还有待加强和修复,并且还不能完全做到开箱即用的地步,如果需要做到符合自定义采集的数据,对模版还需要修修改改,等于是 SNMP_Zabbix 插件功能上需要加强,在没有加强的情况下那就需要修改模版以适配 SNMP_Zabbix 插件支持的一些采集格式即可。
- 新版本的
snmp_oid语法已经提交,这个问题应该后续会修复 - 针对
Item和Discovery更多的语法支持可以深入
等后续插件基本满足开箱即用的地步后,我们只需要调整需要哪些指标和指标中需要哪些标签插入进去的节奏,就基本上符合需求,敬请期待,我也将以几个篇幅介绍如何深入使用,模版和功能之间的调整和细微支持差别。
end
针对这块的有需求或者想沟通交流,可以加入之前建立的群,到群里咨询或交流即可,加群可公众号后台私信加我,我拉你进群。
📣欢迎朋友们关注公众号📢📢:【网络小斐】!
🙋♂️有想法的朋友也可以加我沟通,朋友🔘做个点赞之交!😂😂
欢迎点赞 👍、收藏 💗、关注 💡 三连支持一下,我们下期见~✨
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:网络小斐 小斐Lab《网络监控:夜莺采集插件加载 Zabbix 生态模版实现大批量 SNMP 设备监控告警》