2 SNMP agent

概述

您可能希望在打印机、网络交换机、路由器或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 开始监控设备时,必须执行以下步骤:

步骤1

找出您要监控的监控项的SNMP string(或OID)。

要getSNMP字符串列表,可使用snmpwalk命令(属于net-snmp软件的一部分,安装Zabbix时应已安装)或等效工具:

snmpwalk -v 2c -c public <host IP> .

由于此处的'2c'表示SNMP version,您也可以将其替换为'1',以指示设备上的SNMP版本1。

这将返回SNMP字符串及其最新值的列表。 如果未返回结果,则可能是SNMP 'community'与标准'public'不同,此时您需要查明实际使用的community。

然后您可以浏览列表,直到找到要监控的string。例如, 如果要监控交换机端口3的输入字节数,可使用此行中的IF-MIB::ifHCInOctets.3 string:

IF-MIB::ifHCInOctets.3 = Counter64: 3409739121

现在可以使用snmpget命令查找'IF-MIB::ifHCInOctets.3'的数字OID:

snmpget -v 2c -c public -On <host IP> IF-MIB::ifHCInOctets.3

注意string中的最后一个数字是您要监控的端口号。 另请参阅:Dynamic indexes

这将返回类似以下内容:

.1.3.6.1.2.1.31.1.1.1.6.3 = Counter64: 3472126941

同样,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"等,具体取决于显示提示的存在。

步骤2

Create a host 对应设备。

为 主机 添加 SNMP 接口:

  • 输入 IP 地址/DNS 名称和端口号。
  • 从下拉菜单中选择 SNMP 版本
  • 根据所选的 SNMP 版本添加接口凭据:
    • SNMPv1 和 v2 仅需要 community(通常为 'public')。
    • SNMPv3 需要更多特定选项(见下文)。
  • 指定用于原生 SNMP 批量请求(GetBulkRequest-PDUs)的最大重复值(默认值:10);仅适用于 SNMPv2 和 v3 中的 discovery[]walk[] 监控项。 请注意,该值设置过高可能导致 SNMP agent 检查超时。
  • 勾选 使用组合请求 复选框以允许对 SNMP 请求进行组合处理(与原生 SNMP 批量请求 "walk" 和 "get" 无关)。
SNMPv3 参数 描述
Context name 输入上下文名称以在 SNMP 子网中标识 监控项。
此字段中将解析用户宏。
Security name 输入安全名称。
此字段中将解析用户宏。
Security level 选择安全级别:
noAuthNoPriv - 不使用认证和隐私协议
AuthNoPriv - 使用认证协议,不使用隐私协议
AuthPriv - 同时使用认证和隐私协议
Authentication protocol 选择认证协议 - MD5, SHA1;使用 net-snmp 5.8 及更新版本支持 SHA224, SHA256, SHA384SHA512
Authentication passphrase 输入认证短语。
此字段中将解析用户宏。
Privacy protocol 选择隐私协议 - DES, AES128, AES192, AES256, AES192C(Cisco)或 AES256C(Cisco)。
有关隐私协议支持的说明,请参阅相关注释。
Privacy passphrase 输入隐私短语。
此字段中将解析用户宏。

如果 SNMPv3 凭据(安全名称、认证协议/短语、隐私协议)错误:

  • Zabbix 会从 net-snmp 接收到一个 ERROR,但 隐私短语 错误时,Zabbix 会从 net-snmp 接收到 TIMEOUT 错误。
  • SNMP 接口可用性将变为红色(不可用)。

在不更改 Security name 的情况下对 Authentication protocolAuthentication passphrasePrivacy protocolPrivacy 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

net-snmp-config --configure-options

如果输出包含 --enable-blumenthal-aes,则表示支持 AES192+。

请注意,net-snmp-config 是 SNMP 开发包的一部分(Debian/Ubuntu 上为 libsnmp-dev,CentOS/RHEL/OL/SUSE 上为 net-snmp-devel),默认情况下可能未安装。

2。 snmpget

snmpget -v 3 -x AES-256

如果输出包含 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。

步骤3

为监控创建一个 监控项。

因此,现在返回到 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

示例1

通用示例:

参数 描述
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格式要求结果

示例2

运行时间监控:

参数 描述
OID MIB::sysUpTime.0
Key router.uptime
Value type float
Units uptime
Preprocessing step: Custom multiplier 0.01

原生SNMP批量请求

walk[OID1,OID2,...] 监控项 允许利用 SNMP 原生批量请求功能(GetBulkRequest-PDU),该功能在 SNMP 2/3. 版本中可用。

SNMP 中的 GetBulk 请求会执行多个 GetNext 请求,并将结果合并为单个响应返回。此功能既可用于常规 SNMP 监控项,也可用于 SNMP 发现机制,从而减少网络往返次数。

SNMP walk[OID1,OID2,...] 监控项 可作为主 监控项 使用,通过单次请求采集数据,而依赖的 监控项 则通过预处理按需解析响应。

需注意:原生 SNMP 批量请求与 SNMP 请求合并选项无关,后者是 Zabbix 自有的多请求合并机制(参见下一节)。

SNMP 批量 监控项 会进行重试以避免因单个数据包丢失导致的失败。使用 getwalk 的 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 监控项 类型组合处理的好处:

  • 常规 SNMP 监控项 从 "get" 操作的改进中受益;
  • SNMP 监控项 使用动态索引从“获取(getting)”和“遍历(walking)”的改进中受益:“获取”用于索引验证,“遍历”用于构建缓存;
  • SNMP 低级别自动发现规则受益于“遍历(walking)”改进。

然而,存在一个技术性问题,即并非所有设备都能够在每个请求中返回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 参数在 unavailabledelayunavailabledelay 配置文件中的值,以减少请求频率。 如果在发现或OID遍历期间收到部分数据,则监控项可能会变为不受支持状态。