【前言】
用“监控软件”(solarwinds / cacti / mrtg ……)监控 各种设备的 时候,有一些数据不会被抓取到,自然就不会有显示,原因是这些软件没有被监控设备的 模板, 有一些 cacti 模板可以从网上找到,但 solarwinds 就找不到 UnDP 格式的模板了,这就需要知道被监控设备的 OID,而 OID 是通过 MIB 库来查找的。
===================================================================================
===================================================================================
【SNMP 简介】
SNMP 的目标是管理 Internet 上众多厂家生产的软硬件平台。
SNMP 的管理由三部分组成:① 管理信息库 MIB,② 管理信息结构 SMI,③ SNMP 本身。
===================================================================================
①【MIB】
Management Information Base 的缩写,中文名字叫“管理信息库”。
它是网络管理数据的标准,在这个标准里规定了网络代理设备必须保存的数据项目,数据类型,以及允许在每个数据项目中的操作。 通过对这些数据项目的存取访问,就可以得到该网关的所有统计内容。再通过对多个网关统计内容的综合分析即可实现基本的网络管理。
管理信息库 MIB 指明了网络元素所维持的变量(即能够被管理进程查询和设置的信息)。MIB 给出了一个网络中所有可能的被管理对象的集合的数据结构。SNMP 的管理信息库采用和域名系统 DNS 相似的树型结构,它的根在最上面,根没有名字。它又称为对象命名树(Object Naming Tree)。
对象命名树的顶级对象有三个,即 ISO、ITU-T 和这两个组织的联合体。在 ISO 的下面有 4 个结点,其中的一个(标号3)是被标识的组织。在其下面有一个美国国防部(Department of Defense)的子树(标号是6),再下面就是 Internet(标号是1)。在只讨论 Internet 中的对象时,可只画出 Internet 以下的子树(图中带阴影的虚线方框),并在 Internet 结点旁边标注上 {1.3.6.1} 即可。
在 Internet 结点下面的第二个结点是 mgmt(管理),标号是 2。再下面是管理信息库,原先的结点名是 mib。1991 年定义了新的版本 MIB-II,故结点名现改为 mib-2,其标识为 {1.3.6.1.2.1},或 {Internet(1) .2.1}。这种标识为对象标识符。
最初的结点 mib 将其所管理的信息分为 8 个类别。现在的 mib-2 所包含的信息类别已超过 40 个。
应当指出,MIB 的定义与具体的网络管理协议无关,这对于厂商和用户都有利。厂商可以在产品(如路由器)中包含 SNMP 代理软件,并保证在定义新的 MIB 项目后该软件仍遵守标准。用户可以使用同一网络管理客户软件来管理具有不同版本的 MIB 的多个路由器。当然,一个没有新的 MIB 项目的路由器不能提供这些项目的信息。
===================================================================================
② 【SMI】
SMI,Structure of Managerment Intormation,中文名称:管理信息结构。
它是简单网络管理协议(SNMP)的一部分,器指定了在 SNMP 的 MIB 中用于定义管理目标的规则。
SMI 是语言。是为了确保网络管理数据的语法和语义明确和无二义性而定义的语言。
它是定义悲观网络实体中特定数据的语言。
它定义了数据类型、对象模型,以及写入和修改管理信息的规则。
===================================================================================
③【SNMP 协议详解】
SNMP 是建立在 TCP/IP 公共网络上的公共网络管理协议。 简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering Task Force )定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP:Simple Gateway Monitor Protocol)。利用 SNMP,一个管理工作站可以远程管理所有支持这种协议的设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。虽然 SNMP 开始是面向基于 IP 的网络管理,但作为一个工业标准也被成功用于电话网络管理。
1. SNMP 基本原理
SNMP 采用了 Client/Server 模型的特殊形式:代理/管理站模型。对网络的管理与维护是通过管理工作站与 SNMP 代理间的交互工作完成的。每个 SNMP 从代理负责回答 SNMP 管理工作站(主代理)关于 MIB 定义信息的各种查询。下图是 NMS 公司网络产品中 SNMP 协议的实现模型。
SNMP 代理和管理站通过 SNMP 协议中的标准消息进行通信,每个消息都是一个单独的数据报。SNMP 使用 UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。SNMP 消息报文包含两个部分:SNMP 报头和协议数据单元 PDU。数据报结构如下图
版本识别符(version identifier):确保 SNMP 代理使用相同的协议,每个 SNMP 代理都直接抛弃与自己协议版本不同的数据报。
团体名(Community Name):用于 SNMP 从代理对SNMP管理站进行认证;如果网络配置成要求验证时,SNMP 从代理将对团体名和管理站的IP地址进行认证,如果失败,SNMP 从代理将向管理站发送一个认证失败的 Trap 消息
协议数据单元(PDU):其中 PDU 指明了 SNMP 的消息类型及其相关参数。
2. 管理信息库 MIB
IETF 规定的管理信息库 MIB(由中定义了可访问的网络设备及其属性,由对象识别符(OID:Object Identifier)唯一指定。MIB是一个树形结构,SNMP 协议消息通过遍历 MIB 树形目录中的节点来访问网络中的设备。
下图给出了 NMS 系统中 SNMP 可访问网络设备的对象识别树(OID:Object Identifier)结构。
下图给出了对一个 DS1 线路状态进行查询的 OID 设置例子。
3. SNMP 的五种消息类型
SNMP 中定义了五种消息类型:Get-Request、Get-Response、Get-Next-Request、Set-Request、Trap
① Get-Request 、Get-Next-Request与Get-Response
SNMP 管理站用 Get-Request 消息从拥有 SNMP 代理的网络设备中检索信息,而 SNMP 代理则用 Get-Response 消息响应。Get-Next-Request 用于和 Get-Request 组合起来查询特定的表对象中的列元素。如:首先通过下面的原语获得所要查询的设备的接口数:
{iso org(3) dod(6) internet(1) mgmt(2) mib(1) interfaces(2) ifNumber(2)}
后再通过下面的原语,进行查询(其中第一次用Get-Request,其后用Get-Next-Request):
{iso org(3) dod(6) internet(1) mgmt(2) mib(1) interfaces(2) ifTable(2)}
② Set-Request
SNMP管理站用Set-Request 可以对网络设备进行远程配置(包括设备名、设备属性、删除设备或使某一个设备属性有效/无效等)。
③ Trap
SNMP 代理使用 Trap 向 SNMP 管理站发送非请求消息,一般用于描述某一事件的发生。
SNMP 管理信息库 MIB管理信息库MIB指明了网络元素所维持的变量(即能够被管理进程查询和设置的信息)。MIB 给出了一个网络中所有可能的被管理对象的集合的数据结构。SNMP 的管理信息库采用和域名系统 DNS 相似的树型结构,它的根在最上面,根没有名字。下图画的是管理信息库的一部分,它又称为对象命名(objectnamingtree)。
管理信息库的对象命名举例
对象命名树的顶级对象有三个,即 ISO、ITU-T 和这两个组织的联合体。在 ISO 的下面有4个结点,其中的饿一个(标号3)是被标识的组织。在其下面有一个美国国防部(Department of Defense)的子树(标号是6),再下面就是 Internet(标号是1)。在只讨论Internet中的对象时,可只画出Internet以下的子树(图中带阴影的虚线方框),并在Internet结点旁边标注上{1.3.6.1}即可。 在Internet结点下面的第二个结点是mgmt(管理),标号是2。再下面是管理信息库,原先的结点名是 mib。1991 年定义了新的版本 MIB-II,故结点名现改为mib-2,其标识为{1.3.6.1.2.1},或{Internet(1) .2.1}。这种标识为对象标识符。
最初的结点mib将其所管理的信息分为8个类别,见表1。现在的 mib-2 所包含的信息类别已超过 40 个。
表1 最初的结点 mib 管理的信息类别。
应当指出,MIB 的定义与具体的网络管理协议无关,这对于厂商和用户都有利。厂商可以在产品(如路由器)中包含 SNMP 代理软件,并保证在定义新的 MIB 项目后该软件仍遵守标准。用户可以使用同一网络管理客户软件来管理具有不同版本的 MIB 的多个路由器。当然,一个没有新的 MIB 项目的路由器不能提供这些项目的信息。
这里要提一下 MIB 中的对象{1.3.6.1.4.1},即 enterprises(企业),其所属结点数已超过3000。例如IBM为11.3.6.1.4.1.2},Cisco为{1.3.6.1.4.1.9},Novell 为{1.3.6.1.4.1.23}等。世界上任何一个公司、学校只要用电子邮件发往 [email protected] 进行申请即可获得一个结点名。这样各厂家就可以定义自己的产品的被管理对象名,使它能用 SNMP 进行管理。
===================================================================================
SNMP 采用的是 UDP(用户数据报协议)作为其传输层协议,传输端口:
SNMP Agent : UDP 161
SNMP Manager : UDP 162
===================================================================================
【SNMP 各个版本的区别】
【SNMPv1】
是一种简单的请求 / 响应协议。网络管理系统发出一个请求,管理器则返回一个响应。这一行为的实现是通过使用四种协议操作中的其中任一种完成的。这四种操作分别是 GET、GETNEXT、SET 和 TRAP。
【SNMPv2】
由 SNMPv1 演化而来。SNMPV1 中的 GET、GETNEXT 及 SET 操作同样适用于 SNMPV2 ,只是 SNMPV2 添加和增强了有关协议操作。例如: SNMPV2 中的 TRAP 操作,不但具备 SNMPV1 中 TRAP 的相同功能,而且它采用了一种不同的消息格式,它用于替换 SNMPV1中的 TRAP 。
【SNMPv3】
增加了安全管理方式及远程控制。 SNMPV3 结构引入了基于用户的安全模型用于保证消息安全及基于视图的访问控制模型用于访问控制(USM)。这种安全管理方式支持不同安全性,访问控制及消息处理等模式的并发使用,其具体说明如下:
* 安全性
* 认证和隐私
* 授权和访问控制
* 管理框架
* 实体命名
* 人员和政策
* 用户名及密钥管理
* 通知目标文件
* 代理关系
* SNMP 中的远程配置
===================================================================================
===================================================================================
【配置】snmp
===================================================================================
编辑 /etc/snmp/snmpd.conf
① 定义一个共同体名(community),这里是 qu6zhi,及可以访问这个 qu6zhi 的用户名(sec name),这里是 notConfigUser。qu6zhi 相当于用户 notConfigUser 的密码。
② 定义一个组名(groupName)这里是 notConfigGroup,及组的安全级别,把 notConfigUser 这个用户加到这个组中。
③ 定义一个可操作的范围(view)名, 这里是 all,范围是 .1
④ 定义 notConfigUser 这个组在 all 这个 view 范围内可做的操作,这时定义了 notConfigUser 组的成员可对 .1 这个范围做只读操作。
# vi /etc/snmp/snmpd.conf
# sec.name source community
com2sec notConfigUser default qu6zhi
# groupName securityModel securityName
group notConfigGroup v1 notConfigUser
group notConfigGroup v2c notConfigUser
# name incl/excl subtree mask(optional)
view all included .1
# group context sec.model sec.level prefix read write notif
access notConfigGroup "" any noauth exact all none none
保存退出
⑤ 重启 snmpd 服务
# service snmpd restart
⑥ 列出 snmpd 开放端口
# netstat -anp|grep snmp
tcp 0 0 127.0.0.1:199 0.0.0.0:* LISTEN 18757/snmpd
udp 0 0 0.0.0.0:161 0.0.0.0:* 18757/snmpd
unix 2 [ ] DGRAM 31963 18757/snmpd
===================================================================================
查看阅读 mib-2 所管理的信息类别的 MIB 文件
# more /usr/share/snmp/mibs/RFC1213-MIB.txt
===================================================================================
用 snmpbulkwalk 命令连接 snmp 服务器,获取 snmp 服务器的【mib-2 各种信息】。
① snmpbulkwalk 用于通过 SNMPv2 的 SNMP GET BULK 请求命令与其它网络实体通信,只能用于 snmpv2,速度快于 snmpwalk。
② 指定共同体为 qu6zhi,协议为 snmp2c。
------------------------------------------------------------------------------------------------------------------------------------
③ 获取 mib-2 的 system 的数据,即 .1.3.6.1.2.1.1(iso->identifiedorganization->dod->internet->mgmt2->mib-2->system)
# snmpbulkwalk -v 2c 192.168.0.6 -c public .1.3.6.1.2.1.1
Timeout: No Response from 192.168.0.222
# snmpd -d -f -L -c /etc/snmp/snmpd.conf
netsnmp_assert !"registration != duplicate" failed agent_registry.c:536 netsnmp_subtree_load()
[init_smux] bind failed: Address already in use
Error opening specified endpoint "udp:161"
Server Exiting with code 1
------------------------------------------------------------------------------------------------------------------------------------
④ 获取 mib-2 的 interface 的数据,即.1.3.6.1.2.1.2(iso->identifiedorganization->dod->internet->mgmt2->mib-2->interface)
# snmpbulkwalk -v 2c 192.168.0.6 -c public .1.3.6.1.2.1.2
⑤ 获取 mib-2 的 address translation 的数据,即.1.3.6.1.2.1.3(iso->identifiedorganization->dod->internet->mgmt2->mib-2->address translation)
# snmpbulkwalk -v 2c 192.168.0.6 -c qu6zhi .1.3.6.1.2.1.3
⑥ 获取 mib-2 库的 ip 的数据,即.1.3.6.1.2.1.4(iso->identified organization->dod->internet->mgmt2->mib-2->ip)
# snmpbulkwalk -v 2c 192.168.0.6 -c qu6zhi .1.3.6.1.2.1.4
⑦ 获取 mib-2 库的 icmp 的数据,即.1.3.6.1.2.1.5(iso->identifiedorganization->dod->internet->mgmt2->mib-2->icmp)
# snmpbulkwalk -v 2c 192.168.0.6 -c qu6zhi .1.3.6.1.2.1.5
⑧ 获取 mib-2 库的 tcp 的数据,即.1.3.6.1.2.1.6(iso->identifiedorganization->dod->internet->mgmt2->mib-2->tcp)
# snmpbulkwalk -v 2c 192.168.0.6 -c qu6zhi .1.3.6.1.2.1.6
⑨ 获取 mib-2 库的 udp 的数据,即.1.3.6.1.2.1.7(iso->identifiedorganization->dod->internet->mgmt2->mib-2->udp)
# snmpbulkwalk -v 2c 192.168.0.6 -c qu6zhi .1.3.6.1.2.1.7
10)获取 mib-2 库的 snmp 的数据,即.1.3.6.1.2.1.11(iso->identifiedorganization->dod->internet->mgmt2->mib-2->snmp)
# snmpbulkwalk -v 2c 192.168.0.6 -c qu6zhi .1.3.6.1.2.1.11
===================================================================================
查看阅读 HOST-RESOURCES 的 MIB 文件
more /usr/share/snmp/mibs/HOST-RESOURCES-MIB.txt
===================================================================================
【HOST-RESOURCES】
查用 snmpwalk 命令连接 snmp 服务器(192.168.0.6),获取 snmp 服务器的【HOST-RESOURCES】的各种信息。
① 指定共同体为 qu6zhi,协议为 snmpv1
② 获取 HOST-RESOURCES的 host(所有资源)
# snmpwalk -v 1 192.168.0.6 -c public HOST-RESOURCES-MIB::host
③ 获取HOST-RESOURCES的 hrSystem(系统日期/时间,初始化设备,内核引导参数,系统当前的登录用户数,当前的进程数,支持的最大进程数)
# snmpwalk -v 1 192.168.0.6 -c qu6zhi HOST-RESOURCES-MIB::hrSystem
④ 获取 HOST-RESOURCES 的 hrStorage(内存大小,磁盘大小,使用情况等)
# snmpwalk -v 1 192.168.0.6 -c qu6zhi HOST-RESOURCES-MIB::hrStorage
⑤ 获取 HOST-RESOURCES 的 hrDevice(设备ID,设备类型,对设备的描述,引导盘,挂载分区等)
# snmpwalk -v 1 192.168.0.6 -c qu6zhi HOST-RESOURCES-MIB::hrDevice
⑥ 获取 HOST-RESOURCES 的 hrSWRun(线上系统的进程ID,进程名,涉及的参数,运行状态等)
# snmpwalk -v 1 192.168.0.6 -c qu6zhi HOST-RESOURCES-MIB::hrSWRun
⑦ 获取 HOST-RESOURCES 的 hrSWRunPerf(线上系统进程占用 CPU 的时间,占用内存的大小)
# snmpwalk -v 1 192.168.0.6 -c qu6zhi HOST-RESOURCES-MIB::hrSWRunPerf
⑧ 获取 HOST-RESOURCES 的 hrSWInstalledName(已安装的软件包名)和 hrSWInstalledDate(已安装的软件包时间)
# snmpwalk -v 1 192.168.0.6 -c qu6zhi HOST-RESOURCES-MIB::hrSWInstalledName
# snmpwalk -v 1 192.168.0.6 -c qu6zhi HOST-RESOURCES-MIB::hrSWInstalledDate
===================================================================================
查看阅读 IF-MIB 的 MIB 文件
# more /usr/share/snmp/mibs/IF-MIB.txt
===================================================================================
用 snmpdelta 命令连接 snmp 服务器(192.168.0.6),监控【网卡流量】等信息
① 指定共同体为 qu6zhi,协议为 snmpv1,以表格的方式输出结果,显示时间戳
② 监控IF-MIB::ifInUcastPkts(输入流量),IF-MIB::ifOutUcastPkts(输出流量),格式为