SNMP的基本知识此处就不再介绍了,就默认大家已经会了,本文重点是MIB的学习及实践。
MIB (Managed Information Base)管理信息库
- 保存被管对象信息的(虚拟)数据库
- 被管对象用SMI定义
- 被管对象为树形结构
- 类似OSI, SNMP的被管对象也被组织在注册树中
- 基本被管对象:在SNMP中,只有处于叶子节点上的对象是可以直接访问的
directory(1): 为与OSI directory 相关的、将来的应用而保留
mgmt(2): 用于在IAB批准的文档中定义的对象
experimental(3): 用于表示在Internet 实验中应用的对象
private(4): 用于标识专用对象 :
- 目前只定义了一个子节点:enterprise
- 各厂商的mib在enterprise 中分别注册
- http://www.iana.org/assignments/enterprise-numbers
以RFC1155 MIB库介绍 SNMP的数据类型和结构
- 通俗地来描述EXPORT 有点像函数声明,声明以下名称的节点可以外部调用。
- 通过 OBJECT IDENTIFIER 创建节点并指定下挂的上级节点位置,如 directory 定义为 internet 的 1号子节点。
- RFC1155 库中定义的对象属性宏,创建了对象的基本属性,属于底层定义,我们只需会调用即可。
- 由OBJECT IDENTIFIER 创建了ObjectName, 用于定义被管对象的名称, 简单类比C语言的typedef 过程。
- 不同的对象可以赋予不同的数据类型,将会有不同的属性。
- 可以看到RFC 1155库中的自定义数据类型 IpAddress 等的定义过程
- 为了简化和规范定义方法,SMI定义了OBJECT-TYPE宏
- RFC1155-SMI中定义了OBJECT-TYPE宏
- RFC1212对OBJECT-TYPE宏进行了重新定义(完善)
可以看到完善后的宏更为直观易懂,包含了"SYNTAX", “ACCESS”,“STATUS”, value 等属性。
利用OBJECT-TYPE MACRO定义被管对象类,只要确定其名称、标识符,给出SYNTAX、ACCESS、STATUS、DESCRIPTION等参数即可,可以看成是OBJECT-TYPE MACRO的参数调用过程
定义表格
- 使用SEQUENCE、SEQUENCE OF来定义表格,注意要给出IndexPart参数
具体参考下方实例。
MIB库实际创建
系统:Windos 10 21H1 (由于win10很烂的更新,不同版本会遇到不同的状况,下面是我遇到的问题)
软件:iReasoning MIB Browser
1、安装SNMP Agent
然而,我没有这个选项,所以应该:
找到这个,安装
然而并不行,安装之后依然找不到,索性直接进行下一步,反而在服务里找到了正在运行的SNMP,所以这个版本win10不需要在windos功能里打勾
2、安装MIB Browser
例程:
编写一个“手机店”的 mib 库,该 mib 库位于enterprise节点下、编号为你的学号后5位节点下面。下级节点包括:
-
手机店名称 – 字符串,只读
-
手机店地址 – 字符串,只读
-
手机店老板姓名 – 字符串,读写
-
手机店手机总数 – 整数,只读
-
手机库存表
* 手机型号 – 字符串,具备唯一性,索引列 * 手机生产厂商 – 字符串,只读 * 手机CPU核数 – 整数,只读 * 手机内存大小 – 整数,只读。单位:GB * 手机存储大小 – 整数,只读。单位:GB * 该型号手机的库存数量 – 整数,只读
要求:可通过 MIB Browser 成功加载。
SHOUJIDIAN-MIB DEFINITIONS ::= BEGIN
-- 为注释,不影响代码
-- 引用RFC1155 和 RFC1212
IMPORTS
enterprises, Counter
FROM RFC1155-SMI
OBJECT-TYPE
FROM RFC-1212;
--定义enterprises下shoujidian节点
shoujidian OBJECT IDENTIFIER ::= { enterprises 10000 }
--为了方便,将OCTET STRING和INTEGER 定义为自己习惯的字符
String ::= OCTET STRING
Int ::= INTEGER
--手机店名称
--用宏定义创建对象StoreName,OCTET STRING 类型,长度0-10,只读,强制型,位于shoujidian 节点1位置
StoreName OBJECT-TYPE
SYNTAX String (SIZE(0..10))
ACCESS read-only
STATUS mandatory
DESCRIPTION
"cell phone store's name"
::= { shoujidian 1 }
--手机店地址
StoreAddress OBJECT-TYPE
SYNTAX String (SIZE(0..10))
ACCESS read-only
STATUS mandatory
DESCRIPTION
"cell phone store's address"
::= { shoujidian 2 }
--手机店老板姓名
BossName OBJECT-TYPE
SYNTAX String (SIZE(0..10))
ACCESS read-write
STATUS mandatory
DESCRIPTION
"name of cell phone store's boss"
::= { shoujidian 3 }
--手机店手机总数
NumofPhones OBJECT-TYPE
SYNTAX Int (0..65535)
ACCESS read-only
STATUS mandatory
DESCRIPTION
"number of phones "
::= { shoujidian 4 }
--库存信息
--创建table类型repertory,用SEQUENCE OF数据类型,位于shoujidian 5节点位置
repertory OBJECT-TYPE
SYNTAX SEQUENCE OF Repertory
ACCESS not-accessible
STATUS mandatory
DESCRIPTION
"Information of repertory"
::= { shoujidian 5 }
--列表下创建子对象,同时将其作为索引列。此处使用子对象PhoneModel作为索引。
repertorySituation OBJECT-TYPE
SYNTAX Repertory
ACCESS not-accessible
STATUS mandatory
DESCRIPTION
"cellphone model."
INDEX { PhoneModel }
::= { repertory 1 }
--声明Repertory所包含的对象及类型,用sequence 创建表格类型的对象
Repertory ::=
SEQUENCE{
PhoneModel
String,
Producter
String,
CPUNums
Int,
RAM
Int,
Storage
Int,
RepertoryNum
Int
}
--分别创建对象
PhoneModel OBJECT-TYPE
SYNTAX String (SIZE(0..10))
ACCESS read-only
STATUS mandatory
DESCRIPTION
"different type of cellphones"
::= { repertorySituation 1 }
Producter OBJECT-TYPE
SYNTAX String (SIZE(0..10))
ACCESS read-only
STATUS mandatory
DESCRIPTION
"producter"
::= { repertorySituation 2 }
CPUNums OBJECT-TYPE
SYNTAX Int (0..1000)
ACCESS read-only
STATUS mandatory
DESCRIPTION
"number of CPU kernals"
::= { repertorySituation 3 }
RAM OBJECT-TYPE
SYNTAX Int (0..65535)
ACCESS read-only
STATUS mandatory
DESCRIPTION
"Capacity of the memory module, units: GB"
::= { repertorySituation 4 }
Storage OBJECT-TYPE
SYNTAX Int (0..65535)
ACCESS read-only
STATUS mandatory
DESCRIPTION
"Storage of cellphone, units: GB"
::= { repertorySituation 5 }
RepertoryNum OBJECT-TYPE
SYNTAX Int (0..65535)
ACCESS read-only
STATUS mandatory
DESCRIPTION
"quantity in stock"
::= { repertorySituation 6 }
--结束标志
END