Zabbix 模板实战:用 SNMP 全面监控 MikroTik CRS112-8P-4S-IN 交换机

原创2026-10-08 21:40:101,826 阅读
文章标签:可观测性运维指标监控告警异常检测

Zabbix 模板实战:用 SNMP 全面监控 MikroTik CRS112-8P-4S-IN 交换机

本篇技术指南以 Zabbix 官方模板库中的 MikroTik CRS112-8P-4S-IN by SNMP 模板为核心,系统讲解如何基于 SNMP 对这款带 PoE 供电的千兆智能交换机进行全维度监控,包括主机与接口发现、CPU/内存/存储、温度传感器、LTE 调制解调器与无线 AP 信道等能力。读完本文,你将掌握该模板的宏变量体系、监控项与触发器机制、低级别自动发现(LLD)规则的工作原理,并能参照仓库中的模板定义(README 与 YAML 模板文件)快速完成接入与调优。

模板概览与适用场景

该模板用于监控 MikroTik CRS112-8P-4S-IN 交换机,硬件特征为:8 口千兆以太网智能交换机(带 PoE-out)、4 个 SFP 笼、400MHz CPU、128MB RAM、桌面型外壳、RouterOS L5。模板归属于 Templates/Network devices 模板组,模板名称为 MikroTik CRS112-8P-4S-IN by SNMP。

从 YAML 模板定义 的 description 字段可以看到,模板实际依赖四类 MIB:

  • HOST-RESOURCES-MIB:用于 CPU、内存、文件系统的监控与发现;
  • SNMPv2-MIB:用于系统名称、描述、位置、联系人与运行时间等基础信息;
  • MIKROTIK-MIB:MikroTik 私有 MIB,提供软件版本、固件、序列号、温度传感器、LTE 调制解调器、无线 AP 等特有对象;
  • IF-MIB:用于网络接口的发现与流量、状态、错误统计。

模板由官方 Zabbix 模板生成工具 "Templator" 生成(见 YAML 的 Generated by official Zabbix template tool "Templator" 说明),因此其结构与 Zabbix 官方模板库中的其他 MikroTik 设备模板保持一致。

环境要求与部署准备

  • Zabbix 版本:8.0 及以上(YAML 导出头为 zabbix_export: version: '8.0')。
  • 测试版本:官方在 MikroTik CRS112-8P-4S-IN 实机上测试通过。
  • 设备端:需在 RouterOS 中启用 SNMP 服务并配置好 community 字符串,同时允许 Zabbix Server 通过 ICMP 探测该设备(模板内置 ICMP ping 监控项);具体 SNMP 开启步骤以 MikroTik 厂商文档为准。
  • 接入方式:在 Zabbix 前端"数据采集 → 模板"中导入模板(YAML 文件路径见上文),将模板链接到对应主机,并为主机配置 SNMP 接口(端口 161)与 community。

模板兼容性参考:在仓库的通用 MikroTik by SNMP 模板 README 中记录了若干已知问题,同样适用于此类 SNMP 采集架构——例如 RouterOS 6.28 及以下版本不填充 ifHighSpeed 对象,可能导致接口带宽类触发器失真;部分型号(如 941-2nD、951G-2HnD 的 RouterOS 6.38.5)不提供任何温度传感器。因此本文所涉及的 CPU/设备温度、LTE 信号等 LLD 发现规则是否产生监控项,取决于实机固件是否暴露对应 OID。

宏变量体系:阈值与过滤器的一站式调参

模板通过一组用户宏(User macros)集中控制告警阈值与发现规则过滤器,全部 35 个宏均可在主机或模板链接层级覆盖(宏定义细节可查看 YAML 宏段落)。

阈值类宏

宏 说明 默认值
{$VFS.FS.PUSED.MAX.CRIT} 文件系统使用率严重(critical)阈值 90
{$VFS.FS.PUSED.MAX.WARN} 文件系统使用率警告(warning)阈值 80
{$CPU.UTIL.CRIT} CPU 使用率严重阈值(%) 90
{$TEMP_CRIT} 温度严重阈值 60
{$TEMP_CRIT_LOW} 低温严重阈值 5
{$TEMP_WARN} 温度警告阈值 50
{$TEMP_CRIT:"CPU"} CPU 温度严重阈值(带上下文) 75
{$TEMP_WARN:"CPU"} CPU 温度警告阈值(带上下文) 70
{$MEMORY.UTIL.MAX} 内存使用率上限阈值(%) 90
{$LTEMODEM.RSSI.MIN.WARN} LTE RSSI 警告下限 -100
{$LTEMODEM.RSRP.MIN.WARN} LTE RSRP 警告下限 -100
{$LTEMODEM.RSRQ.MIN.WARN} LTE RSRQ 警告下限 -20
{$LTEMODEM.SINR.MIN.WARN} LTE SINR 警告下限 0
{$ICMP_LOSS_WARN} ICMP 丢包率警告阈值(%) 20
{$ICMP_RESPONSE_TIME_WARN} 平均 ICMP 响应时间警告阈值(秒) 0.15
{$IFCONTROL} 仅当上下文宏等于 "1" 时触发链路状态告警 1
{$IF.UTIL.MAX} 接口带宽利用率阈值 90
{$IF.ERRORS.WARN} 错误包速率警告阈值(可带接口名上下文) 2

过滤器类宏

宏 说明 默认值
{$IFNAME.WIFI.MATCHES} CAPsMAN AP 信道发现中的接口名匹配正则,可在主机层覆盖 WIFI
{$IFNAME.LTEMODEM.MATCHES} LTE 调制解调器发现的接口名匹配正则,可在主机层覆盖 ^lte
{$NET.IF.IFNAME.MATCHES} 网络接口发现包含过滤器 ^.*$
{$NET.IF.IFNAME.NOT_MATCHES} 排除 loopback、null、docker veth 与 docker0 桥接等(YAML 中的实际正则较长,见模板) 见模板文件
{$NET.IF.IFOPERSTATUS.MATCHES} 接口运行状态包含过滤器 ^.*$
{$NET.IF.IFOPERSTATUS.NOT_MATCHES} 忽略 notPresent(6) 状态 ^6$
{$NET.IF.IFADMINSTATUS.MATCHES} 接口管理状态包含过滤器 ^.*
{$NET.IF.IFADMINSTATUS.NOT_MATCHES} 忽略 down(2) 管理状态 ^2$
{$NET.IF.IFDESCR.MATCHES} / NOT_MATCHES 按接口描述包含/排除 .* / CHANGE_IF_NEEDED
{$NET.IF.IFALIAS.MATCHES} / NOT_MATCHES 按接口别名包含/排除 .* / CHANGE_IF_NEEDED
{$NET.IF.IFTYPE.MATCHES} / NOT_MATCHES 按接口类型包含/排除 .* / CHANGE_IF_NEEDED

其他宏

宏 说明 默认值
{$SNMP.TIMEOUT} SNMP 可用性触发器的判定时间窗 5m
{$SNMP.UPTIME.WARN} "主机已重启"问题自动恢复所需的上电时间阈值 10m

关于上下文宏的说明:{$TEMP_CRIT:"CPU"}、{$TEMP_WARN:"CPU"} 以及触发器表达式中出现的 {$TEMP_CRIT:"Device"}、{$TEMP_WARN:"Device"}、{$TEMP_CRIT_LOW:"Device"} 属于 Zabbix 的上下文宏机制。模板只为 "CPU" 上下文定义了独立默认值(75/70),"Device" 上下文未单独定义时会回退到基础宏默认值(60/50/5)。若你希望设备温度与 CPU 温度采用不同阈值,可在主机或模板层分别定义 {$TEMP_CRIT:"Device"} 等宏。

监控项体系:从系统基础信息到连通性

模板内置 24 个常规监控项(完整定义见 README Items 小节 与 YAML 对应段落),按功能可划分为以下几组。

系统与硬件信息

监控项名称 键值 类型 预处理要点
Operating system system.sw.os[mtxrLicVersion.0] SNMP agent 不变即丢弃,心跳 1d;MIKROTIK-MIB 软件版本,映射到资产 OS 字段
Hardware model name system.hw.model SNMP agent 不变即丢弃,心跳 1d;映射到资产 MODEL 字段
Hardware serial number system.hw.serialnumber SNMP agent 不变即丢弃,心跳 1d;RouterBOARD 序列号,映射到资产 SERIALNO_A
Firmware version system.hw.firmware SNMP agent 不变即丢弃,心跳 1d
Uptime (network) system.net.uptime[sysUpTime.0] SNMP agent 自定义乘数 0.01(将百分之一秒换算为秒);SNMPv2-MIB
Uptime (hardware) system.hw.uptime[hrSystemUptime.0] SNMP agent 先做"不支持值检查,失败置 0",再乘 0.01;HOST-RESOURCES-MIB
System name / description / location / contact / object ID system.name 等 SNMP agent 不变即丢弃,心跳 12h;SNMPv2-MIB,name/location/contact 分别映射到资产 NAME/LOCATION/CONTACT

其中 system.hw.uptime 与 system.net.uptime 分别对应 HOST-RESOURCES-MIB 的 hrSystemUptime.0(硬件初始化以来的时间)与 SNMPv2-MIB 的 sysUpTime.0(网络管理部分重启以来的时间),二者配合用于可靠判断"主机重启"(详见触发器章节)。

内存与资源

监控项名称 键值 类型 预处理要点
Used memory vm.memory.used[hrStorageUsed.Memory] SNMP agent 自定义乘数 1024,单位 B
Total memory vm.memory.total[hrStorageSize.Memory] SNMP agent 自定义乘数 1024,单位 B
Memory utilization vm.memory.util[memoryUsedPercentage.Memory] Calculated 表达式 last(//vm.memory.used)/last(//vm.memory.total)*100,单位 %

内存数据来自 HOST-RESOURCES-MIB 的 hrStorage 表(内存对应的存储索引为 65536)。由于 hrStorageUsed/hrStorageSize 的单位是 hrStorageAllocationUnits(分配单元,通常为 KB),所以先乘 1024 得到字节数,再用计算项换算为百分比。

连通性(ICMP + SNMP 可用性)

监控项名称 键值 类型 说明
SNMP agent availability zabbix[host,snmp,available] Zabbix internal 0=不可用、1=可用、2=未知,映射 zabbix.host.available
ICMP ping icmpping Simple check 0=失败、1=成功,映射 Service state
ICMP loss icmppingloss Simple check 丢包百分比,单位 %
ICMP response time icmppingsec Simple check 平均响应时间,单位 s

SNMP 采集基座(walk 项)

监控项名称 键值 类型 说明
Mikrotik: SNMP walk network interfaces net.if.walk SNMP agent 对 IF-MIB 的 13 个 OID 做 walk,产出 JSON 供接口类依赖项与发现规则使用
SNMP walk wireless interfaces net.if.wireless.walk SNMP agent 对无线接口、LTE 调制解调器、AP 相关共 17 个 OID 做 walk
SNMP walk system CPUs system.cpu.walk SNMP agent HOST-RESOURCES-MIB,发现系统 CPU
SNMP walk mounted filesystems vfs.fs.walk SNMP agent HOST-RESOURCES-MIB,发现挂载的文件系统
SNMP traps (fallback) snmptrap.fallback SNMP trap 收集未被其他 snmptrap 项匹配的全部 SNMP trap

这些 walk 项以 history: '0'、value_type: TEXT 的方式存放原始 JSON,是模板依赖项(Dependent item)架构的基座:后续 LLD 规则与原型监控项大多通过 SNMP walk to JSON / SNMP walk value 预处理从这些 JSON 中取数,从而用少量 SNMP 请求承载大量监控项。

触发器体系:可用性、变更与性能告警

模板内置 11 个常规触发器(表达式原文见 README Triggers 小节),并大量使用依赖关系避免告警风暴:

触发器 表达式要点 级别 依赖/说明
Unavailable by ICMP ping max(/…/icmpping,#3)=0 High 最近三次探测全部超时
No SNMP data collection max(/…/zabbix[host,snmp,available],{$SNMP.TIMEOUT})=0 Warning 依赖"Unavailable by ICMP ping"
High ICMP ping loss min(/…/icmppingloss,5m)>{$ICMP_LOSS_WARN} and <100 Warning 依赖 ICMP 不可用
High ICMP ping response time avg(/…/icmppingsec,5m)>{$ICMP_RESPONSE_TIME_WARN} Warning 依赖丢包与不可用
High memory utilization min(/…/vm.memory.util[…],5m)>{$MEMORY.UTIL.MAX} Average 内存耗尽前预警
Host has been restarted 硬件/网络 uptime 计数下降且排除 32 位计数器回绕(2^32 百分之一秒约 497 天) Warning 手动关闭;uptime 超过 {$SNMP.UPTIME.WARN} 自动恢复
System name has changed last(#1)<>last(#2) and length>0 Info 手动关闭,用于发现设备被替换/改名
Operating system description has changed 同上,基于 system.sw.os Info 依赖"System name has changed",手动关闭
Firmware has changed 同上,基于 system.hw.firmware Info 手动关闭
Device has been replaced 同上,基于 system.hw.serialnumber Info 手动关闭,序列号变化即判定设备被更换

"Host has been restarted" 的表达式是模板中最复杂的部分:它同时监控硬件与网络两路 uptime,当前值小于前值且前值距 32 位计数器上限(42949672.96 秒)足够远(排除回绕误报)时才触发;恢复表达式为 uptime 超过 {$SNMP.UPTIME.WARN}(默认 10 分钟)。

低级别发现(LLD)规则:动态适配设备能力

模板通过 8 条 LLD 规则实现"设备有什么就监控什么",避免在能力缺失的机型上产生大量不支持项。每条规则由"LLD 规则 + 原型监控项 + 原型触发器"三层组成。

CPU discovery(CPU 发现)

  • 规则键值:hrProcessorLoad.discovery,类型 Dependent,主监控项为 system.cpu.walk;预处理 SNMP walk to JSON(OID 1.3.6.1.2.1.25.3.3.1.1)+ 不变即丢弃(1h)。
  • 原型监控项:#{#SNMPINDEX}: CPU utilization,键值 system.cpu.util[hrProcessorLoad.{#SNMPINDEX}],通过 SNMP walk value 从 OID 1.3.6.1.2.1.25.3.3.1.2.{#SNMPINDEX} 取值,单位 %。
  • 原型触发器:min(…,5m)>{$CPU.UTIL.CRIT},Warning 级——5 分钟窗口内 CPU 使用率超过 90% 触发。
  • 附带图形原型:#{#SNMPINDEX}: CPU utilization。

Temperature CPU discovery(CPU 温度发现)与 Temperature sensor discovery(设备温度发现)

  • 这两条规则直接以 SNMP agent 类型做 walk[1.3.6.1.4.1.14988.1.1.3.11](CPU 温度)与 walk[1.3.6.1.4.1.14988.1.1.3.10](设备温度),预处理均为 SNMP walk to JSON 且 失败时丢弃值(error_handler: DISCARD_VALUE)——这正是文档所述"部分 MikroTik 硬件无温度传感器,故用发现方式避免不支持项"的实现细节。
  • 原型监控项:sensor.temp.value[mtxrHlProcessorTemperature.{#SNMPINDEX}] / sensor.temp.value[mtxrHlTemperature.{#SNMPINDEX}],单位 °C,预处理自定义乘数 0.1(MikroTik 温度 OID 原始值以 0.1°C 为单位)+ 不变即丢弃(3m)。
  • 原型触发器(以 CPU 温度为例,设备温度结构相同):
    • 超过警告阈值:avg(…,5m)>{$TEMP_WARN:"CPU"},Warning,依赖 critical;
    • 超过严重阈值:avg(…,5m)>{$TEMP_CRIT:"CPU"},High;
    • 温度过低:avg(…,5m)<{$TEMP_CRIT_LOW:"CPU"},Average。

LTE modem discovery(LTE 调制解调器发现)

  • 规则键值:mtxrLTEModem.discovery,类型 Dependent,主监控项 net.if.wireless.walk;过滤器要求 {#IFNAME} 匹配 {$IFNAME.LTEMODEM.MATCHES}(默认 ^lte)且 {#IFTYPE} 为 ^1$(other 类型接口)。
  • 原型监控项:RSSI(lte.modem.rssi[…RSSI.{#SNMPINDEX}])、RSRP、RSRQ、SINR,分别从 MIKROTIK-MIB 1.3.6.1.4.1.14988.1.1.16.1.1.2/3/4/7 取数,单位为 dbm/db。
  • 原型触发器:四项信号指标 5 分钟内低于各自 {$LTEMODEM.*.MIN.WARN} 下限即告警(Warning),用于监测弱信号/信号劣化。
  • 附带图形原型:Interface {#IFNAME}({#IFALIAS}): Modem Signal,将 SINR、RSRQ、RSRP、RSSI 四条曲线叠加展示。

AP channel discovery 与 CAPsMAN AP channel discovery(无线 AP 信道发现)

  • 普通 AP 规则键值 mtxrWlAp.discovery:过滤器要求管理状态 ^1$(启用)且接口类型 ^71$(ieee80211);原型项包括 SSID(ssid.name)、AP band(ssid.band)、AP noise floor(ssid.noise)、注册客户端数(ssid.regclient)、认证客户端数(ssid.authclient)。
  • CAPsMAN 规则键值 mtxrWlCMChannel.discovery:过滤器要求 {#IFNAME} 匹配 {$IFNAME.WIFI.MATCHES}(默认 WIFI)且 {#IFTYPE} 为 ^1$;原型项包括 AP channel(ssid.channel)、AP state(ssid.state)、注册/认证客户端数。
  • 原型触发器(CAPsMAN):last(/…/ssid.state[…])<>"running-ap",Warning——AP 接口因禁用、断电、链路断开等原因未处于运行态即告警。

Storage discovery(存储发现)

  • 规则键值:storage.discovery,类型 Dependent,主监控项 vfs.fs.walk;过滤器为 OR 关系:{#STORAGE_TYPE} 匹配 .+4$(hrStorageType 枚举以 4 结尾的磁盘类存储)或以 hrStorageFixedDisk 结尾。
  • 原型监控项:Disk-{#SNMPINDEX}: Used space(vfs.fs.used[hrStorageSize.{#SNMPINDEX}],乘数 1024)、Total space(乘数 1024)、Space utilization(Calculated,used/total*100)。
  • 原型触发器(双条件组合):
    • Disk space is critically low(Average):使用率超过 {$VFS.FS.PUSED.MAX.CRIT:"Disk-{#SNMPINDEX}"} 且(剩余空间低于 {$VFS.FS.FREE.MIN.CRIT:"Disk-{#SNMPINDEX}"} 或 timeleft(…,1h,100)<1d 预计 24 小时内写满);
    • Disk space is low(Warning):同理使用 WARN 阈值,依赖 critical。
  • 附带图形原型:Disk-{#SNMPINDEX}: Disk space usage(饼图)。

Network interfaces discovery(网络接口发现)

  • 规则键值:net.if.discovery,类型 Dependent,主监控项 net.if.walk;过滤器共 12 个条件(AND 关系),对 {#IFNAME}、{#IFDESCR}、{#IFALIAS}、{#IFTYPE}、{#IFOPERSTATUS}、{#IFADMINSTATUS} 六个宏分别做包含(MATCHES)与排除(NOT_MATCHES)正则过滤。
  • 原型监控项(9 个):
    • net.if.status[ifOperStatus.{#SNMPINDEX}]:运行状态,映射 IF-MIB::ifOperStatus 值映射(up/down/unknown/dormant/notPresent/lowerLayerDown);
    • net.if.in[ifHCInOctets…] 与 net.if.out[ifHCOutOctets…]:收/发速率,预处理"每秒变化 + 乘数 8"换算为 bps;
    • net.if.in.errors、net.if.out.errors、net.if.in.discards、net.if.out.discards:错误/丢弃包速率,预处理"每秒变化 + 不变即丢弃(3m)";
    • net.if.type[ifType…]:接口类型,映射完整的 IF-MIB::ifType 值映射;
    • net.if.speed[ifHighSpeed…]:接口速率,乘数 1000000(ifHighSpeed 单位为 Mbps),不变即丢弃(1h)。
  • 原型触发器(4 个):
    • Link down(Average):{$IFCONTROL:"{#IFNAME}"}=1 且运行状态为 down(2) 且此前为 up(last(#1)<>last(#2),避免"从未开启"的接口告警);{$IFCONTROL} 置 0 可将某接口标记为不重要;
    • High bandwidth usage(Warning):15 分钟平均收/发速率超过 {$IF.UTIL.MAX:"{#IFNAME}"}/100 × ifHighSpeed,且速率大于 0;
    • High error rate(Warning):5 分钟内错误包速率超过 {$IF.ERRORS.WARN:"{#IFNAME}"},低于该值 80% 时自动恢复;
    • Ethernet has changed to lower speed(Info):速率下降(change<0)且接口类型属于以太网家族(ifType 6/7/11/62/69/117 等),用于发现自协商异常。
  • 附带图形原型:Interface {#IFNAME}({#IFALIAS}): Network traffic,将收/发流量、错误与丢弃速率叠加展示。

图形、仪表盘与值映射

  • 图形(Graph):模板内置 Mikrotik: Memory utilization 图形;各 LLD 规则随原型生成 CPU 利用率、LTE 信号、磁盘空间饼图、网络流量等图形原型。
  • 仪表盘(Dashboard):模板自带 Network interfaces 仪表盘,内嵌"接口网络流量"图形原型组件(graphprototype),随发现自动填充所有接口。
  • 值映射(Valuemap):IF-MIB::ifOperStatus、IF-MIB::ifType(覆盖 290 个 IANA 接口类型枚举)、Service state(0=Down/1=Up)、zabbix.host.available,保证原始数值以可读文本呈现。

源码级实现要点速查

从 template_net_mikrotik_CRS112-8P-4S-IN_snmp.yaml 可以提炼出以下可复用的实现范式,供你在自制模板时参考:

  1. 依赖项 + SNMP walk 基座:先用少量 SNMP walk 项抓取 IF-MIB、HOST-RESOURCES-MIB、MIKROTIK-MIB 的相关 OID 表并转 JSON,其余监控项全部以 Dependent 类型 + SNMP walk value 从 JSON 取数,显著降低设备端 SNMP 轮询负担。
  2. LLD 过滤器矩阵:MATCHES / NOT_MATCHES 成对出现,配合用户宏即可在不改模板的情况下完成接口/调制解调器/AP 的纳入与排除。
  3. 能力探测式发现:温度、LTE、无线 AP 等"非全系标配"对象一律走 LLD,且温度发现预处理对失败置为"丢弃值",保证在无传感器的机型上自动收敛为空,不产生不支持监控项。
  4. 计数器类数据三件套:流量/错误类监控项统一采用 SNMP walk value + Change per second + Custom multiplier 的预处理链,把累计计数器转换为速率;uptime 类则用乘数 0.01 完成百分之一秒到秒的换算。
  5. 告警依赖与恢复表达式:可用性类触发器层层依赖(ICMP → SNMP → 具体监控),性能类触发器大多配置 RECOVERY_EXPRESSION(如带宽低于阈值-3% 恢复、错误率低于 80% 恢复、温度低于阈值-3 恢复),有效抑制抖动与告警风暴。

故障排查与反馈

  • 接入后若 SNMP 监控项显示"不支持",优先检查设备端 SNMP 服务与 community、防火墙放行(UDP 161),以及 RouterOS 版本对相关 MIB 对象的支持(参考上文 Known Issues)。
  • 若发现某些接口未出现在监控中,检查 {$NET.IF.*.MATCHES/NOT_MATCHES} 系列过滤宏与 {$IFCONTROL} 的设置。
  • 模板问题可向 Zabbix 官方支持渠道(support.zabbix.com)提交,也可在 Zabbix 官方论坛的 Suggestions and Feedback 板块讨论;本文所涉及的模板、通用 MikroTik 模板及全部 MikroTik 设备模板均位于仓库 templates/net/mikrotik 目录下,可对照查阅。
登录后查看全文
zabbix