目录

1、SNMP诞生背景

2、SNMP简介

3、SNMP术语

4、SNMP的网络架构

5、MIB简介

6、SNMP协议的实现及常用指令

写在前面:

    此博文是笔者通过自己对SNMP的认识及参考互联网上的资料总结出来的博文,因知识背景不同难免会有错误,若有错误请博友们指正,通过此文想达到的目的:通过阅读此博文,能让你能轻松管理网络中基于snmp协议进行管理的设备。

注:文中的涉及的图片可能来源于互联网。

1、SNMP诞生背景

    试想这样一种场景,你是一个公司的IT管理者,你管理着公司的防火墙、路由器、交换机、服务器、PC、打印机等IT设备,而这些设备数量之多,而且品牌也不仅限于一个产商,如果一个商家对自己的设备有一个独有的协议来进行管理,这会让IT管理者非常头疼的一件事。有没有一个规范规定所有的IT产品的商家在管理上形成统一的接口,只要通过一种方式就能把所有设备进行统一管理,SNMP协议就是这样一种规范,这就是SNMP产生的背景。

2、SNMP简介

    简单网络管理协议(SNMP,Simple Network Management Protocol)也是基于C/S的模型,它实现了这样一种功能,当管理端需要获取被管理端的一个状态信息时,管理端就发送一个获取指令给被管理端,被管理端收到此指令后把管理端要获取的信息封装成报文后返回给管理端;当管理端需要修改被管理端上的一些配置参数时,管理端就发送一个修改指令给被管理端,被管理端收到后修改相应的配置,如果修改成功,则返回修改成功的信息给管理端,如果未修改成功,则返回相应的错误信息给管理端;如果被管理端自己知道自己发生了故障,那它就主动发生一个消息给管理端,说明自己哪里出现了故障。

    SNMP主要有三个版本,SNMPv1、SNMPv2c、SNMPv3。SNMPv1版是最始的版本,实现简单,存在较多安全缺陷,SNMPv2c版本质上与SNMPv1相同,只是在前一版上在功能上做了加强,并增加了getbulk操作等,还增加了一些更直观的错误响应,SNMPv3版解决了前两个版本在安全上的问题,采用了USM和VACM技术,增加了更强的认证机制。但这三个版中使用最多的依然是SNMPv1版,在现在各产家的IT设备中,有部分根本就不支持SNMPv3。

3、SNMP术语

zabbix SNMP agent 读取 设备温度_IT

除了上表中的术语,还有一个叫Agent,表示被监控端。

4、SNMP的网络架构

zabbix SNMP agent 读取 设备温度_配置文件_02

从上图中可知SNMP的由三部份组成,NMS、Agent、MIB。管理端(NMS)要想获取到监控数据时就向Agent(被监控端)发送get操作,Agent通过MIB库抓取到数据后就返还给NMS,如果是Agent主动向NMS发送信息,那就采用trap操作。

5、MIB简介

    MIB(Management Information Base,管理信息库):是一个类似DNS的倒状的树状结构的映射关系,如下图:

zabbix SNMP agent 读取 设备温度_操作系统_03

由上图可见,MIB是以树状结构来组织数据的,每一个节点表示一个被管理的对象,每一个对象都可以从根开始找出一条唯一的路径,这个路径就是OID,如图中的system的OID就是(.1.3.6.1.2.1.1)。

6、SNMP协议的实现及常用指令

    这里只讨论在类linux上的实现,在linux上SNMP协议的实现是通过安装相应的软件包实现的,可以采用源码安装方式,也可以采用rpm包的安装方式,在Yum源中一个是net-snmp,另一个是net-snmp-utils,Agent只安装net-snmp包,NMS只安装net-snmp-utils包即可,如果NMS也要被监控,那net-snmp也需要安装。Agent端监听在UDP的161端口,NMS监听在UDP的162(如果要接受trap操作)。

    我这里的实验环境:两台linux主机,nod0(192.168.0.200)为NMS,nod1(192.168.0.201)为Agent,系统都为CentOS 6.4 x86_64。

[



root@nod0 ~]# yum -y install net-snmp net-snmp-utils  #两个包都安装上
[root@nod0 ~]# rpm -ql net-snmp-utils #此软件包生成了众多工具
/usr/bin/encode_keychange
/usr/bin/snmpbulkget
/usr/bin/snmpbulkwalk
/usr/bin/snmpdelta
/usr/bin/snmpdf
/usr/bin/snmpget
/usr/bin/snmpgetnext
/usr/bin/snmpinform
/usr/bin/snmpnetstat
/usr/bin/snmpset
/usr/bin/snmpstatus
/usr/bin/snmptable
/usr/bin/snmptest
/usr/bin/snmptranslate
/usr/bin/snmptrap
/usr/bin/snmpusm
/usr/bin/snmpvacm
/usr/bin/snmpwalk
[root@nod0 ~]# rpm -ql net-snmp
/etc/rc.d/init.d/snmpd   #服务脚本
/etc/rc.d/init.d/snmptrapd  #服务脚本,
/etc/snmp
/etc/snmp/snmpd.conf  #配置文件
/etc/snmp/snmptrapd.conf  #配置文件
/etc/sysconfig/snmpd
/etc/sysconfig/snmptrapd
/usr/bin/net-snmp-create-v3-user
/usr/bin/snmpconf
/usr/sbin/snmpd
/usr/sbin/snmptrapd



安装好后启动服务:



[root@nod0 ~]# service snmpd start
Starting snmpd:                                            [  OK  ]
[root@nod0 ~]# service snmptrapd start
Starting snmptrapd:                                      [  OK  ]
在nod1上也安装上net-snmp:
[root@nod1 ~]# yum -y install net-snmp
[root@nod1 ~]# service snmpd start
Starting snmpd:                                            [  OK  ]



在Agent可以去查看一下配置文件“/etc/snmp/snmpd.conf”此配置文件多数是注释掉的,作为一个被监控端通常会被配置到的信息如下,

关于访问控制的,即哪个主机或网段可以从Agent上获取到信息:



# First, map the community name "public" into a "security name"
#       sec.name  source          community
com2sec notConfigUser  default       public



默认是以community为public来验证NMS发起的信息获取是不是以community为public发起的,如果是,则把要收集的信息获取后发送给NMS,如果不是,则拒绝响应。这里的community表示“社区、团体”,在此处就把它看成一个当作验证的密码。“source”默认为default,为了安全应该把“community”和"source"的两个值都做修改,如:



# First, map the community name "public" into a "security name"
#       sec.name  source          community
com2sec notConfigUser  192.168.0.0/24       testpublic



关于用户及组管理的:


####
# Second, map the security name into a group name:
#       groupName      securityModel securityName
group   notConfigGroup v1           notConfigUser
group   notConfigGroup v2c           notConfigUser


这里的用户及组与上边的结合起来看,这里的设置表示定义了v1版和v2c版SNMP的用户都为“notConfigUser”,而这个用户是否有权限来访问Agent,则要看上边的访问控制。

关于MIB访问控制的:



# Make at least  snmpwalk -v 1 localhost -c public system fast again.
#       name           incl/excl     subtree         mask(optional)
view    systemview    included   .1.3.6.1.2.1.1
view    systemview    included   .1.3.6.1.2.1.25.1.1



这部分是定义哪些MIB节点是可以访问的

incl 表示包含

excl 表示排除

mask 表示掩码

关于snmp的命令有许多,此处只挑选几个做说明:



[root@nod0 ~]# snmp
snmpbulkget    snmpd          snmpget        snmpnetstat    snmptable      snmptrap       snmpvacm
snmpbulkwalk   snmpdelta      snmpgetnext    snmpset        snmptest       snmptrapd      snmpwalk
snmpconf       snmpdf         snmpinform     snmpstatus     snmptranslate  snmpusm



snmpget命令:用snmp get操作向网络实体发起一个获取请求,此命令最后必须跟上至少一个OID


snmpget [COMMON OPTIONS] [-Cf] OID [OID]...
-v 1|2c|3       specifies SNMP version to use
-c COMMUNITY 指定community
举例:
[root@nod0 ~]# snmpget -v 2c -c testpublic 192.168.0.201 SNMPv2-MIB::sysName.0
SNMPv2-MIB::sysName.0 = STRING: nod1   #获取到192.168.0.201的主机名


snmpwalk命令:用snmp getnext请求指定MIB的子树



-v 1|2c|3       specifies SNMP version to use
-c COMMUNITY 指定community
举例:
[root@nod0 ~]# snmpwalk -v 2c -c testpublic 192.168.0.201 interfaces  #获取远程主机MIB中interfaces子树的全部信息
IF-MIB::ifNumber.0 = INTEGER: 2
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifType.1 = INTEGER: softwareLoopback(24)
IF-MIB::ifType.2 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifMtu.1 = INTEGER: 16436
IF-MIB::ifMtu.2 = INTEGER: 1500
IF-MIB::ifSpeed.1 = Gauge32: 10000000
IF-MIB::ifSpeed.2 = Gauge32: 0
IF-MIB::ifPhysAddress.1 = STRING:
IF-MIB::ifPhysAddress.2 = STRING: 0:c:29:c6:f7:7a
IF-MIB::ifAdminStatus.1 = INTEGER: up(1)
IF-MIB::ifAdminStatus.2 = INTEGER: up(1)
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
IF-MIB::ifOperStatus.2 = INTEGER: up(1)
IF-MIB::ifLastChange.1 = Timeticks: (0) 0:00:00.00
IF-MIB::ifLastChange.2 = Timeticks: (0) 0:00:00.00
IF-MIB::ifInOctets.1 = Counter32: 0
IF-MIB::ifInOctets.2 = Counter32: 7789122
IF-MIB::ifInUcastPkts.1 = Counter32: 0
IF-MIB::ifInUcastPkts.2 = Counter32: 7687
IF-MIB::ifInNUcastPkts.1 = Counter32: 0
IF-MIB::ifInNUcastPkts.2 = Counter32: 0
IF-MIB::ifInDiscards.1 = Counter32: 0
IF-MIB::ifInDiscards.2 = Counter32: 0
IF-MIB::ifInErrors.1 = Counter32: 0
IF-MIB::ifInErrors.2 = Counter32: 0
IF-MIB::ifInUnknownProtos.1 = Counter32: 0
IF-MIB::ifInUnknownProtos.2 = Counter32: 0
IF-MIB::ifOutOctets.1 = Counter32: 0
IF-MIB::ifOutOctets.2 = Counter32: 484581
IF-MIB::ifOutUcastPkts.1 = Counter32: 0
IF-MIB::ifOutUcastPkts.2 = Counter32: 5040
IF-MIB::ifOutNUcastPkts.1 = Counter32: 0
IF-MIB::ifOutNUcastPkts.2 = Counter32: 0
IF-MIB::ifOutDiscards.1 = Counter32: 0
IF-MIB::ifOutDiscards.2 = Counter32: 0
IF-MIB::ifOutErrors.1 = Counter32: 0
IF-MIB::ifOutErrors.2 = Counter32: 0
IF-MIB::ifOutQLen.1 = Gauge32: 0
IF-MIB::ifOutQLen.2 = Gauge32: 0
IF-MIB::ifSpecific.1 = OID: SNMPv2-SMI::zeroDotZero
IF-MIB::ifSpecific.2 = OID: SNMPv2-SMI::zeroDotZero



snmpbulkwalk命令:用snmp getbulk对指定对象的MIB上的树进行查询,用法与snmpwalk一样。

snmptranslate命令:这个命令可以让名称性的OID转换为数字型



举例:
[root@nod0 ~]# snmptranslate -On -IR system   (-On表示以数字格式输出,-IR表示随机访问MIB)
.1.3.6.1.2.1.1
[root@nod0 ~]# snmptranslate -Onf -IR system  (-f表示列出名称型的OID)
.iso.org.dod.internet.mgmt.mib-2.system




转载于:https://blog.51cto.com/zhaochj/1656670