简单网络管理协议(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(输出流量),格式为<object>.<instance>,如监控本地的第二块网卡 instance 为 2
③ 监控 ifInDiscards(已经丢弃的收到的数据包的总数),格式同上
# snmpdelta -c qu6zhi -v 1 -Cs -CT 192.168.0.6 IF-MIB::ifInUcastPkts.2 IF-MIB::ifOutUcastPkts.2
# snmpdelta -c qu6zhi -v 1 -Cs -CT 192.168.0.6 ifInDiscards.2
===================================================================================
用 snmpnetstat 命令连接 snmp 服务器(192.168.0.6),查看 snmp 服务器的
【端口连接信息】。
① 指定共同体为 qu6zhi,协议为
snmp2c
② 获取 192.168.0.6 的所有开放端口状态
# snmpnetstat -v 2c -c qu6zhi -a 192.168.0.6
③ 获取 192.168.0.6 的网络接口状态
# snmpnetstat -v 2c -c qu6zhi -i 192.168.0.6
④ 获取 192.168.0.6 的 TCP 协议的开放端口状态
# snmpnetstat -v 2c -c qu6zhi -P tcp 192.168.0.6
===================================================================================
用 snmptranslate 命令在 MIB OID 在数字和文字名称之间进行转换
① 用 snmptranslate 把 symbol 格式的 HOST-RESOURCES-MIB::hrSystem 转换为 numberic 格式的 oid,用-On(输出数字格式的 oid),使用 -IR(允许“随机”访问 MIB)
② 用 snmptranslate 把 symbol 格式的 HOST-RESOURCES-MIB::hrSystem 转换为 symbol 格式的 oid,用-Onf(输出符号格式的 oid)
# snmptranslate -On -IR HOST-RESOURCES-MIB::hrSystem
③ 用 snmptranslate 输出该对象(iso.org.dod.internet.mgmt.mib-2)的详细定义,用 -Td(包括文字名称、所属 MIB、类型、状态、读写权限、描述信息,数字格式的 OID)
# snmptranslate -Onf -IR HOST-RESOURCES-MIB::hrSystem
④ 用 snmptranslate 打印从指定OID(.1.3.6.1.2.1)开始一直到该 OID(.1.3.6.1.2.1)所属的 MIB 子树末端的树型结构信息
# snmptranslate -Td iso.org.dod.internet.mgmt.mib-2
⑤ 用snmptranslate导出所有已经加载的 MIB 的数据,每个对象一行
⑥ 用snmptranslate导出所有已经加载的 MIB 的对象,并且输出完整的 oid 路径
⑦ 用snmptranslate导出已经加载的所有 MIB 的数字格式的 oid ,不含值和类型,仅仅有 oid 而已
⑧ 用snmptranslate只输出文字格式的 OID 名称而已
snmptranslate -Tp iso.org.dod.internet.mgmt.mib-2
snmptranslate -Ta
snmptranslate -Tl
snmptranslate -To
snmptranslate -Ts
===================================================================================
【查询 MID OID】
① 用 snmptranslate 【查询 MID OID】的数字为 1.3.6.1.4.1.2021 的详细信息
# snmptranslate -Td 1.3.6.1.4.1.2021
② 用 snmptranslate 列出 1.3.6.1.4.1.2021 树型结构
# snmptranslate -Tp 1.3.6.1.4.1.2021
③ 用snmpwalk连接 192.168.6.53 的 snmp,通过 UCD-SNMP-MIB 列出 proc 的信息
# snmpwalk -v 1 192.168.6.53 -c public .1.3.6.1.4.1.2021.2
④ 用 ps -e 找过三个进程,写入到 /etc/snmp/snmpd.conf 配置文件中,如:keventd,nfsd,bdflush
# vi /etc/snmp/snmpd.conf
找到# Process checks
加入:
proc keventd
proc nfsd
proc bdflush
⑤ 重启 snmpd 服务
# service snmpd restart
⑥ 再用 snmpwalk 连接 192.168.0.6 的 snmp,列出 proc 的信息
# snmpwalk -v 1 192.168.0.6 -c public .1.3.6.1.4.1.2021.2
===================================================================================
【shell 脚本的输出信息】
① 用 snmpwalk 连接 192.168.0.6 的 snmp,通过 UCD-SNMP-MIB 列出【shell 脚本的输出信息】
# snmpwalk -v 1 192.168.0.6 -c public .1.3.6.1.4.1.2021.8
② 编辑 /etc/snmp/snmpd.conf 文件,加入:exec echotest /bin/echo hello world 和 exec shelltest /bin/sh /tmp/shtest
# vi /etc/snmp/snmpd.conf
找到:# Executables/scrīpts
在后面加入:
exec echotest /bin/echo hello world
exec shelltest /bin/sh /tmp/shtest
保存退出
③ 编写脚本 shtest,输出 hello world
# cd /tmp/
# cat > shtest
#!/bin/sh
echo hello world
echo hi there
exit 35
④ 重启服务
# service snmpd restart
⑤ 用 snmpwalk 连接 192.168.0.6 的 snmp,列出 shell 脚本的输出信息
# snmpwalk -v 1 192.168.0.6 -c public .1.3.6.1.4.1.2021.8
===================================================================================
【磁盘信息】
① 用 snmpwalk 连接 192.168.0.6 的 snmp,通过 UCD-SNMP-MIB 列出
【磁盘信息】
# snmpwalk -v 1 192.168.0.6 -c public .1.3.6.1.4.1.2021.9
② 编辑 /etc/snmp/snmpd.conf 文件,加入根分区和 /boot 分区
# vi /etc/snmp/snmpd.conf
找到:disk checks
加入:
disk / 10000
disk /boot 10000
保存退出
③ 用 kill的方式重新读取配置
# kill -HUP `ps -e|grep snmpd|awk '{print $1}'`
④ 用 snmpwalk 连接 192.168.0.6 的 snmp,列出磁盘信息
# snmpwalk -v 1 192.168.0.6 -c public .1.3.6.1.4.1.2021.9
===================================================================================
【系统进程】
① 用 snmpwalk 连接 192.168.0.6 的 snmp,通过 UCD-SNMP-MIB 列出所有的
【系统进程】
# snmpwalk -v 1 192.168.0.6 -c public .1.3.6.1.4.1.2021.50
② 编辑 /etc/snmp/snmpd.conf 文件,加入:exec .1.3.6.1.4.1.2021.51 ps /bin/ps
# vi /etc/snmp/snmpd.conf
加入:
exec .1.3.6.1.4.1.2021.51 ps /bin/ps
保存退出
③ 用 kill 的方式重新读取配置
kill -HUP `ps -e|grep snmpd|awk '{print $1}'`
④ 用 snmpwalk 连接 192.168.0.6 的 snmp,列出系统信息
# snmpwalk -v 1 192.168.0.6 -c public .1.3.6.1.4.1.2021.50 diskPercent (.1.3.6.1.4.1.2021.9.1.9)
===================================================================================
参考:
http://blog.zhangjianfeng.com/article/418
【OID】http://hi.baidu.com/qu6zhi/blog/item/6d779a0f56fc50266059f32a.html
【MIB】http://hi.baidu.com/qu6zhi/blog/item/740090b5500d93c237d3ca54.html
【SMI】http://baike.baidu.com/view/807408.htm?fr=ala0_1_1