Zabbix 模板实战:用 SNMP 全面监控 MikroTik CRS112-8P-4S-IN 交换机
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(OID1.3.6.1.2.1.25.3.3.1.1)+ 不变即丢弃(1h)。 - 原型监控项:
#{#SNMPINDEX}: CPU utilization,键值system.cpu.util[hrProcessorLoad.{#SNMPINDEX}],通过SNMP walk value从 OID1.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-MIB1.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 space is critically low(Average):使用率超过
- 附带图形原型:
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 等),用于发现自协商异常。
- Link down(Average):
- 附带图形原型:
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 可以提炼出以下可复用的实现范式,供你在自制模板时参考:
- 依赖项 + SNMP walk 基座:先用少量 SNMP walk 项抓取 IF-MIB、HOST-RESOURCES-MIB、MIKROTIK-MIB 的相关 OID 表并转 JSON,其余监控项全部以 Dependent 类型 +
SNMP walk value从 JSON 取数,显著降低设备端 SNMP 轮询负担。 - LLD 过滤器矩阵:
MATCHES / NOT_MATCHES成对出现,配合用户宏即可在不改模板的情况下完成接口/调制解调器/AP 的纳入与排除。 - 能力探测式发现:温度、LTE、无线 AP 等"非全系标配"对象一律走 LLD,且温度发现预处理对失败置为"丢弃值",保证在无传感器的机型上自动收敛为空,不产生不支持监控项。
- 计数器类数据三件套:流量/错误类监控项统一采用
SNMP walk value+Change per second+Custom multiplier的预处理链,把累计计数器转换为速率;uptime 类则用乘数 0.01 完成百分之一秒到秒的换算。 - 告警依赖与恢复表达式:可用性类触发器层层依赖(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 目录下,可对照查阅。