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 配置
网络协议管理接口:
https://<设备IP>/redfish/v1/Managers/1/NetworkProtocolSNMP 服务配置接口:
https://<设备IP>/redfish/v1/Managers/1/SnmpServiceNOTE
- 只有使用SNMPv1和SNMPv2版本访问SNMP接口,才需要配置只读团体名和读写团体名
- 只读团体名、读写团体名要满足密码复杂度要求,否则会设置失败
使用命令行访问 SNMP 接口
linux系统(wsl)安装SNMP客户端工具
apt-get install snmpSNMPv1/SNMPv2c访问简单查询接口(查询单个属性)
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类型查询接口(查询集合资源)
snmpwalk -v 1 -c ****** <ip>:161 <oid>
snmpwalk -v 2c -c ****** <ip>:161 <oid>参数说明同上
SNMPv1/SNMPv2c访问设置接口
简单接口和Table类型接口的设置接口都是针对单个属性的,使用方式是一致的,如下所示:
snmpset -v 1 -c ****** <ip>:161 <oid> <type> <value>
snmpset -v 2c -c ****** <ip>:161 <oid> <type> <value>参数说明同上,新增参数说明如下:
- type:设置的数据类型,例如:i(整型),s(字符串);
- value:要设置的值。
注意事项:
SNMPv3访问简单查询接口(查询单个属性)
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类型的查询接口(查询集合资源)
snmpget -v 3 -l authPriv -u <username> -a SHA-256 -A ****** -x AES -X ****** <ip>:161 <oid>参数说明同上
SNMPv3访问设置接口
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_NOERROR | 0 | 代理报告在传输过程中未发生任何错误 |
| SNMP_ERRORSTATUS_TOOBIG | 1 | 代理无法将请求的 SNMP 操作的结果放在单个 SNMP 消息中 |
| SNMP_ERRORSTATUS_NOSUCHNAME | 2 | 请求的 SNMP 操作标识了一个未知变量 |
| SNMP_ERRORSTATUS_BADVALUE | 3 | 请求的 SNMP 操作尝试更改变量,但它指定了语法或值错误 |
| SNMP_ERRORSTATUS_READONLY | 4 | 请求的 SNMP 操作尝试根据变量的社区配置文件更改不允许更改的变量 |
| SNMP_ERRORSTATUS_GENERR | 5 | 在请求的 SNMP 操作期间,出现此处列出的错误以外的错误 |
| SNMP_ERRORSTATUS_NOACCESS | 6 | 指定的 SNMP 变量不可访问 |
| SNMP_ERRORSTATUS_WRONGTYPE | 7 | 值指定与变量所需的类型不一致的类型 |
| SNMP_ERRORSTATUS_WRONGLENGTH | 8 | 值指定与变量所需长度不一致的长度 |
| SNMP_ERRORSTATUS_WRONGENCODING | 9 | 值包含与字段的 ASN.1 标记不一致的抽象语法表示法一(ASN.1)编码 |
| SNMP_ERRORSTATUS_WRONGVALUE | 10 | 值不能分配给变量 |
| SNMP_ERRORSTATUS_NOCREATION | 11 | 变量不存在,代理无法创建它 |
| SNMP_ERRORSTATUS_INCONSISTENTVALUE | 12 | 该值与其他托管对象的值不一致 |
| SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE | 13 | 将值分配给变量需要分配当前不可用的资源 |
| SNMP_ERRORSTATUS_COMMITFAILED | 14 | 未发生验证错误,但未更新任何变量 |
| SNMP_ERRORSTATUS_UNDOFAILED | 15 | 未发生验证错误。某些变量已更新,因为无法撤消其赋值 |
| SNMP_ERRORSTATUS_AUTHORIZATIONERROR | 16 | 发生授权错误 |
| SNMP_ERRORSTATUS_NOTWRITABLE | 17 | 变量存在,但代理无法修改它 |
| SNMP_ERRORSTATUS_INCONSISTENTNAME | 18 | 变量不存在,代理无法创建它,因为命名对象实例与其他托管对象的值不一致 |
openUBMC的SNMP接口错误码配置示例
错误定义汇总在mdb_interface组件中,样例参考如下:
{
"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_NOERROR | 0 | 代理报告在传输过程中未发生任何错误。 |
| SNMP_ERRORSTATUS_TOOBIG | 1 | 代理无法将请求的 SNMP 操作的结果放在单个 SNMP 消息中。 |
| SNMP_ERRORSTATUS_NOSUCHNAME | 2 | 请求的 SNMP 操作标识了一个未知变量。 |
| SNMP_ERRORSTATUS_BADVALUE | 3 | 请求的 SNMP 操作尝试更改变量,但它指定了语法或值错误。 |
| SNMP_ERRORSTATUS_READONLY | 4 | 请求的 SNMP 操作尝试根据变量的社区配置文件更改不允许更改的变量。 |
| SNMP_ERRORSTATUS_GENERR | 5 | 在请求的 SNMP 操作期间,出现此处列出的错误以外的错误。 |
因此如果使用SNMPv1版本来访问SNMP接口时,如果后台组件返回的SNMP错误码不属于上述6种错误码,则SNMP接口层会对错误码进行转换,转换规则如下所示:
SNMP_ERR_WRONGVALUE
SNMP_ERR_WRONGENCODING
SNMP_ERR_WRONGTYPE
SNMP_ERR_WRONGLENGTH
SNMP_ERR_INCONSISTENTVALUE以上几种错误码,会统一返回SNMP_ERR_BADVALUE
SNMP_ERR_NOACCESS
SNMP_ERR_NOTWRITABLE
SNMP_ERR_NOCREATION
SNMP_ERR_INCONSISTENTNAME
SNMP_ERR_AUTHORIZATIONERROR以上几种错误码,会统一返回SNMP_ERR_NOSUCHNAME
SNMP_ERR_RESOURCEUNAVAILABLE
SNMP_ERR_COMMITFAILED
SNMP_ERR_UNDOFAILED以上几种错误码,会统一返回SNMP_ERR_GENERR