您可能希望在打印机、网络交换机、路由器或UPS等设备上使用SNMP监控,这些设备通常启用了SNMP功能,而在这些设备上尝试安装完整的操作系统和Zabbix agents是不切实际的。
为了能够检索这些设备上由 SNMP agents 提供的数据,必须通过指定 --with-net-snmp
flag 来使 Zabbix server initially configured 支持 SNMP。 建议同时install MIB files以确保监控项值以正确格式显示。 如果没有MIB文件,可能会出现格式化问题的情况,例如以HEX格式而非UTF-8显示数值,或相反的情况。
SNMP检查仅通过UDP协议执行。
如果 Zabbix server 和 proxy 守护进程收到不正确的 SNMP 响应,其日志中将记录类似如下的行:
仅返回OutputFormat格式要求结果 SNMP response from host "gateway" does not contain all of the requested variable bindings 仅返回OutputFormat格式要求结果 虽然它们并不能涵盖所有有问题的情况,但它们可用于识别需要禁用组合请求的单个 SNMP 设备。
Zabbix server/proxy在一次不成功的query尝试后总会至少重试一次:要么通过SNMP库的重试机制,要么通过内部的组合处理机制。
::: notewarning 如果监控 SNMPv3 设备,请确保 msgAuthoritativeEngineID(也称为 snmpEngineID 或 "Engine ID")不会被两个设备共享。 根据 RFC 2571(章节 3.1.1.1)中的说明,它必须在每个设备上唯一。 仅返回OutputFormat格式要求结果
::: notewarning RFC3414要求SNMPv3设备持久保存其engineBoots。 某些设备不会执行此操作,导致它们的 SNMP 消息在重启后被视为过时而被丢弃。 在这种情况下,需要在server/proxy上手动清除SNMP缓存(通过使用运行时控制),或者需要重启server/proxy。 仅返回OutputFormat格式要求结果
通过 SNMP 开始监控设备时,必须执行以下步骤:
找出您要监控的监控项的SNMP string(或OID)。
要getSNMP字符串列表,可使用snmpwalk命令(属于net-snmp软件的一部分,安装Zabbix时应已安装)或等效工具:
由于此处的'2c'表示SNMP version,您也可以将其替换为'1',以指示设备上的SNMP版本1。
这将返回SNMP字符串及其最新值的列表。 如果未返回结果,则可能是SNMP 'community'与标准'public'不同,此时您需要查明实际使用的community。
然后您可以浏览列表,直到找到要监控的string。例如, 如果要监控交换机端口3的输入字节数,可使用此行中的IF-MIB::ifHCInOctets.3 string:
现在可以使用snmpget命令查找'IF-MIB::ifHCInOctets.3'的数字OID:
注意string中的最后一个数字是您要监控的端口号。 另请参阅:Dynamic indexes。
这将返回类似以下内容:
同样,OID中的最后一个数字是端口号。
Zabbix已translated automatically to a numeric representation一些最常用的SNMP OID。
在上面的最后一个示例中,值类型为"Counter64",内部对应ASN_COUNTER64类型。 支持的全部类型包括ASN_COUNTER、ASN_COUNTER64、ASN_UINTEGER、ASN_UNSIGNED64、ASN_INTEGER、ASN_INTEGER64、ASN_FLOAT、ASN_DOUBLE、ASN_TIMETICKS、ASN_GAUGE、ASN_IPADDRESS、ASN_OCTET_STR和ASN_OBJECT_ID。 这些类型大致对应snmpget输出中的"Counter32"、"Counter64"、"UInteger32"、"integer"、"float"、"Double"、"Timeticks"、"Gauge32"、"IpAddress"、"OCTET string"、"object IDENTIFIER",但也可能显示为"string"、"Hex-string"、"OID"等,具体取决于显示提示的存在。
Create a host 对应设备。
为 主机 添加 SNMP 接口:
discovery[]
和 walk[]
监控项。 请注意,该值设置过高可能导致 SNMP agent 检查超时。SNMPv3 参数 | 描述 |
---|---|
Context name | 输入上下文名称以在 SNMP 子网中标识 监控项。 此字段中将解析用户宏。 |
Security name | 输入安全名称。 此字段中将解析用户宏。 |
Security level | 选择安全级别: noAuthNoPriv - 不使用认证和隐私协议 AuthNoPriv - 使用认证协议,不使用隐私协议 AuthPriv - 同时使用认证和隐私协议 |
Authentication protocol | 选择认证协议 - MD5, SHA1;使用 net-snmp 5.8 及更新版本支持 SHA224, SHA256, SHA384 或 SHA512。 |
Authentication passphrase | 输入认证短语。 此字段中将解析用户宏。 |
Privacy protocol | 选择隐私协议 - DES, AES128, AES192, AES256, AES192C(Cisco)或 AES256C(Cisco)。 有关隐私协议支持的说明,请参阅相关注释。 |
Privacy passphrase | 输入隐私短语。 此字段中将解析用户宏。 |
如果 SNMPv3 凭据(安全名称、认证协议/短语、隐私协议)错误:
在不更改 Security name 的情况下对 Authentication protocol、Authentication passphrase、Privacy protocol 或 Privacy passphrase 所做的更改,通常会在 Zabbix 中更新对应的 SNMPv3 接口时自动应用。 如果同时更改了 Security name,所有参数将立即更新。
您可以使用提供的 SNMP 模板之一,它将自动添加一组 监控项。在使用模板之前,请确认其与 主机 兼容。
点击 Add 保存 主机。
根据您的操作系统和 net-snmp 的配置,某些隐私协议可能不可用:
在某些较新的操作系统上(例如,RHEL9),net-snmp 软件包已不再支持 DES。
加密协议 AES192 及更高级别在 RHEL 8、CentOS 8、Oracle Linux 8、Debian 12、Ubuntu LTS 22.04、openSUSE Leap 15.5 之前的旧版操作系统上默认不支持。
要检查 net-snmp 库是否支持 AES192+,请使用以下选项之一:
1。 net-snmp-config
:
如果输出包含 --enable-blumenthal-aes
,则表示支持 AES192+。
请注意,net-snmp-config 是 SNMP 开发包的一部分(Debian/Ubuntu 上为 libsnmp-dev,CentOS/RHEL/OL/SUSE 上为 net-snmp-devel),默认情况下可能未安装。
2。 snmpget
:
如果输出包含 Invalid privacy protocol specified after -3x flag: AES-256
,则表示不支持 AES192+。 如果输出包含 No hostname specified.
,则表示不支持 AES192+。
如果您的 net-snmp 库不支持 AES192 及更高级别的协议,请使用 --enable-blumenthal-aes
选项重新编译 net-snmp,然后在指定 --with-net-snmp=/home/user/yourcustomnetsnmp/bin/net-snmp-config
选项的情况下重新编译 Zabbix server。
为监控创建一个 监控项。
因此,现在返回到 Zabbix,然后点击你之前创建的 SNMP 监控项 的 主机。 根据在创建主机时是否使用了模板,你会看到与主机关联的SNMP监控项列表,或者仅看到一个空列表。 我们将在假设您将使用刚刚通过 snmpwalk 和 snmpget 收集的信息自行 create 监控项 的前提下进行操作,因此请点击 创建监控项。
在新的 监控项 表单中填写必填参数:
参数 | 描述 |
---|---|
Name | 输入 监控项 名称。 |
Type | 此处选择 SNMP agent。 |
Key | 输入一个有意义的键值。 |
Host interface | 确保选择 SNMP 接口,例如您的交换机/路由器。 |
SNMP OID | 使用以下受支持格式之一输入 OID 值: walk[OID1,OID2,...] - 检索值的子树。 例如: walk[1.3.6.1.2.1.2.2.1.2,1.3.6.1.2.1.2.2.1.3] 。此选项使用 本地 SNMP 批量请求(GetBulkRequest-PDUs)异步执行。 此 监控项 的超时设置可在 配置 表单中设置。建议设置较低的超时值,以避免设备无法访问时造成长时间延迟,因为如果之前的请求超时或失败(例如,3 秒超时可能导致 15 秒等待时间),将最多进行 5 次重试(自 Zabbix 7.0.14 起)。 您可以将此作为主 监控项 使用,并通过预处理提取主项数据的依赖 监控项。 可以在单个 SNMP walk 中指定多个 OID,例如 walk[OID1,OID2,...] ,以一次异步处理一个 OID。如果批量请求未返回结果,则会尝试在不使用批量请求的情况下检索单个记录。 支持将 MIB 名称作为参数;因此 walk[1.3.6.1.2.1.2.2.1.2] 和 walk[ifDescr] 将返回相同的输出。如果指定了多个 OID/MIB,例如 walk[ifDescr,ifType,ifPhysAddress] ,则输出为连接的列表。GetBulk 请求用于 SNMPv2 和 v3 接口,GetNext 用于 SNMPv1 接口;批量请求的最大重复次数在接口级别配置。 批量请求的最大重复次数参数通过确定单个批量响应中返回的 OID 最大数量来影响批量请求。 较高的值会导致较大的批量响应,从而减少所需的传输次数。但是,并非所有设备都可能支持非常高的值,这可能导致 问题。 此 监控项 返回 snmpwalk 工具使用 -Oe -Ot -On 参数的输出。 您可以将此 监控项 作为主 监控项 在 SNMP discovery 中使用。 get[OID] - 异步检索 单个 值。 例如: get[1.3.6.1.2.1.31.1.1.1.6.3] 此 监控项 的超时设置可在 配置 表单中设置。建议设置较低的超时值,以避免设备无法访问时造成长时间延迟,因为如果之前的请求超时或失败(例如,3 秒超时可能导致 15 秒等待时间),将最多进行 5 次重试(自 Zabbix 7.0.14 起)。 OID - (旧版)输入单个文本或数字 OID 以同步检索单个值,可选地与其他值组合。 例如: 1.3.6.1.2.1.31.1.1.1.6.3 。对于此选项,监控项 检查超时将等于服务器 超时 中设置的值。 建议使用 walk[OID] 和 get[OID] 监控项 以获得更好的性能。所有 walk[OID] 和 get[OID] 监控项 都是异步执行的 - 不需要在开始其他检查之前接收一个请求的响应。DNS 解析也是异步的。异步检查的最大并发数为 1000(由 maxconcurrentchecksperpoller 定义)。异步 SNMP 轮询器的数量由 startsnmppollers 参数定义。 请注意,对于任何方法返回的网络流量统计信息,在 预处理 选项卡中必须添加 每秒变化量 步骤;否则,您将使用 get 从 SNMP 设备获取累计值而不是最新变化值。 |
所有必填输入字段均以红色星号标记。
现在保存监控项,然后转到 SNMP 数据的 Monitoring > Latest data。
通用示例:
参数 | 描述 |
---|---|
OID | 1.2.3.45.6.7.8.0(或.1.2.3.45.6.7.8.0) |
Key | <用于作为触发器参考的唯一 string > 例如,"my_param"。 |
请注意,OID 可以是数字形式或 string 形式。 在某些情况下,必须将 string OID 转换为数字表示形式。 Utility snmpget 可用于此目的:
仅返回OutputFormat格式要求结果 snmpget -On localhost public enterprises.ucdavis.memory.memTotalSwap.0 仅返回OutputFormat格式要求结果
运行时间监控:
参数 | 描述 |
---|---|
OID | MIB::sysUpTime.0 |
Key | router.uptime |
Value type | float |
Units | uptime |
Preprocessing step: Custom multiplier | 0.01 |
walk[OID1,OID2,...] 监控项 允许利用 SNMP 原生批量请求功能(GetBulkRequest-PDU),该功能在 SNMP 2/3. 版本中可用。
SNMP 中的 GetBulk 请求会执行多个 GetNext 请求,并将结果合并为单个响应返回。此功能既可用于常规 SNMP 监控项,也可用于 SNMP 发现机制,从而减少网络往返次数。
SNMP walk[OID1,OID2,...] 监控项 可作为主 监控项 使用,通过单次请求采集数据,而依赖的 监控项 则通过预处理按需解析响应。
需注意:原生 SNMP 批量请求与 SNMP 请求合并选项无关,后者是 Zabbix 自有的多请求合并机制(参见下一节)。
SNMP 批量 监控项 会进行重试以避免因单个数据包丢失导致的失败。使用 get
和 walk
的 SNMP 监控项 超时时间(在 配置 表单中设置)针对整个会话生效。若触发超时,系统将重置超时计时器并重发末次请求,确保在单个数据包丢失或延迟时能从断点恢复会话。建议设置较低的超时值以避免设备不可达时的长时间等待,因为从 Zabbix 7.0.14 起,最多会进行 5 次重试(例如 3 秒超时可能导致最长 15 秒的等待时间)。
Zabbix server 和 proxy 可能会使用 query 在单个请求中轮询 SNMP 设备以获取多个值。 这会影响几种类型的 SNMP 监控项:
所有具有相同参数的 SNMP 监控项 将在同一时间通过单一接口进行查询。 前两种类型的 监控项 由轮询器以每批最多 128 个 监控项 的方式获取,而低级别自动发现规则则像以前一样单独处理。
在较低级别上,执行查询值的操作有两种:获取多个指定的 objects 和遍历 OID 树。
对于“获取”操作,使用带有最多 128 个变量绑定的 GetRequest-PDU。 对于“walking”,SNMPv1 使用 GetNextRequest-PDU,而 SNMPv2 和 SNMPv3 使用“max-repetitions”字段最多为 128 的 GetBulkRequest。
因此,以下列出了每种SNMP 监控项 类型组合处理的好处:
然而,存在一个技术性问题,即并非所有设备都能够在每个请求中返回128个值。 某些始终返回适当的响应,但另一些则在潜在响应超过一定限制后,要么返回“tooBig(1)”错误,要么根本不响应。
为了找到给定设备的最佳 objects 到 query 数量,Zabbix 使用以下策略。 它在请求中谨慎地开始查询1值。 如果成功,它将在请求中使用queries 2值。 如果再次成功,则它在请求中使用queries 3值,并通过将查询的objects数量乘以1继续类似操作。5,从而产生以下请求大小序列:1、2、3、4、6、9、13、19、28、42、63、94、128。
然而,一旦某个设备拒绝给出正确的响应(例如,对于 42 变量),Zabbix 会执行两个操作。
首先,对于当前的 监控项 批处理,它在单个请求中将 objects 的数量减少一半,并且 queries 21 变量。 如果设备处于运行状态,那么在绝大多数情况下,query 应该可以正常工作,因为 28 变量已知是有效的,并且 21 要明显小于前者。 然而,如果仍然失败,则 Zabbix 会退回到逐个查询值。 如果此时仍然失败,则表示设备 definitely 没有响应,且请求大小不是 问题。
Zabbix为后续的监控项批次所做的第二件事是,从最后一次成功的变量数量开始(在我们的示例中为28),并继续将请求大小增加1,直到达到限制。 例如,假设最大的响应大小为 32 个变量,后续的请求大小将分别为 29、30、31、32 和 33。 最后一次请求将失败,Zabbix 将永远不会再次 问题 大小为 33 的请求。 从那时起,Zabbix 将为此设备最多跟踪 query 个 32 变量。
如果包含大量 queries 的请求因变量数量过多而失败,则可能意味着以下两种情况之一。 设备用于限制响应大小的确切标准无法获知,但我们尝试使用变量数量来近似该标准。 因此,第一种可能性是,在一般情况下,变量数量接近设备的实际响应大小限制:有时响应小于限制,有时则大于限制。 第二种可能性是某个方向上的 UDP 数据包直接丢失了。 出于这些原因,如果 Zabbix 收到一个失败的 query,它会减少尝试的变量最大数量,以尝试get更深入地进入设备的舒适范围,但仅最多两次。
在上面的示例中,如果带有 query 和 32 变量的操作失败,Zabbix 将把计数减少到 31。 如果该操作也失败,Zabbix 将把计数减少到 30。 但是,Zabbix 不会将计数减少到 30 以下,因为它会假设进一步的失败是由于 UDP 数据包丢失,而不是设备的限制。
如果由于其他原因设备无法正确处理组合请求,并且上述启发式方法无效,则每个接口都有一个“使用组合请求”设置,允许为该设备禁用组合请求。
此外,如果接口频繁不可用,可能需要增加 UnavailableDelay 参数在 unavailabledelay 或 unavailabledelay 配置文件中的值,以减少请求频率。 如果在发现或OID遍历期间收到部分数据,则监控项可能会变为不受支持状态。