SNMP 协议接口故障排查与使用指南

概述

本文档介绍 SNMP(Simple Network Management Protocol)协议接口的使用方法、常见问题定位方法及错误码说明,面向 openUBMC系统的开发者和运维人员。

背景介绍

SNMP 是一种广泛应用于网络设备管理的协议,openUBMC 通过 SNMP 接口向外提供设备管理能力。在实际使用中,可能会遇到 SNMP 接口查询失败、返回数据异常等问题。掌握正确的定位方法和工具使用技巧,能够快速解决这些问题。

环境要求

硬件要求:支持 SNMP 协议的 BMC 硬件平台。

软件要求:openUBMC 系统。

网络要求:确保网络连接正常,SNMP 端口(默认 UDP 161)未被防火墙阻断。

SNMP 接口配置

通过 Web 页面设置 SNMP 配置

登录 openUBMC Web 服务管理页面,议配置中选择 SNMP,进行以下配置:

  • 启用或禁用 SNMP 服务
  • 启用或禁用SNMP支持不同协议版本
  • 配置只读团体名和读写团体名

登录 openUBMC Web 用户&安全页面,选择本地用户,进行以下配置:

  • 通过web设置SNMPv3用户的鉴权算法、鉴权密码、加密算法、加密密码

NOTE

  • 只有使用SNMPv3版本访问SNMP接口,才需要配置鉴权算法、鉴权密码、加密算法、加密密码

通过 Redfish 接口设置 SNMP 配置

网络协议管理接口:

bash
https://<设备IP>/redfish/v1/Managers/1/NetworkProtocol

SNMP 服务配置接口:

bash
https://<设备IP>/redfish/v1/Managers/1/SnmpService

NOTE

  • 只有使用SNMPv1和SNMPv2版本访问SNMP接口,才需要配置只读团体名和读写团体名
  • 只读团体名、读写团体名要满足密码复杂度要求,否则会设置失败

使用命令行访问 SNMP 接口

linux系统(wsl)安装SNMP客户端工具

shell
apt-get install snmp

SNMPv1/SNMPv2c访问简单查询接口(查询单个属性)

shell
snmpget -v 1 -c ****** <ip>:161 <oid>

snmpget -v 2c -c ****** <ip>:161 <oid>
  • -v参数:SNMP版本,例如:1(SNMPv1版本)、2c(SNMPv2c版本);
  • -c参数:只读团体名;
  • ip:161:IP地址和端口,如果端口不指定,默认访问161端口;
  • oid:接口Oid。

注意事项:

SNMPv1/SNMPv2c访问Table类型查询接口(查询集合资源)

shell
snmpwalk -v 1 -c ****** <ip>:161 <oid>

snmpwalk -v 2c -c ****** <ip>:161 <oid>

参数说明同上

SNMPv1/SNMPv2c访问设置接口

简单接口和Table类型接口的设置接口都是针对单个属性的,使用方式是一致的,如下所示:

shell
snmpset -v 1 -c ****** <ip>:161 <oid> <type> <value>

snmpset -v 2c -c ****** <ip>:161 <oid> <type> <value>

参数说明同上,新增参数说明如下:

  • type:设置的数据类型,例如:i(整型),s(字符串);
  • value:要设置的值。

注意事项:

SNMPv3访问简单查询接口(查询单个属性)

shell
snmpget -v 3 -l authPriv -u <username> -a SHA-256 -A ****** -x AES -X ****** <ip>:161 <oid>
  • -v参数:SNMP版本,例如:3(SNMPv3版本);
  • -l参数:认证方式(官方称为安全等级),openUBMC的认证方式为authPriv;
  • -u参数:用户名;
  • -a参数:鉴权算法;
  • -A参数:鉴权密码;
  • -x参数:加密算法;
  • -X参数:加密密码;
  • ip:161:IP地址和端口,如果端口不指定,默认访问161端口;
  • oid:接口Oid。

注意事项:

SNMPv3访问Table类型的查询接口(查询集合资源)

shell
snmpget -v 3 -l authPriv -u <username> -a SHA-256 -A ****** -x AES -X ****** <ip>:161 <oid>

参数说明同上

SNMPv3访问设置接口

shell
snmpget -v 3 -l authPriv -u <username> -a SHA-256 -A ****** -x AES -X ****** <ip>:161 <oid> <type> <value>

参数说明同上,新增的参数说明如下:

  • type:设置的数据类型,例如:i(整型),s(字符串);
  • value:要设置的值。

注意事项:

使用 Mib Browser 访问 SNMP 接口

在 Windows 系统中,可以使用 Mib Browser 来访问 SNMP 接口。

安装 Mib Browser

从官网下载 Mib Browser 安装包,按照默认提示进行安装即可。

导入 MIB 库

从本地导入 MIB 文件。

导入成功后,如下所示

设置SNMP接口的配置信息

根据自己要使用的SNMP版本来进行设置。

SNMPv1/v2c版本的配置信息

SNMPv3版本的配置信息

使用SNMP接口连接iBMC

注意事项:连接失败时,若是使用SNMPv1/SNMPv2c版本,则检查可读团体名和读写团体名是否正确;若是使用SNMPv3版本,则检查用户名、鉴权算法、鉴权密码、加密算法、加密密码是否正确。

访问简单查询接口

访问简单设置接口

访问Table类型查询接口

访问Table类型设置接口

SNMP 错误码说明

SNMP 协议的错误码定义

SNMP 协议定义了 18 种错误码。

宏定义常量值说明
SNMP_ERRORSTATUS_NOERROR0代理报告在传输过程中未发生任何错误
SNMP_ERRORSTATUS_TOOBIG1代理无法将请求的 SNMP 操作的结果放在单个 SNMP 消息中
SNMP_ERRORSTATUS_NOSUCHNAME2请求的 SNMP 操作标识了一个未知变量
SNMP_ERRORSTATUS_BADVALUE3请求的 SNMP 操作尝试更改变量,但它指定了语法或值错误
SNMP_ERRORSTATUS_READONLY4请求的 SNMP 操作尝试根据变量的社区配置文件更改不允许更改的变量
SNMP_ERRORSTATUS_GENERR5在请求的 SNMP 操作期间,出现此处列出的错误以外的错误
SNMP_ERRORSTATUS_NOACCESS6指定的 SNMP 变量不可访问
SNMP_ERRORSTATUS_WRONGTYPE7值指定与变量所需的类型不一致的类型
SNMP_ERRORSTATUS_WRONGLENGTH8值指定与变量所需长度不一致的长度
SNMP_ERRORSTATUS_WRONGENCODING9值包含与字段的 ASN.1 标记不一致的抽象语法表示法一(ASN.1)编码
SNMP_ERRORSTATUS_WRONGVALUE10值不能分配给变量
SNMP_ERRORSTATUS_NOCREATION11变量不存在,代理无法创建它
SNMP_ERRORSTATUS_INCONSISTENTVALUE12该值与其他托管对象的值不一致
SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE13将值分配给变量需要分配当前不可用的资源
SNMP_ERRORSTATUS_COMMITFAILED14未发生验证错误,但未更新任何变量
SNMP_ERRORSTATUS_UNDOFAILED15未发生验证错误。某些变量已更新,因为无法撤消其赋值
SNMP_ERRORSTATUS_AUTHORIZATIONERROR16发生授权错误
SNMP_ERRORSTATUS_NOTWRITABLE17变量存在,但代理无法修改它
SNMP_ERRORSTATUS_INCONSISTENTNAME18变量不存在,代理无法创建它,因为命名对象实例与其他托管对象的值不一致

openUBMC的SNMP接口错误码配置示例

错误定义汇总在mdb_interface组件中,样例参考如下:

json
{
    "PropertyValueFormatError": {
        "Description": "Indicates that a property was given the correct value type but the value of that property was not supported. This includes value size/length exceeded.",
        "Message": "The value %1 for the property %2 is of a different format than the property can accept.",
        "Severity": "Warning",
        "NumberOfArgs": 2,
        "ParamTypes": [
            "string",
            "string"
        ],
        "Resolution": "Correct the value for the property in the request body and resubmit the request if the operation failed.",
        "HttpStatusCode": 400,
        "IpmiCompletionCode": "0xFF",
        "SnmpStatusCode": 10,
        "TraceDepth": 0
    }
}

SNMP 接口错误码为 SnmpStatusCode 字段。

注意事项

SNMPv1版本的错误码只有6种,如下所示:

宏定义常量值说明
SNMP_ERRORSTATUS_NOERROR0代理报告在传输过程中未发生任何错误。
SNMP_ERRORSTATUS_TOOBIG1代理无法将请求的 SNMP 操作的结果放在单个 SNMP 消息中。
SNMP_ERRORSTATUS_NOSUCHNAME2请求的 SNMP 操作标识了一个未知变量。
SNMP_ERRORSTATUS_BADVALUE3请求的 SNMP 操作尝试更改变量,但它指定了语法或值错误。
SNMP_ERRORSTATUS_READONLY4请求的 SNMP 操作尝试根据变量的社区配置文件更改不允许更改的变量。
SNMP_ERRORSTATUS_GENERR5在请求的 SNMP 操作期间,出现此处列出的错误以外的错误。

因此如果使用SNMPv1版本来访问SNMP接口时,如果后台组件返回的SNMP错误码不属于上述6种错误码,则SNMP接口层会对错误码进行转换,转换规则如下所示:

c
SNMP_ERR_WRONGVALUE
SNMP_ERR_WRONGENCODING
SNMP_ERR_WRONGTYPE
SNMP_ERR_WRONGLENGTH
SNMP_ERR_INCONSISTENTVALUE

以上几种错误码,会统一返回SNMP_ERR_BADVALUE

c
SNMP_ERR_NOACCESS
SNMP_ERR_NOTWRITABLE
SNMP_ERR_NOCREATION
SNMP_ERR_INCONSISTENTNAME
SNMP_ERR_AUTHORIZATIONERROR

以上几种错误码,会统一返回SNMP_ERR_NOSUCHNAME

c
SNMP_ERR_RESOURCEUNAVAILABLE
SNMP_ERR_COMMITFAILED
SNMP_ERR_UNDOFAILED

以上几种错误码,会统一返回SNMP_ERR_GENERR