snmp trap 与snmp相关介绍安装命令以及Trap的发送与接收java实现

Posted sunrj_go

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了snmp trap 与snmp相关介绍安装命令以及Trap的发送与接收java实现相关的知识,希望对你有一定的参考价值。

snmp trap 与snmp 以及Trap的发送与接收java实现

SNMP简单概述

1.1、什么是Snmp

SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是"简单网络管理协议"。SNMP是一种简单网络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议。SNMP主要用于网络设备的管理。由于SNMP协议简单可靠 ,受到了众多厂商的欢迎,成为了目前最为广泛的网管协议。

SNMP协议主要由两大部分构成:SNMP管理站和SNMP代理。SNMP管理站是一个中心节点,负责收集维护各个SNMP元素的信息,并对这些信息进行处理,最后反馈给网络管理员;而SNMP代理是运行在各个被管理的网络节点之上,负责统计该节点的各项信息,并且负责与SNMP管理站交互,接收并执行管理站的命令,上传各种本地的网络信息。

SNMP管理站和SNMP代理之间是松散耦合。他们之间的通信是通过UDP协议完成的。一般情况下,SNMP管理站通过UDP协议向SNMP代理发送各种命令,当SNMP代理收到命令后,返回SNMP管理站需要的参数。但是当SNMP代理检测到网络元素异常的时候,也可以主动向SNMP管理站发送消息,通告当前异常状况。

SNMP的基本思想:为不同种类的设备、不同厂家生产的设备、不同型号的设备,定义为一个统一的接口和协议,使得管理员可以是使用统一的外观面对这些需要管理的网络设备进行管理。通过网络,管理员可以管理位于不同物理空间的设备,从而大大提高网络管理的效率,简化网络管理员的工作。

SNMP的工作方式:管理员需要向设备获取数据,所以SNMP提供了【读】操作;管理员需要向设备执行设置操作,所以SNMP提供了【写】操作;设备需要在重要状况改变的时候,向管理员通报事件的发生,所以SNMP提供了【Trap】操作。

1.2、为什么需要SNMP?

随着网络技术的飞速发展,在网络不断普及的同时也给网络管理带来了一些问题:
网络设备数量成几何级数增加,使得网络管理员对设备的管理变得越来越困难;同时,网络作为一个复杂的分布式系统,其覆盖地域不断扩大,也使得对这些设备进行实时监控和故障排查变得极为困难。
网络设备种类多种多样,不同设备厂商提供的管理接口(如命令行接口)各不相同,这使得网络管理变得愈发复杂。
在这种背景下,SNMP应运而生,SNMP是广泛应用于TCP/IP网络的网络管理标准协议,该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。通过“利用网络管理网络”的方式:

  • 网络管理员可以利用SNMP平台在网络上的任意节点完成信息查询、信息修改和故障排查等工作,工作效率得以提高。
  • 屏蔽了设备间的物理差异,SNMP仅提供最基本的功能集,使得管理任务与被管理设备的物理特性、网络类型相互独立,因而可以实现对不同设备的统一管理,管理成本低。
  • 设计简单、运行代价低,SNMP采用“尽可能简单”的设计思想,其在设备上添加的软件/硬件、报文的种类和报文的格式都力求简单,因而运行SNMP给设备造成的影响和代价都被最小化。

1.3、SNMP的基本组件

SNMP基本组件包括网络管理系统NMS(Network Management System)、代理进程(Agent)、被管对象(Managed Object)和管理信息库MIB(Management Information Base)。如图所示他们共同构成SNMP的管理模型,在SNMP的体系结构中都起着至关重要的作用。

NMS

NMS 在网络中扮演管理者角色,是一个采用 SNMP 协议对网络设备进行管理/监视的系统,运行在 NMS 服务器上。

NMS 可向设备上的 Agent 发出请求,查询或修改一个或多个具体的参数值。也可以接收 Agent 主动发送的 Trap 信息,以获知被管理设备当前的状态。

Agent

Agent 是被管理设备中的一个代理进程,用于维护被管理设备的信息数据并响应来自 NMS 的请求。Agent 接收到 NMS 的请求信息后,通过 MIB 表完成相应指令后,并把操作结果响应给 NMS。

当设备发生故障或者其它事件时,设备会通过 Agent 主动发送信息给 NMS,向NMS报告设备当前的状态变化。

MIB

MIB (管理信息库)就是一个虚拟的数据库,是所有被管对象的抽象集合,是在被管理设备端维护的设备状态信息集,指明了被管理设备所维护的变量(即能够被 Agent 查询和设置的信息)。MIB 在数据库中定义了被管理设备的一系列属性:对象的名称、对象的状态、对象的访问权限和对象的数据类型等。每一个Agent都维护这样一个MIB库,NMS可以对MIB库中的对象的值进行读取或者设置。

  • MIB是一个按照层次结构组织的树状结构,称为MIB树
  • 每个被管对象对应树形结构的一个叶子节点,称为一个object,拥有唯一的数字标识符
  • 网管通过读写MIB中的被管对象实现对设备的管理

MIB数据对象以一种树状分层结构进行组织,这个树状结构中的每个分枝都有一个专用的名字和一个数字形式的标识符。结构树的分枝实际表示的是数据对象的逻 辑分组。而树叶,有时候也叫节点(node),代表了各个数据对象。在结构树中使用子树表示增加的中间分枝和增加的树叶。
使用这个树状分层结构,MIB浏览器能够以一种方便而且简洁的方式访问整个MIB数据库。MIB浏览器是这样一种工具,它可以遍历整棵MIB结构树,通常 以图形显示的形式来表示各个分枝和树叶对象。可以通过其数字标识符来查找MIB中的数据对象,这个数字标识符号从结构树的顶部(或根部)开始,直到各个叶 子节点(即数据对象)为止。这种访问方式和文件系统的组织方式一致。两者的主要区别在于文件系统中的路径名可以以绝对也可以以相对方式表示,而MIB数据 对象只能以绝对方式表示,不能使用相对方式。
每一个节点都有一个对象标识符(OID)来唯一的标识,每个节点用数字和字符两种方式显示,其中对象标识符OID是由句点隔开的一组整数,也就是从根节点 通向它的路径。一个带标号节点可以拥有包含其它带标号节点为它的子树,如果没有子树它就是叶子节点,它包含一个值并被称为对象。比如网络设备名的oid 是.1.3.6.1.2.1.1.5.0,其值为设备名称的字符串。
网络资源被抽象为对象进行管理。但SNMP中的对象是表示被管资源某一方面的数据变量。对象被标准化为跨系统的类,对象的集合被组织为管理信息库 (MIB)。MIB作为设在代理者处的管理站访问点的集合,管理站通过读取MIB中对象的值来进行网络监控。管理站可以在代理者处产生动作,也可以通过修改变量值改变代理者处的配置。

通过 MIB,可以完成以下功能:

◆ Agent 通过 get 消息查询 MIB,可以获知设备当前的状态信息。

◆ Agent 通过 set 消息修改 MIB,可以设置设备的状态参数。

Management object

Management object 指被管理对象。每一个设备可能包含多个被管理对象,被管理对象可以是设备中的某个硬件(如一块接口板),也可以是某些硬件,软件(如路由选择协议)及其的配置参数的集合。

1.4、SNMP 和 UDP

SNMP采用UDP协议在管理端和agent之间传输信息。 SNMP采用UDP 161端口接收和发送请求,162端口接收trap,执行SNMP的设备缺省都必须采用这些端口。SNMP消息全部通过UDP端口161接收,只有Trap信息采用UDP端口162。

1.5、Snmp版本

SNMP 目前共有 3 个版本,分别为 v1、v2 和 v3,说明如下:

  • SNMP v1:是 SNMP 协议的最初版本,在 1988 年被制定,并被 Internet 体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案。不过依然是众多厂家实现SNMP基本方式。
  • SNMP v2:是 1992 年发布的 SNMP 的第二个版本。它修订了第一版,并且在性能、安全、机密性和管理者之间通信等方面进行了大量改进。通常被指是基于community的SNMP V2。Community实质上就是密码。
  • SNMP v3:是目前最新的版本。它是 2004 年制定的,协议编号为 RFC3411-RFC3418(STD0062)。它为提升协议的安全性,增加了认证和密文传输功能,它对网络管理最大的贡献在于其安全性

SNMP v3实现原理SNMP v1、 SNMP v2基本一致,主要区别在于SNMP v1、 SNMP v2通过只读团体名、只读团体名连接,而SNMP v3通过鉴权和加密连接,增加了身份验证和加密处理。
SNMPv1、SNMPv2c与SNMPv3三者之间有什么区别?

二、Snmp的实现结构

在具体实现上,SNMP为管理员提供了一个网管平台(NMS),又称为【管理站】,负责网管命令的发出、数据存储、及数据分析。【被】监管的设备上运行一个SNMP代理(Agent)),代理实现设备与管理站的SNMP通信。

管理站与代理端通过MIB进行接口统一,MIB定义了设备中的被管理对象。管理站和代理都实现了相应的MIB对象,使得双方可以识别对方的数据,实现通信。管理站向代理申请MIB中定义的数据,代理识别后,将管理设备提供的相关状态或参数等数据转换为MIB定义的格式,应答给管理站,完成一次管理操作。

三、Snmp有关的基本概念

一套完整的SNMP系统主要包括管理信息库(MIB)、管理信息结构(SMI)及SNMP报文协议。

管理信息库MIB:任何一个被管理的资源都表示成一个对象,称为被管理的对象。MIB是被管理对象的集合。它定义了被管理对象的一系列属性:对象的名称、对象的访问权限和对象的数据类型等。每个SNMP设备(Agent)都有自己的MIB。MIB也可以看作是NMS(网管系统)和Agent之间的沟通桥梁。它们之间的关系如图1所示

3.1、代理和管理站的模型

Snmp分2种角色:SNMP管理站(manager,我们的本机127.0.0.1)和SNMP代理(agent, 我们要操作的机器,比如 192.168.1.144)。管理站指的是运行了可以执行网络管理任务软件的服务器,通常被称作为网络管理工作站(NMS),NMS负责采样网络中agent的信息,并接受agent的trap。代理是实际网络设备中用来实现SNMP功能的部分。代理在UDP的161端口接收NMS的读写请求消息,管理站在UDP的162端口接收代理的事件通告消息。所以,一旦获取设备的访问权限(community,默认为public),就可以访问设备信息、改写和配置设备参数。由于采用UDP协议,不需要在代理和管理站之间保持连接。

3.2、SNMP的操作命令

SNMP协议之所以易于使用,这是因为它对外提供了三种用于控制MIB对象的基本操作命令。它们是:Get、Set 和 Trap。

Get:管理站读取代理者处对象的值。它是SNMP协议中使用率最高的一个命令,因为该命令是从网络设备中获得管理信息的基本方式。
Set:管理站设置代理者处对象的值。它是一个特权命令,因为可以通过它来改动设备的配置或控制设备的运转状态。它可以设置设备的名称,关掉一个端口或清除一个地址解析表中的项等。
Trap: 代理者主动向管理站通报重要事件。它的功能就是在网络管理系统没有明确要求的前提下,由管理代理通知网络管理系统有一些特别的情况或问题 发生了。如果发生意外情况,客户会向服务器的162端口发送一个消息,告知服务器指定的变量值发生了变化。通常由服务器请求而获得的数据由服务器的161 端口接收。Trap 消息可以用来通知管理站线路的故障、连接的终端和恢复、认证失败等消息。管理站可相应的作出处理。

3.3、SNMP 报文

SNMP协议定义了数据包的格式,及网络管理员和管理代理之间的信息交换,它还控制着管理代理的MIB数据对象。因此,可用于处理管理代理定义的各种任务。
一条SNMP消息由"版本号"、"SNMP共同体名"和"协议数据单元(PDU)"构成,数据包的长度不是固定的。

版本识别符(version identifier):用于说明现在使用的是哪个版本的SNMP协议,确保SNMP代理使用相同的协议,每个SNMP代理都直接抛弃与自己协议版本不同的数据报。
团体名(Community Name):团体(community)是基本的安全机制,用于实现SNMP网络管理员访问SNMP管理代理时的身份验证。类似于密码,默认值为 public。团体名(Community name)是管理代理的口令,管理员被允许访问数据对象的前提就是网络管理员知道网络代理的口令。如果把配置管理代理成可以执行Trap命令,当网络管理 员用一个错误的分区名查询管理代理时,系统就发送一个autenticationFailure trap报文。
协议数据单元(PDU):PDU (协议数据单元)是SNMP消息中的数据区, 即Snmp通信时报文数据的载体。PDU指明了SNMP的消息类型及其相关参数

PDU的5种协议数据单元:

SNMP规定了5种协议数据单元PDU(也就是SNMP报文),用来在管理进程和代理之间的交换。

get-request操作:从代理进程处提取一个或多个参数值。

get-next-request操作:从代理进程处提取紧跟当前参数值的下一个参数值。

set-request操作:设置代理进程的一个或多个参数值。

get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面三种操作的响应操作。trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。
前面的3种操作是由管理进程向代理进程发出的,后面的2个操作是代理进程发给管理进程的,为了简化起见,前面3个操作今后叫做get、get-next和set操作。图1描述了SNMP的这5种报文操作。请注意,在代理进程端是用熟知端口161俩接收get或set报文,而在管理进程端是用熟知端口162来接收trap报文。

SNMP的5种报文操作:

网管服务器 代理服务 MIB

  • get-request 请求查询
  • get-next-request 请求查询
  • set-request 设置
  • get-response 对前边的三种报文进行响应
  • Agent上出现一些告警,会通过trap上报给网关,端口是162

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7GOSS8gz-1650091948104)(clipboard-202204151103-rvsdd.png)]

四、SNMP的运行过程

驻留在被管设备上的AGENT从UDP端口161接受来自网管站的串行化报文,经解码、团体名验证、分析得到管理变量在MIB树中对应的节点,从相应的模块中得到管理变量的值,再形成响应报文,编码发送回网管站。网管站得到响应报文后,再经同样的处理,最终显示结果。

下面根据RFC1157详细介绍Agent接受到报文后采取的动作:

首先解码生成用内部数据结构表示的报文,解码依据ASN.1的基本编码规则,如果在此过程中出现错误导致解码失败则丢弃该报文,不做进一步处理。

第二步:将报文中的版本号取出,如果与本Agent支持的SNMP版本不一致,则丢弃该报文,不做进一步处理。当前北研的数据通信产品只支持SNMP版本1。

第三步:将报文中的团体名取出,此团体名由发出请求的网管站填写。如与本设备认可的团体名不符,则丢弃该报文,不做进一步处理,同时产生一个陷阱报文。SNMPv1只提供了较弱的安全措施,在版本3中这一功能将大大加强。

第四步:从通过验证的ASN.1对象中提出协议数据单元PDU,如果失败,丢弃报文,不做进一不处理。否则处理PDU,结果将产生一个报文,该报文的发送目的地址应同收到报文的源地址一致。

根据不同的PDU,SNMP协议实体将做不同的处理:

五、Snmp 的安装

我们需要安装下面三个软件包:

  • snmpd:snmp服务端软件

  • snmp:snmp客户端软件

  • snmp-mibs-downloader:用来下载更新本地mib库的软件

1、安装这三个软件:

sudo apt-get install snmpd snmp snmp-mibs-downloader

2、安装成功状态检查:

## 查看状态
sudo service snmpd status

## 测试看看服务是否正常
root@apig:/usr/share/snmp# snmpwalk -v 2c -c public localhost 1.3.6.1.2.1.1.1
iso.3.6.1.2.1.1.1.0 = STRING: "Linux apig 4.15.0-175-generic #184-Ubuntu SMP Thu Mar 24 17:48:36 UTC 2022 x86_64"

## 没有问题,有信息返回,那么接下来就直接进行各种配置了,不过在开始配置前先备份一下配置文件:
root@apig:/etc/snmp# sudo cp snmpd.conf snmpd.conf.ori 
root@apig:/etc/snmp# ls
snmp.conf  snmpd.conf  snmpd.conf.ori

root@apig:/etc/snmp# ls
snmp.conf  snmpd.conf  snmpd.conf.ori

root@apig:/usr/share/snmp# ls
mib2c-data  mibs  snmpconf-data  snmp_perl.pl

## 注意:如果没有mibs,需要手动安装 `sudo download-mibs`
需要注意的是,在安装snmp-mibs-downloader的过程中,程序会帮我们自动下载mib库,并保存在/usr/share/snmp/mibs目录中

六、ubuntu配置 SNMPv2

6.1、配置节点

修改/etc/snmp/snmpd.conf文件,大概在45行,将下面的两行注释掉:

# view   systemonly  included   .1.3.6.1.2.1.1
# view   systemonly  included   .1.3.6.1.2.1.25.1

增加下面一行:

view   systemonly  included   .1

这样的话,我们就可以获取更多的节点信息,因为如果不这样做,我们能够获取的信息,仅仅是上面两个注释掉的节点所包含的信息。

    修改之后,重启snmp服务,再使用命令观察一下:
root@apig:/etc/snmp# sudo service snmpd restart
root@apig:/etc/snmp# snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.4.3.0
iso.3.6.1.4.1.2021.4.3.0 = INTEGER: 4194300

OK,没有问题!不过需要注意的是,这里.1.3.6.1.4.1.2021.4.3.0表示的是LInux主机交换空间总量的一个节点,而输出4194300,就说明我们的主机上的交换空间总量大概就是4GB左右。

6.2.配置MIB库

虽然上面已经可以正常获取我们想要的信息,但是输出结果很不直观,这时我们配置一下MIB库就可以了,不过需要注意的是,这个配置是对客户端软件的配置(只不过现在还是在我的同一台服务器主机上进行操作)。

修改/etc/snmp/snmp.conf配置文件,将下面这一行注释掉:

# mibs :

然后重启snmp服务,再通过命令观察:

root@apig:/etc/snmp# sudo service snmpd restart
root@apig:/etc/snmp# snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.4.3.0
UCD-SNMP-MIB::memTotalSwap.0 = INTEGER: 4194300 kB

##  可以看到,现在的输出就非常直观了!这样之后,其实我们在获取相关节点信息时,也可以不用输入那一长串的数字了:
root@apig:/etc/snmp# snmpwalk -v 2c -c public localhost memTotalSwap.0
UCD-SNMP-MIB::memTotalSwap.0 = INTEGER: 4194300 kB
root@apig:/etc/snmp# snmpwalk -v 2c -c public localhost memTotalReal.0
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 8142012 kB

关于MIB库的节点值从哪里来,不需要去记,可以在网上找 https://blog.51cto.com/xpleaf/1757162

需要注意的是,现在只是在服务器端进行配置和测试,其实这一步的操作应该是在客户端(另一台主机上)完成的,这里只是为了方便。

6.2、配置共同体

其实所谓共同体,把它理解为一个密码就行了,前面我们在使用snmpwalk命令获取主机的信息时,有一个-c public的参数,其实就是指定了这个共同体为public,这是默认的配置,当然在实际中,我们不可能使用默认的值,因此需要把它修改一下。

修改配置文件/etc/snmp/snmpd.conf,大概在52行,将下面的两行:

rocommunity public  default    -V systemonly
rocommunity6 public  default   -V systemonly

修改为:

rocommunity   sunrj123  default    -V systemonly
rocommunity6 sunrj123  default   -V systemonly

那么这里就把共同体修改为sunrj123 了,重启snmp服务,通过命令观察一下:

root@apig:/etc/snmp# snmpwalk -v 2c -c public localhost memTotalReal.0
Timeout: No Response from localhost

root@apig:/etc/snmp# snmpwalk -v 2c -c sunrj123 localhost memTotalReal.0
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 8142012 kB

可以看到第一次获取信息不成功,因为我们已经更新了共同体,旧的public将不能再使用,否则认证失败就无法获取snmp提供的主机信息。

6.4.允许远程主机访问

默认情况下,snmp服务只是对本地开启,是无法通过远程获取该主机的snmp信息的:

root@apig:/etc/snmp# sudo netstat -antup | grep 161
udp        0      0 127.0.0.1:161           0.0.0.0:*                           19410/snmpd

可以看到,161端口只对本机开放(161端口号是snmp服务的端口号),我们需要修改一下,让snmp服务对外开放。

修改/etc/snmp/snmpd.conf配置文件,大概在15行,将下面一行注释掉:

agentAddress  udp:127.0.0.1:161

同时去掉下面这一行的注释:

#agentAddress udp:161,udp6:[::1]:161

重新启动snmp服务,再通过命令观察:
root@apig:/etc/snmp# sudo service snmpd restart
root@apig:/etc/snmp# sudo netstat -antup | grep 161
udp        0      0 0.0.0.0:161             0.0.0.0:*                           19770/snmpd         
udp6       0      0 ::1:161                 :::*                                19770/snmpd
可以看到服务已经对外开放了,并且同时支持IPv4和IPv6。

    这样之后,我们就能在远程主机进行测试。

7.(远程)测试

在服务器本地我们已经做过测试,并且没有问题,下面我们要做的是在远程主机进行测试。

我另一台远程主机上的操作系统也是Ubuntu 15.04,并且已经安装了snmp客户端软件和mib库下载软件,同时配置了MIB库,下面就直接进行远程的测试:

xpleaf@leaf:~$ snmpwalk -v 2c -c sunrj123 115.159.*.* memTotalSwap.0
UCD-SNMP-MIB::memTotalSwap.0 = INTEGER: 1950716 kB
xpleaf@leaf:~$ snmpwalk -v 2c -c sunrj123 115.159.*.* memTotalReal.0
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 8093524 kB
xpleaf@leaf:~$ snmpwalk -v 2c -c  sunrj123 115.159.*.* .1.3.6.1.4.1.2021.9.1.6.1
UCD-SNMP-MIB::dskTotal.1 = INTEGER: 8123832
    可以看到,测试完全没有问题!并且获取的值和前面有服务器本地得到的一样。

    当然,如果你发现还是获取不了的,那么你就需要考虑一下在服务器的主机上防火墙的设置有没有问题了。

七、、Ubuntu系统下 配置snmp v3

SNMP v3版本主要添加了用户访问权限和加密通讯,下面给出SNMP v3添加用户流程:

7.1 添加初始用户

修改SNMP代理程序配置文件vi /etc/snmp/snmpd.conf,在最后一行添加初始用户bootstap

...
createUser bootstrap MD5 temp_password DES

其中认证方式支持:MD5(推荐)、SHA-1,加密方式支持:DES、AES。现在添加了用户初始用户bootstrap,下面步骤中会使用初始用户添加其他用户。添加用户后可以设置用户权限:rwuser读写用户、rouser只读用户。

...
# priv指定用户必须加密传输
# 可以在用户后面添加OID,限定用户访问指定的OID
rwuser bootstrap priv
rwuser demo priv

7.2 使用初始用户添加普通用户

在3.1节中定义了用户demo,但是没有添加。可以使用snmpusm命令添加

# -l 指定安全级别,noAuthNoPriv(不认证不加密),authNoPriv(认证不加密),authPriv(认证加密)
# -a 认证算法
# -x 加密算法
# -A 认证密码
# -X 加密密码
snmpusm -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address create demo bootstrap

snmpusm -u bootstrap -l authPriv -a MD5 -x DES -A 12345678 -X 12345678 localhost:65000 create demo bootstrap
User successfully created.		# 显示添加用户成功

上面命令添加的用户demo认证和加密信息与用户bootstrap相同。可以使用如下命令修改用户认证密码,此密码至少为8位:

snmpusm -u demo -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address passwd temp_password new_password

snmpusm -u demo -l authPriv -a MD5 -x DES -A 12345678 -X 12345678 localhost:65000 passwd 12345678 123456789
SNMPv3 Key(s) successfully changed.

# 删除用户
snmpusm -u demo -l authPriv -a MD5 -x DES -A 12345678 -X 12345678 localhost:65000 delete demo 
User successfully deleted.

7.3 SNMPv3管理服务访问

可以使用以下命令访问:

# -u 指定用户
# agent_server_ip_address: 代理服务地址和端口
snmpget -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address 1.3.6.1.2.1.1.1.0

以上用户认证加密信息可以更方便地写到/etc/snmp/snmp.conf配置文件中:

defSecurityName demo
defSecurityLevel authPriv
defAuthType MD5
defPrivType DES
defAuthPassphrase new_password
defPrivPassphrase new_password
命令行选项描述转换的 snmp.conf 指令
-u usernameSNMPv3 用于认证的用户名defSecurityName username
-l authPriv认证的安全等级defSecurityLevel authPriv
-a MD5认证协议defAuthType MD5
-x DES加密协议defPrivType DES
-A passphrase指定用户的认证密码defAuthPassphrase passphrase
-X passphrase指定用户的加密密码defPrivPassphrase passphrase

配置好snmp.conf文件后,可以使用snmpget agent_server_ip_address sysUpTime.0访问SNMPv3代理。

相关命令:
–v:指定snmp的版本, 1或者2,该参数必须有。
–c:指定连接设备SNMPSNMP读团体密码,该参数必须有。
IP:指定要walk的设备的IP地址,该参数必须有。
OID:代表要获取设备的指标oid,该参数不是必须的。

snmpwalk -v 2c -c public localhost ipAddrTable

snmpwalk -v 2c -c public localhost ipNetToMediaTable

snmpwalk -v 2c -c public localhost ifTable

snmpwalk -v 2c -c public localhost ifDescr.1

snmpwalk -v 2c -c public localhost sysDescr

snmpwalk -v 2c -c public localhost  ipNetToMediaPhysAddress.3.192.168.31.212

snmpwalk -v 2c -c public localhost tcpConnState   //获取tcp连接状态

snmpwalk -v 2c -c public localhost tcpConnLocalAddress

snmpwalk -v 2c -c public localhost tcpConnLocalPort

snmpwalk -v 2c -c public192.168.237.50 .1.3.6.1.4.1.2021.10.1.3 #监控cpuload
snmpwalk -v 2c -c public 10.1.1.1 .1.3.6.1.2.1.25.2.2  取得系统总内存
snmpwalk -v 2c -c public 10.1.1.1 hrSystemNumUsers  取得系统用户数(注意:hrSystemNumUsers与.1.3.6.1.2.1.25.1.5是等效的)
snmpwalk -v 2c -c public 10.1.1.1 .1.3.6.1.2.1.4.20    取得IP信息
snmpwalk -v 2c -c public 10.1.1.1 system   查看系统信息
snmpwalk -v 2c -c public 10.1.1.1 ifDescr 获取网卡信息

snmpwalk 是对应 key值;
snmpget 是 对应 oid
snmpwalk是对OID值的遍历(比如某个OID值下面有N个节点,则依次遍历出这N个节点的值。如果对某个叶子节点的OID值做walk,则取得到数据就不正确了,因为它会认为该节点是某些节点的父节点,而对其进行遍历,而实际上该节点已经没有子节点了,那么它会取出与该叶子节点平级的下一个叶子节点的值,而不是当前请求的节子节点的值。)
snmpget是取具体的OID的值。(适用于OID值是一个叶子节点的情况)
e.g.
snmpwalk -v 2c -c 团体名 10.68.133.1 ifInDiscards
snmpget -v 2c -c 团体名 100.80.32.23 1.3.6.1.2.1.1.5.0

8、 SNMP Trap

SNMP Trap 是 SNMP 的一部分,当被监控段出现特定事件,可能是性能问题,甚至是网络设备接口宕掉等,代理端会给管理站发告警事件。假如在特定事件出现的时刻,不是由 Agent 主动通知 NMS,那么 NMS 必须不断地对 Agent 进行轮询。这是非常浪费计算资源的方法,正如人们用中断通知 CPU 数据的到达,而不是让 CPU 进行轮询一样。Trap 通知是更加合理的选择。

用一句话来说的话,SNMP Trap 就是被管理设备主动发送消息给 NMS 的一种机制trap的作用是,当设备(路由器)的出现问题的时候,可以向服务器传报消息

实现SNMP Trap的流程
◆SNMP Trap接收服务一直在端口162等待着请求,一旦接受任何请求,将发给SNMP Trap翻译。

◆通过MIB库的已知设备信息,SNMP Trap将会尽可能翻译Varbind的信息。

◆通过可配置的业务规则,可决定如何处理或者丢弃告警。

◆把产生的告警展现在事件管理,并且能产生相关的报警,提醒相关IT管理员。

◆如果事件与工单有绑定,可以触发相关工单。

◆系统管理员也可以通过不同格式的文件,导入新的设备信息进入Mocha BSM的MIB库。

关键功能亮点

◆事件驱动,***时间收到设备故障告警

◆提供SNMP Trap的接收,并通过对Trap信息翻译,展现事件

◆支持SNMP Trap的接收规则定义,过滤无用Trap信息

◆接收来自第三方管理软件SNMP Trap信息,或向第三方管理软件发送Trap信息,达到整合效果

◆定制SNMP Trap告警规则触发告警,提供多种方式发送告警信息

◆支持事件导出

◆支持各类设备厂家MIB库的导入

snmptrap的发送与接收

首先是管理方,需要先配置snmptrapd.conf,可以将之放在与snmpd.conf同一个路径下(/etc/snmp/snmptrapd.conf)

配置snmptrapd.conf:

# 其中authcommunity是为了设置所有用户的访问权限:可执行,记录,传递。
# 设置traphandle(即收到.1.3.6.1.4.1.2021.251.1类OID信息时,执行test.pl)。
authcommunity execute,log,net public

traphandle .1.3.6.1.4.1.2021.251.1 /root/traptest/test.pl

test.pl:

#!/usr/bin/perl

use strict;

my $file="file.trap";

open(HANDOUT,">>./$file");

while()



print HANDOUT "$_";


将此配置文件设置为默认配置文件,并启动snmptrapd进程:

snmptrapd -c /etc/snmp/snmptrapd.conf

监听并接收trap:

snmptrapd -d -f -Lo

在受管方,使用命令:

snmptrap -v 2c -c  sunrj123 10.2.2.127:162 "" .1.3.6.1.4.1.2021.251.1 sysLocation.0 s "this is test"

而后在管理方会接收到如下信息:

团队名:

团体名:communitystring。缺省是public,但一般为了安全起见,设备管理者都会改成自己的,相当于密码,用户不可能看到。

Trap的发送与接收java实现

package com.koal.service.alert;

import org.snmp4j.*;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

import java.io.IOException;

/**
 * 本类用于发送Trap信息
 *
 */
public class SnmpUtil 

    private Snmp snmp = null;

    private Address targetAddress = null;

    private TransportMapping transport = null;


    public static void main(String[] args) 

        SnmpUtil poc = new SnmpUtil();

        try 
            poc.init();

            //poc.sendV1Trap();

            poc.sendV2cTrap();
         catch (IOException e) 
            e.printStackTrace();
        

    

    public void init() throws IOException 
        //目标主机的ip地址 和 端口号
        targetAddress = GenericAddress.parse("udp:127.0.0.1/162");
        transport = new DefaultUdpTransportMapping();
        snmp = new Snmp(transport);
        transport.listen();
    


    public ResponseEvent sendV1Trap() throws IOException 
        PDUv1 pdu = new PDUv1();
        VariableBinding v = new VariableBinding();
        v.setOid(SnmpConstants.sysName);
        v.setVariable(new OctetString("SnmpV1 Trap  Test"));
        pdu.add(v);
        pdu.setType(PDU.V1TRAP);

        // set target
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString("public"));
        target.setAddress(targetAddress);
        // retry times when commuication error
        target.setRetries(2);
        // timeout
        target.setTimeout(1500);
        target.setVersion(SnmpConstants.version1);
        // send pdu, return response
        return snmp.send(pdu, target);
    

    public ResponseEvent sendV2cTrap() throws IOException 

        PDU pdu = new PDU();
        VariableBinding v = new VariableBinding();
        v.setOid(SnmpConstants.sysName);
        v.setVariable(new OctetString("SnmpV2 Trap"));
        pdu.add(v);
        pdu.setType(PDU.TRAP);

        // set target
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString("koal123"));
        target.setAddress(targetAddress);

        // retry times when commuication error
        target.setRetries(2);
        target.setTimeout(1500);
        target.setVersion(SnmpConstants.version2c);
        // send pdu, return response
        return snmp.send(pdu, target);

    


参考文章:https://blog.csdn.net/weixin_42551921/article/details/117479344

SNMP协议介绍

 

SNMP协议介绍

一、什么是SNMP

SNMP:“简单网络管理协议”,用于网络管理的协议。SNMP用于网络设备的管理。SNMP的工作方式:管理员需要向设备获取数据,所以SNMP提供了 “读”操作;管理员需要向设备执行设置操作,所以SNMP提供了“写”操作;设备需要在重要状况改变的时候,向管理员通报事件的发生,所以SNMP提供了 “Trap”操作。

二、SNMP背景

SNMP 的基本思想:为不同种类的设备、不同厂家生产的设备、不同型号的设备,定义为一个统一的接口和协议,使得管理员可以是使用统一的外观面对这些需要管理的网 络设备进行管理。通过网络,管理员可以管理位于不同物理空间的设备,从而大大提高网络管理的效率,简化网络管理员的工作。

三、SNMP结构概述

SNMP 被设计为工作在TCP/IP协议族上。SNMP基于TCP/IP协议工作,对网络中支持SNMP协议的设备进行管理。所有支持SNMP协议的设备都提供 SNMP这个统一界面,使得管理员可以使用统一的操作进行管理,而不必理会设备是什么类型、是哪个厂家生产的。如下图,

技术分享图片

 

四、SNMP支持的网管操作

对于网络管理,我们面对的数据是设备的配置、参数、状态等信息,面对的操作是读取和设置;同时,因为网络设备众多,为了能及时得到设备的重要状态,还要求设备能主动地汇报重要状态,这就是报警功能。如下图,

技术分享图片

 

  • Get:读取网络设备的状态信息。
  • Set:远程配置设备参数。
  • Trap:管理站及时获取设备的重要信息。

五、SNMP的实现结构

在具体实现上,SNMP为管理员提供了一个网管平台(NMS),又称为管理站,负责网管命令的发出、数据存储、及数据分析。被监管的设备上运行一个SNMP代理(Agent)),代理实现设备与管理站的SNMP通信。如下图,

技术分享图片

 

管理站与代理端通过MIB进行接口 统一,MIB定义了设备中的被管理对象。管理站和代理都实现了相应的MIB对象,使得双方可以识别对方的数据,实现通信。管理站向代理申请MIB中定义的 数据,代理识别后,将管理设备提供的相关状态或参数等数据转换为MIB定义的格式,应答给管理站,完成一次管理操作。

已 有的设备,只要新加一个SNMP模块就可以实现网络支持。旧的带扩展槽的设备,只要插入SNMP模块插卡即可支持网络管理。网络上的许多设备,路由器、交 换机等,都可以通过添加一个SNMP网管模块而增加网管功能。服务器可以通过运行一个网管进程实现。其他服务级的产品也可以通过网管模块实现网络管理,如 Oracle、WebLogic都有SNMP进程,运行后就可以通过管理站对这些系统级服务进行管理。

根据管理者和被管理的设备在网络管理操作中的不同职责,SNMP定义了3种角色。如下图,

技术分享图片

 

网络管理系统:又称管理站、NMS。是系统的控制台,向管理员提供界面以获取与改变设备的配置、信息、状态、操作等信息。管理站与Agent进行通信,执行相应的Set和Get操作,并接收代理发过来的警报(Trap)。

代 理:Agent是网络管理的代理人,负责管理站和设备SNMP操作的传递。介于管理站和设备之间,与管理站通信并相应管理站的请求,从设备获取相应的数 据,或对设备进行相应的设置,来响应管理站的请求。代理也需要具有根据设备的相应状态使用MIB中定义的Trap向管理站发送报告的能力。

代 理服务器:Proxy是一种特殊的代理,在不能直接使用SNMP协议的地方,如:异种网络、不同版本的SNMP代理等情况,Proxy代替相关设备向管理 站提供一种外观,为设备代理SNMP协议的实现。Proxy做了异种网络或不同版本代理和相应SNMP数据请求的转换工作。如下图,

技术分享图片

 

附:管理信息库MIB:定义了设备上可以使用的管理信息。代理和管理站使用MIB作为统一的数据接口通信。

六、SNMP的技术内容

如下图,

技术分享图片

 

七、SNMP的发展历史

  • 1989年—— SNMPv1
  • 1991年—— RMON(Remote Network Monitoring 远程网络监视),它扩充了SNMP的功能,包括对LAN的管理及对依附于这些网络的设备的管理。RMON 没有修改和增加SNMPv1,只是增加了SNMP监视子网的能力。
  • 1993年—— SNMPv2(SNMPv1的升级版)
  • 1995年—— SNMPv2正式版,其中规定了如何在基于OSI的网络中使用SNMP
  • 1995年—— RMON扩展为RMON2
  • 1998年—— SNMPv3,一系列文档定义了SNMP的安全性,并定义了将来改进的总体结构,SNMPv3可以和SNMPv2、SNMPv1一起使用。

     

八、SNMP的技术术语

  • SNMP:Simple Network Management Protocol(简单网络管理协议),是一个标准的用于管理基于IP网络上设备的协议。
  • MIB:Management Information Base(管理信息库),定义代理进程中所有可被查询和修改的参数。
  • SMI:Structure of Management Information(管理信息结构),SMI定义了SNMP中使用到的ASN.1类型、语法,并定义了SNMP中使用到的类型、宏、符号等。SMI用 于后续协议的描述和MIB的定义。每个版本的SNMP都可能定义自己的SMI。
  • ASN.1:Abstract Syntax Notation One(抽象语法定义)。用于定义语法的正式语言,在SNMP中定义SNMP的协议数据单元PDU和管理对象MIB的格式。SNMP只使用了ASN.1中 的一部分,而且使用ASN.1的语言特性定义了一些自定义类型和类型宏 ,这些组成了SMI。
  • PDU: Protocol Data Unit(协议数据单元),它是网络中传送的数据包。每一种SNMP操作,物理上都对应一个PDU。
  • NMS: Network Management System,网络管理系统,又名网络管理站,简称“管理站”。它是SNMP的总控机,提供统一的用户界面访问支持SNMP的设备,一般提供UI界面,并 有统计、分析等功能,是网管系统的总控制台。NMS是网络管理操作的发起者。
  • Agent: 是SNMP的访问代理,简称“代理”,为设备提供SNMP能力,负责设备与NMS的通信。
  • Proxy: 代理服务器,对实现不同协议的设备进行协议转换,使非IP协议的设备也能被管理。
  • Trap: 是由设备主动发出的报警数据,用于提示重要的状态的改变。
  • BER: Basic Encoding Rule,基本编码规格。描述如何将ASN.1类型的值编码为字符串的方法。它是ASN.1标准的一部分。BER编码将数据分成TLV三部分,T为Tag 的缩写,是类型标识;L为Length的缩写,标识类型的长度;V为Value的缩写,标识数据内容。按照TLV的顺序对数据进行编码,生成字节流。 SNMP使用BER将SNMP的操作请求和应答编码后进行传输,并用于接收端进行解码。

九、综合上述(总结)

1.SNMP现有几个版本

SNMP共有v1,v2,v3这三个版本:

  • v1和v2都具有基本的读、写MIB功能。
  • v2增加了警报、批量数据获取、管理站和管理站通信能力。
  • v3在v2的基础上增加了USM,使用加密的数据和用户验证技术,提高了安全性。
  • 另外,RMON是SNMP的一个重要扩展,为SNMP增加了子网流量、统计、分析能力。现有两个版本: Rmon:提供了OSI七层网络结构中网络层和数据链路层监视能力。Rmon2:提供了OSI七层网络结构中网络层之上各层的监视能力。

     

2.ASN.1、BER、SMI、MIB、PDU的关系

技术分享图片

 

  • ASN.1:高级的数据描述语言。描述数据的类型、结构、组织、及编码方法。包括符号和语法两部分。SNMP使用ASN.1描述PDU和管理学对象信息库MIB。
  • BER:ASN.1 的基本编码规则。描述具体的ASN.1对象如何编码为比特流在网络上传输。SNMP使用BER作为编码方案,数据首先先经过BER编码,再经由传输层协议 (一边是UDP)发往接收方。接收方在SNMP端口上收到PDU后,经过BER解码后,得到具体的SNMP操作数据。
  • SMI:是SNMP的描述方法。规定了使用ASN.1子类型、符号。ASN.1功能强大,但SNMP只用到了其中很小一部分,对于这一部分内容的描述,限定了范围,即为SMI。SMI规定了使用到的ASN.1类型、宏、符号等。SMI是ASN.1的一个子集和超集。
  • MIB: 是SNMP中使用到的管理信息库。定义了数据格式、类型、顺序、意义等,使用SMI中定义的类型和ASN.1中的基本类型对对象进行描述,是一个使用 SMI描述的管理信息库。每一类关心的事件都有一组MIB,比如网络接口有一颗MIB树,TCP有一颗MIB树,UDP也有一颗MIB树。
  • PDU:是SNMP的协议数据单元。PDU是基本的通信格式,使用ASN.1描述,使用BER编码,通过传输层协议传送。

3.比较规范的SNMP背景

SNMP作为一种过渡技术以其简单易用的特性被广泛使用,使用的网络产品提供对SNMP的支持。SNMP还扩展了具有远程管理功能的RMON,使得管理人员可以对整个子网进行管理,而不是对整个子网内的设备进行管理。

十、Net-SNMP

1.net-snmp简介

使用net-snmp作为学习SNMP的工具,搭建一个net-snmp环境。Net-snmp是一个开源的SNMP项目。最新版本为:5.7.2。net-snmp支持snmpv1、snmpv2、snmpv3,支持基于IPv4和IPv6的SNMP应用程序。

  • Net-snmp提供完整的API用于SNMP应用程序开发,包括C和Perl的API 。
  • 一个功能强大且可扩展的SNMP代理:snmpd开发者可以开发动态模块扩展snmpd,net-snmp内置扩展子代理与主代理的通信协议。
  • 提供众多命令行工具检查和使用SNMP协议
  • 一个图形化的MIB浏览工具
  • 一个Trap接收进程,用于接收和显示Trap,并将Trap记录到日志文件中。

     

2.net-snmp的安装与配置

官方网站: http://www.net-snmp.org/download.html ,net-snmp被很多商业化的Linux包含,但是大多数的Linux使用net-snmp的主代理实现Linux的SNMP支持。

./configure --with-default-snmp-version="3" --prefix="/usr/local/net-snmp" --with-sys-contact="@@no.where" --with-sys-location="China" --with-logfile="/var/log/snmpd.log"  --with-persistent-directory="/var/net-snmp"

 

prefix:net-snmp将要安装的路径

enable-mfd-rewrites:允许用新的MFD重写可用的mid模块 

with-default-snmp-version:默认的SNMP版本 

with-sys-contact:可以配置该设备的联系人 

with-sys-location:该设备的位置 

with-logfile:日志文件路径 

with-persistent-directory:不变数据存储目录

 

 

3.支持的平台

net-snmp可以在BSD UNIX、Linux、Windows等操作系统上编译运行。Windows下可以安装一个VMWare虚拟机软件,新建一个虚拟机,在虚拟机上安装Linux用来学习。

4.实验环境

  • 操作系统,CentOS 6.4 X86_64
  • 软件版本,net-snmp 5.5

5.同步时间

1 [[email protected] ~]# ntpdate 202.120.2.101

6.安装yum源

1
2
[[email protected] ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[[email protected] ~]# rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

7.查看一下net-snmp相关软件包

1
2
3
4
5
6
7
8
9
[[email protected] ~]# yum list all | grep net-snmp*
net-snmp.x86_64             1:5.5-44.el6_4.4        updates
net-snmp-devel.i686           1:5.5-44.el6_4.4        updates
net-snmp-devel.x86_64          1:5.5-44.el6_4.4        updates
net-snmp-libs.i686            1:5.5-44.el6_4.4        updates
net-snmp-libs.x86_64           1:5.5-44.el6_4.4        updates
net-snmp-perl.x86_64           1:5.5-44.el6_4.4        updates
net-snmp-python.x86_64          1:5.5-44.el6_4.4        updates
net-snmp-utils.x86_64          1:5.5-44.el6_4.4        updates

注,有两个重要的安装,net-snmp.x86_64 、net-snmp-utils.x86_64 一个是net-snmp软件包,另一个是snmp的工具包。下面我们来安装一下,

1 [[email protected] ~]# yum install -y net-snmp net-snmp-utils

8.查看一下安装的软件包

1
2
3
4
[[email protected] ~]# rpm -qa | grep net-snmp*
net-snmp-5.5-44.el6_4.4.x86_64
net-snmp-utils-5.5-44.el6_4.4.x86_64
net-snmp-libs-5.5-44.el6_4.4.x86_64

9.查看一下软件包具体安装的内容

下面是snmp软件包的内容,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
[[email protected] ~]# rpm -ql net-snmp-5.5-44.el6_4.4.x86_64
/etc/rc.d/init.d/snmpd #snmp的启动脚本
/etc/rc.d/init.d/snmptrapd
/etc/snmp #snmp配置文件目录
/etc/snmp/snmpd.conf #snmp配置文件
/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
/usr/share/doc/net-snmp-5.5
/usr/share/doc/net-snmp-5.5/AGENT.txt
/usr/share/doc/net-snmp-5.5/COPYING
/usr/share/doc/net-snmp-5.5/ChangeLog.trimmed
/usr/share/doc/net-snmp-5.5/EXAMPLE.conf
/usr/share/doc/net-snmp-5.5/FAQ
/usr/share/doc/net-snmp-5.5/NEWS
/usr/share/doc/net-snmp-5.5/PORTING
/usr/share/doc/net-snmp-5.5/README
/usr/share/doc/net-snmp-5.5/README.agent-mibs
/usr/share/doc/net-snmp-5.5/README.agentx
/usr/share/doc/net-snmp-5.5/README.krb5
/usr/share/doc/net-snmp-5.5/README.mib2c
/usr/share/doc/net-snmp-5.5/README.snmpv3
/usr/share/doc/net-snmp-5.5/README.thread
/usr/share/doc/net-snmp-5.5/TODO
/usr/share/doc/net-snmp-5.5/ipf-mod.pl
/usr/share/doc/net-snmp-5.5/passtest
/usr/share/man/man1/net-snmp-create-v3-user.1.gz #帮助文件
/usr/share/man/man1/snmpconf.1.gz
/usr/share/man/man5/snmp_config.5.gz
/usr/share/man/man5/snmpd.conf.5.gz
/usr/share/man/man5/snmpd.examples.5.gz
/usr/share/man/man5/snmpd.internal.5.gz
/usr/share/man/man5/snmptrapd.conf.5.gz
/usr/share/man/man5/variables.5.gz
/usr/share/man/man8/snmpd.8.gz
/usr/share/man/man8/snmptrapd.8.gz
/usr/share/snmp
/usr/share/snmp/snmpconf-data
/usr/share/snmp/snmpconf-data/snmp-data
/usr/share/snmp/snmpconf-data/snmp-data/authopts
/usr/share/snmp/snmpconf-data/snmp-data/debugging
/usr/share/snmp/snmpconf-data/snmp-data/mibs
/usr/share/snmp/snmpconf-data/snmp-data/output
/usr/share/snmp/snmpconf-data/snmp-data/snmpconf-config
/usr/share/snmp/snmpconf-data/snmpd-data
/usr/share/snmp/snmpconf-data/snmpd-data/acl
/usr/share/snmp/snmpconf-data/snmpd-data/basic_setup
/usr/share/snmp/snmpconf-data/snmpd-data/extending
/usr/share/snmp/snmpconf-data/snmpd-data/monitor
/usr/share/snmp/snmpconf-data/snmpd-data/operation
/usr/share/snmp/snmpconf-data/snmpd-data/snmpconf-config
/usr/share/snmp/snmpconf-data/snmpd-data/system
/usr/share/snmp/snmpconf-data/snmpd-data/trapsinks
/usr/share/snmp/snmpconf-data/snmptrapd-data
/usr/share/snmp/snmpconf-data/snmptrapd-data/authentication
/usr/share/snmp/snmpconf-data/snmptrapd-data/formatting
/usr/share/snmp/snmpconf-data/snmptrapd-data/logging
/usr/share/snmp/snmpconf-data/snmptrapd-data/runtime
/usr/share/snmp/snmpconf-data/snmptrapd-data/snmpconf-config
/usr/share/snmp/snmpconf-data/snmptrapd-data/traphandle
/var/run/net-snmp

下面是snmp的常用操作工具,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[[email protected] ~]# rpm -ql net-snmp-utils-5.5-44.el6_4.4.x86_64
/usr/bin/encode_keychange
/usr/bin/snmpbulkget #下面是snmp常用工具,下面我们会详细讲解
/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
/usr/share/man/man1/encode_keychange.1.gz
/usr/share/man/man1/snmpbulkget.1.gz
/usr/share/man/man1/snmpbulkwalk.1.gz
/usr/share/man/man1/snmpcmd.1.gz
/usr/share/man/man1/snmpconf.1.gz
/usr/share/man/man1/snmpdelta.1.gz
/usr/share/man/man1/snmpdf.1.gz
/usr/share/man/man1/snmpget.1.gz
/usr/share/man/man1/snmpgetnext.1.gz
/usr/share/man/man1/snmpinform.1.gz
/usr/share/man/man1/snmpnetstat.1.gz
/usr/share/man/man1/snmpset.1.gz
/usr/share/man/man1/snmpstatus.1.gz
/usr/share/man/man1/snmptable.1.gz
/usr/share/man/man1/snmptest.1.gz
/usr/share/man/man1/snmptranslate.1.gz
/usr/share/man/man1/snmptrap.1.gz
/usr/share/man/man1/snmpusm.1.gz
/usr/share/man/man1/snmpvacm.1.gz
/usr/share/man/man1/snmpwalk.1.gz
/usr/share/man/man5/snmp.conf.5.gz
/usr/share/man/man5/variables.5.gz

10.查看一下默认配置文件

注,大家可以看到默认配置文件有很多内容,但其实大部分都是注释。下面我们来讲解一下常用的配置选项,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
[[email protected] ~]# cat /etc/snmp/snmpd.conf
###############################################################################
#
# snmpd.conf:
#  An example configuration file for configuring the ucd-snmp snmpd agent.
#
###############################################################################
#
# This file is intended to only be as a starting point. Many more
# configuration directives exist than are mentioned in this file. For
# full details, see the snmpd.conf(5) manual page.
#
# All lines beginning with a ‘#‘ are comments and are intended for you
# to read. All other lines are configuration commands for the agent.
###############################################################################
# Access Control
###############################################################################
# As shipped, the snmpd demon will only respond to queries on the
# system mib group until this file is replaced or modified for
# security purposes. Examples are shown below about how to increase the
# level of access.
# By far, the most common question I get about the agent is "why won‘t
# it work?", when really it should be "how do I configure the agent to
# allow me to access it?"
#
# By default, the agent responds to the "public" community for read
# only access, if run out of the box without any configuration file in
# place. The following examples show you other ways of configuring
# the agent so that you can change the community names, and give
# yourself write access to the mib tree as well.
#
# For more information, read the FAQ as well as the snmpd.conf(5)
# manual page.
####
# First, map the community name "public" into a "security name"
#    sec.name source     community
com2sec notConfigUser default    public
####
# Second, map the security name into a group name:
#    groupName   securityModel securityName
group  notConfigGroup v1      notConfigUser
group  notConfigGroup v2c      notConfigUser
####
# Third, create a view for us to let the group have rights to:
# 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
####
# Finally, grant the group read-only access to the systemview view.
#    group     context sec.model sec.level prefix read  write notif
access notConfigGroup "" any    noauth  exact systemview none none
# -----------------------------------------------------------------------------
#下面的是一个例子,具体是关于怎么对本机或其他网络主机赋予权限
# Here is a commented out example configuration that allows less
# restrictive access.
# YOU SHOULD CHANGE THE "COMMUNITY" TOKEN BELOW TO A NEW KEYWORD ONLY
# KNOWN AT YOUR SITE. YOU *MUST* CHANGE THE NETWORK TOKEN BELOW TO
# SOMETHING REFLECTING YOUR LOCAL NETWORK ADDRESS SPACE.
##    sec.name source     community
#com2sec local   localhost    COMMUNITY
#com2sec mynetwork NETWORK/24   COMMUNITY
##   group.name sec.model sec.name
#group MyRWGroup any    local
#group MyROGroup any    mynetwork
#
#group MyRWGroup any    otherv3user
#...
##      incl/excl subtree             mask
#view all  included .1                80
## -or just the mib2 tree-
#view mib2  included .iso.org.dod.internet.mgmt.mib-2 fc
##        context sec.model sec.level prefix read  write notif
#access MyROGroup ""   any    noauth  0   all  none  none
#access MyRWGroup ""   any    noauth  0   all  all  all
###############################################################################
# Sample configuration to make net-snmpd RFC 1213.
# Unfortunately v1 and v2c don‘t allow any user based authentification, so
# opening up the default config is not an option from a security point.
#
# WARNING: If you uncomment the following lines you allow write access to your
# snmpd daemon from any source! To avoid this use different names for your
# community or split out the write access to a different community and
# restrict it to your local network.
# Also remember to comment the syslocation and syscontact parameters later as
# otherwise they are still read only (see FAQ for net-snmp).
#
# First, map the community name "public" into a "security name"
#    sec.name    source     community
#com2sec notConfigUser  default     public
# Second, map the security name into a group name:
#    groupName    securityModel  securityName
#group  notConfigGroup v1       notConfigUser
#group  notConfigGroup v2c       notConfigUser
# Third, create a view for us to let the group have rights to:
# Open up the whole tree for ro, make the RFC 1213 required ones rw.
#    name      incl/excl    subtree mask(optional)
#view  roview     included    .1
#view  rwview     included    system.sysContact
#view  rwview     included    system.sysName
#view  rwview     included    system.sysLocation
#view  rwview     included    interfaces.ifTable.ifEntry.ifAdminStatus
#view  rwview     included    at.atTable.atEntry.atPhysAddress
#view  rwview     included    at.atTable.atEntry.atNetAddress
#view  rwview     included    ip.ipForwarding
#view  rwview     included    ip.ipDefaultTTL
#view  rwview     included    ip.ipRouteTable.ipRouteEntry.ipRouteDest
#view  rwview     included    ip.ipRouteTable.ipRouteEntry.ipRouteIfIndex
#view  rwview     included    ip.ipRouteTable.ipRouteEntry.ipRouteMetric1
#view  rwview     included    ip.ipRouteTable.ipRouteEntry.ipRouteMetric2
#view  rwview     included    ip.ipRouteTable.ipRouteEntry.ipRouteMetric3
#view  rwview     included    ip.ipRouteTable.ipRouteEntry.ipRouteMetric4
#view  rwview     included    ip.ipRouteTable.ipRouteEntry.ipRouteType
#view  rwview     included    ip.ipRouteTable.ipRouteEntry.ipRouteAge
#view  rwview     included    ip.ipRouteTable.ipRouteEntry.ipRouteMask
#view  rwview     included    ip.ipRouteTable.ipRouteEntry.ipRouteMetric5
#view  rwview     included    ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaIfIndex
#view  rwview     included    ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaPhysAddress
#view  rwview     included    ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaNetAddress
#view  rwview     included    ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaType
#view  rwview     included    tcp.tcpConnTable.tcpConnEntry.tcpConnState
#view  rwview     included    egp.egpNeighTable.egpNeighEntry.egpNeighEventTrigger
#view  rwview     included    snmp.snmpEnableAuthenTraps
# Finally, grant the group read-only access to the systemview view.
#    group     context sec.model sec.level prefix read  write notif
#access notConfigGroup ""   any    noauth  exact roview rwview none
###############################################################################
# System contact information
#联系人信息
# It is also possible to set the sysContact and sysLocation system
# variables through the snmpd.conf file:
syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root <[email protected]> (configure /etc/snmp/snmp.local.conf)
# Example output of snmpwalk:
#  % snmpwalk -v 1 localhost -c public system
#  system.sysDescr.0 = "SunOS name sun4c"
#  system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.sunos4
#  system.sysUpTime.0 = Timeticks: (595637548) 68 days, 22:32:55
#  system.sysContact.0 = "Me <[email protected]>"
#  system.sysName.0 = "name"
#  system.sysLocation.0 = "Right here, right now."
#  system.sysServices.0 = 72
###############################################################################
# Logging
#日志信息
# We do not want annoying "Connection from UDP: " messages in syslog.
# If the following option is commented out, snmpd will print each incoming
# connection, which can be useful for debugging.
dontLogTCPWrappersConnects yes
# -----------------------------------------------------------------------------
###############################################################################
# Process checks.
#关于检测进程数目的有个OIDs,可以在enterprises.ucdavis.procTable查看
# The following are examples of how to use the agent to check for
# processes running on the host. The syntax looks something like:
#
# proc NAME [MAX=0] [MIN=0]
#
# NAME: the name of the process to check for. It must match
#     exactly (ie, http will not find httpd processes).
# MAX:  the maximum number allowed to be running. Defaults to 0.
# MIN:  the minimum number to be running. Defaults to 0.
#
# Examples (commented out by default):
#
# Make sure mountd is running
#proc mountd
# Make sure there are no more than 4 ntalkds running, but 0 is ok too.
#proc ntalkd 4
# Make sure at least one sendmail, but less than or equal to 10 are running.
#proc sendmail 10 1
# A snmpwalk of the process mib tree would look something like this:
#
# % snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.2
# enterprises.ucdavis.procTable.prEntry.prIndex.1 = 1
# enterprises.ucdavis.procTable.prEntry.prIndex.2 = 2
# enterprises.ucdavis.procTable.prEntry.prIndex.3 = 3
# enterprises.ucdavis.procTable.prEntry.prNames.1 = "mountd"
# enterprises.ucdavis.procTable.prEntry.prNames.2 = "ntalkd"
# enterprises.ucdavis.procTable.prEntry.prNames.3 = "sendmail"
# enterprises.ucdavis.procTable.prEntry.prMin.1 = 0
# enterprises.ucdavis.procTable.prEntry.prMin.2 = 0
# enterprises.ucdavis.procTable.prEntry.prMin.3 = 1
# enterprises.ucdavis.procTable.prEntry.prMax.1 = 0
# enterprises.ucdavis.procTable.prEntry.prMax.2 = 4
# enterprises.ucdavis.procTable.prEntry.prMax.3 = 10
# enterprises.ucdavis.procTable.prEntry.prCount.1 = 0
# enterprises.ucdavis.procTable.prEntry.prCount.2 = 0
# enterprises.ucdavis.procTable.prEntry.prCount.3 = 1
# enterprises.ucdavis.procTable.prEntry.prErrorFlag.1 = 1
# enterprises.ucdavis.procTable.prEntry.prErrorFlag.2 = 0
# enterprises.ucdavis.procTable.prEntry.prErrorFlag.3 = 0
# enterprises.ucdavis.procTable.prEntry.prErrMessage.1 = "No mountd process running."
# enterprises.ucdavis.procTable.prEntry.prErrMessage.2 = ""
# enterprises.ucdavis.procTable.prEntry.prErrMessage.3 = ""
# enterprises.ucdavis.procTable.prEntry.prErrFix.1 = 0
# enterprises.ucdavis.procTable.prEntry.prErrFix.2 = 0
# enterprises.ucdavis.procTable.prEntry.prErrFix.3 = 0
#
# Note that the errorFlag for mountd is set to 1 because one is not
# running (in this case an rpc.mountd is, but thats not good enough),
# and the ErrMessage tells you what‘s wrong. The configuration
# imposed in the snmpd.conf file is also shown.
#
# Special Case: When the min and max numbers are both 0, it assumes
# you want a max of infinity and a min of 1.
#
# -----------------------------------------------------------------------------
###############################################################################
# Executables/scripts
#snmpd可以运行一个脚本,并可以得到他的返回值(最后一个)在enterprises.ucdavis.extTable下查看
#
# You can also have programs run by the agent that return a single
# line of output and an exit code. Here are two examples.
#
# exec NAME PROGRAM [ARGS ...]
#
# NAME:   A generic name. The name must be unique for each exec statement.
# PROGRAM: The program to run. Include the path!
# ARGS:   optional arguments to be passed to the program
# a simple hello world
#exec echotest /bin/echo hello world
# Run a shell script containing:
#
# #!/bin/sh
# echo hello world
# echo hi there
# exit 35
#
# Note: this has been specifically commented out to prevent
# accidental security holes due to someone else on your system writing
# a /tmp/shtest before you do. Uncomment to use it.
#
#exec shelltest /bin/sh /tmp/shtest
# Then,
# % snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.8
# enterprises.ucdavis.extTable.extEntry.extIndex.1 = 1
# enterprises.ucdavis.extTable.extEntry.extIndex.2 = 2
# enterprises.ucdavis.extTable.extEntry.extNames.1 = "echotest"
# enterprises.ucdavis.extTable.extEntry.extNames.2 = "shelltest"
# enterprises.ucdavis.extTable.extEntry.extCommand.1 = "/bin/echo hello world"
# enterprises.ucdavis.extTable.extEntry.extCommand.2 = "/bin/sh /tmp/shtest"
# enterprises.ucdavis.extTable.extEntry.extResult.1 = 0
# enterprises.ucdavis.extTable.extEntry.extResult.2 = 35
# enterprises.ucdavis.extTable.extEntry.extOutput.1 = "hello world."
# enterprises.ucdavis.extTable.extEntry.extOutput.2 = "hello world."
# enterprises.ucdavis.extTable.extEntry.extErrFix.1 = 0
# enterprises.ucdavis.extTable.extEntry.extErrFix.2 = 0
# Note that the second line of the /tmp/shtest shell script is cut
# off. Also note that the exit status of 35 was returned.
# -----------------------------------------------------------------------------
###############################################################################
# disk checks
#硬盘分区的定义,语法如下,只有定义了才会取抓值。单位KB
# The agent can check the amount of available disk space, and make
# sure it is above a set limit.
# disk PATH [MIN=100000]
#
# PATH: mount path to the disk in question.
# MIN:  Disks with space below this value will have the Mib‘s errorFlag set.
#    Default value = 100000.
# Check the / partition and make sure it contains at least 10 megs.
#disk / 10000
# % snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.9
# enterprises.ucdavis.diskTable.dskEntry.diskIndex.1 = 0
# enterprises.ucdavis.diskTable.dskEntry.diskPath.1 = "/" Hex: 2F
# enterprises.ucdavis.diskTable.dskEntry.diskDevice.1 = "/dev/dsk/c201d6s0"
# enterprises.ucdavis.diskTable.dskEntry.diskMinimum.1 = 10000
# enterprises.ucdavis.diskTable.dskEntry.diskTotal.1 = 837130
# enterprises.ucdavis.diskTable.dskEntry.diskAvail.1 = 316325
# enterprises.ucdavis.diskTable.dskEntry.diskUsed.1 = 437092
# enterprises.ucdavis.diskTable.dskEntry.diskPercent.1 = 58
# enterprises.ucdavis.diskTable.dskEntry.diskErrorFlag.1 = 0
# enterprises.ucdavis.diskTable.dskEntry.diskErrorMsg.1 = ""
# -----------------------------------------------------------------------------
###############################################################################
# load average checks
#这个是定义cpu任务的负载信息的,值是平均最大值
# load [1MAX=12.0] [5MAX=12.0] [15MAX=12.0]
#
# 1MAX:  If the 1 minute load average is above this limit at query
#     time, the errorFlag will be set.
# 5MAX:  Similar, but for 5 min average.
# 15MAX: Similar, but for 15 min average.
# Check for loads:
#load 12 14 14
# % snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.10
# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.1 = 1
# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.2 = 2
# enterprises.ucdavis.loadTable.laEntry.loadaveIndex.3 = 3
# enterprises.ucdavis.loadTable.laEntry.loadaveNames.1 = "Load-1"
# enterprises.ucdavis.loadTable.laEntry.loadaveNames.2 = "Load-5"
# enterprises.ucdavis.loadTable.laEntry.loadaveNames.3 = "Load-15"
# enterprises.ucdavis.loadTable.laEntry.loadaveLoad.1 = "0.49" Hex: 30 2E 34 39
# enterprises.ucdavis.loadTable.laEntry.loadaveLoad.2 = "0.31" Hex: 30 2E 33 31
# enterprises.ucdavis.loadTable.laEntry.loadaveLoad.3 = "0.26" Hex: 30 2E 32 36
# enterprises.ucdavis.loadTable.laEntry.loadaveConfig.1 = "12.00"
# enterprises.ucdavis.loadTable.laEntry.loadaveConfig.2 = "14.00"
# enterprises.ucdavis.loadTable.laEntry.loadaveConfig.3 = "14.00"
# enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.1 = 0
# enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.2 = 0
# enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.3 = 0
# enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.1 = ""
# enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.2 = ""
# enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.3 = ""
# -----------------------------------------------------------------------------
###############################################################################
# Extensible sections.
# 与enterprises.ucdavis.extTable的区别
# This alleviates the multiple line output problem found in the
# previous executable mib by placing each mib in its own mib table:
# Run a shell script containing:
#
# #!/bin/sh
# echo hello world
# echo hi there
# exit 35
#
# Note: this has been specifically commented out to prevent
# accidental security holes due to someone else on your system writing
# a /tmp/shtest before you do. Uncomment to use it.
#
# exec .1.3.6.1.4.1.2021.50 shelltest /bin/sh /tmp/shtest
# % snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.50
# enterprises.ucdavis.50.1.1 = 1
# enterprises.ucdavis.50.2.1 = "shelltest"
# enterprises.ucdavis.50.3.1 = "/bin/sh /tmp/shtest"
# enterprises.ucdavis.50.100.1 = 35
# enterprises.ucdavis.50.101.1 = "hello world."
# enterprises.ucdavis.50.101.2 = "hi there."
# enterprises.ucdavis.50.102.1 = 0
# Now the Output has grown to two lines, and we can see the ‘hi
# there.‘ output as the second line from our shell script.
#
# Note that you must alter the mib.txt file to be correct if you want
# the .50.* outputs above to change to reasonable text descriptions.
# Other ideas:
#
# exec .1.3.6.1.4.1.2021.51 ps /bin/ps
# exec .1.3.6.1.4.1.2021.52 top /usr/local/bin/top
# exec .1.3.6.1.4.1.2021.53 mailq /usr/bin/mailq
#可以运行多个脚本
# -----------------------------------------------------------------------------
###############################################################################
# Pass through control.
#
# Usage:
#  pass MIBOID EXEC-COMMAND
#
# This will pass total control of the mib underneath the MIBOID
# portion of the mib to the EXEC-COMMAND.
#
# Note: You‘ll have to change the path of the passtest script to your
# source directory or install it in the given location.
#
# Example: (see the script for details)
#      (commented out here since it requires that you place the
#      script in the right location. (its not installed by default))
# pass .1.3.6.1.4.1.2021.255 /bin/sh /usr/local/local/passtest
# % snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.255
# enterprises.ucdavis.255.1 = "life the universe and everything"
# enterprises.ucdavis.255.2.1 = 42
# enterprises.ucdavis.255.2.2 = OID: 42.42.42
# enterprises.ucdavis.255.3 = Timeticks: (363136200) 42 days, 0:42:42
# enterprises.ucdavis.255.4 = IpAddress: 127.0.0.1
# enterprises.ucdavis.255.5 = 42
# enterprises.ucdavis.255.6 = Gauge: 42
#
# % snmpget -v 1 localhost public .1.3.6.1.4.1.2021.255.5
# enterprises.ucdavis.255.5 = 42
#
# % snmpset -v 1 localhost public .1.3.6.1.4.1.2021.255.1 s "New string"
# enterprises.ucdavis.255.1 = "New string"
#
# For specific usage information, see the man/snmpd.conf.5 manual page
# as well as the local/passtest script used in the above example.
###############################################################################
# Further Information
#
# See the snmpd.conf manual page, and the output of "snmpd -H".

下面是常用的配置选项,

主配置文件:/etc/snmp/snmpd.conf

常用定义项:

(1). 首选是定义一个共同体名(community),这里是public(多数SNMP设备或服务默认都是是用public),及可以访问这个public的 用户名(sec name),这里是notConfigUser。Public相当于用户notConfigUser的密码:) ,source 在net-snmp中用来对来源IP加以控制,即哪些可以获取SNMP信息

1
2
#        sec.name  source community
com2sec  notConfigUser  default  public

(2).定义一个组名(groupName)这里是notConfigGroup,及组的安全级别,把notConfigGroup这个用户加到这个组中。

sec.model:安全模式,可选值为v1/v2c/usm。

1
2
3
#     groupName  securityModel  securityName
group notConfigGroup  v1  notConfigUser
group notConfigGroup  v2c  notConfigUser

(3).定义一个可操作的范围(view)名, 这里是all,范围是 .1

1
2
#     name incl/excl  subtree mask(optional)
view  all included  .1 #表示可以查看.1节点下的所有设备信息

注:

  • incl/excl:对下面的MIB子树是包括还是排除。
  • subtree:视图中涉及的MIB子树。
  • mask:掩码

(4).定义notConfigUser这个组在all这个view范围内可做的操作(即权限),这时定义了notConfigUser组的成员可对.1这个范围做只读操作。

1
2
#      group  context  sec.model  sec.level  prefix  read  write  notif
access notConfigGroup "" any  noauth  exact  all none  none

注:

  • context:上下文,v1、v2c中始终为空。
  • sec.model:安全模式,可选值为v1/v2c/usm。
  • sec.level:安全级别,可选值为auth/noauth/priv,v1、v2c中只能为noauth。
  • prefix:前缀,指定context如何与PDU中的context匹配,v3使用。
  • read:授权的读视图。
  • write:授权的写视图。
  • notif:授权的trap视图。

(5).端口: 标准的SNMP服务使用161和162端口,厂商私有的实现一般使用199、391、705和1993端口,net-snmp用udp 161。

11.启动snmp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[[email protected] ~]# service snmpd start
正在启动 snmpd                      [确定]
[[email protected] ~]# netstat -ntulp
Active Internet connections (only servers)
Proto Recv-Send-Local Address        Foreign Address       State    PID/Program name
tcp    0   0 0.0.0.0:22         0.0.0.0:*          LISTEN   1045/sshd
tcp    0   0 127.0.0.1:25        0.0.0.0:*          LISTEN   1122/master
tcp    0   0 127.0.0.1:6010       0.0.0.0:*          LISTEN   2149/sshd
tcp    0   0 127.0.0.1:6011       0.0.0.0:*          LISTEN   1582/sshd
tcp    0   0 127.0.0.1:199        0.0.0.0:*          LISTEN   12252/snmpd
tcp    0   0 :::22            :::*            LISTEN   1045/sshd
tcp    0   0 ::1:25           :::*            LISTEN   1122/master
tcp    0   0 ::1:6010          :::*            LISTEN   2149/sshd
tcp    0   0 ::1:6011          :::*            LISTEN   1582/sshd
udp    0   0 0.0.0.0:161         0.0.0.0:*                12252/snmpd

12.测试一下

1
2
3
4
[[email protected] ~]# snmpd -v #查看一下net-snmp版本
NET-SNMP version: 5.5
Web:        http://www.net-snmp.org/
Email:       net-snmp-[email protected].sourceforge.net

注,启动代理时也可以使用如下参数使snmpd使用【配置文件】启动:

1
2
3
[[email protected] ~]# snmpd –C –c /etc/snmp/snmpd.conf
-不读取默认配置文件
-读取指定的配置文件

使用这个参数,我们可以配置很多的配置文件,设置不同的运行环境,便于我们开发和学习。

下面来测试一下,

从代理中读取一个管理对象验证代理是否正常运行。读取MIB库中的RFC1213->system->sysDescr 对象,该对象表示设备的描述信息。使用net-snmp提供的snmp工具读取,命令如下:

1
2
[[email protected] ~]# snmpget -v 2c -c public localhost sysDescr.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux node1.test.com 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64

注,如果得到了信息,表示net-snmp安装成功。

13.net-snmp工具介绍

1
2
3
4
snmpbulkget  snmpd     snmpget    snmpnetstat  snmptable   snmptrap    snmpvacm
snmpbulkwalk  snmpdelta   snmpgetnext  snmpset    snmptest    snmptrapd   snmpwalk
snmpconf    snmpdf     snmpinform   snmpstatus   snmptranslate snmpusm
  • snmpget 模拟snmp的GetRequest操作的工具。用来获取一个或几个管理信息。用来读取管理信息的内容。
  • snmpgetnext 模拟snmp的GetNextRequest操作的工具。用来获取一个管理信息实例的下一个可用实例数据。一般用来遍历SNMP中的表格数据。
  • snmpset 模拟snmp的SetRequest操作的工具。用来设置可以写的管理信息。一般用来配置设备或对设备执行操作。
  • snmpbulkget 模拟snmp的GetBulkRequest操作的工具。用来获取大块的数据。一般在大量读取大块数据时使用,以提高带宽利用率,并且比使用 snmpget、snmpgetnext及snmpwalk有更强的容错能力,代理会返回尽可能多的数据,比其它命令更有保证。
  • snmpwalk 利用GetNextRequest对给定的管理树进行遍历的工具。一般用来对表格类型管理信息进行遍历。
  • snmptrap 模拟trap的工具。用来发送模拟trap。一般用来测试管理站安装和配置是否正确,或者用来验证开发的Trap接收程序是否可以正常工作。
  • snmptrapd 接收并显示trap的工具。一般在代理的开发过程中,接收代理发来的Trap,并将PDU细节打印出来,也来测试Trap发送功能是否正常。
  • snmpinform 模拟发送InformRequest的工具。跟snmptrap类似,用来发送模拟的带应答的Trap,以测试管理站或自己开发的接收程序。
  • snmptable 使用GetNextRequest 和 GetBulkRequest操作读取表信息,以列表形式显示的工具。
  • snmpstatus 从SNMP实体读取几个重要的管理信息以确定设备状态的工具。用来简单测定设备状态。
  • snmpbulkwalk 利用GetBulkRequest实现对给定管理树进行遍历的工具。对表格类型的管理信息进行遍历读取。
  • snmpdelta 用来监视Integer类型的管理对象,会及时报告值改变情况的工具。用于监测一个设备或开发中的代理。
  • snmptest 是一个复杂的工具,可以监测和管理一个网络实体的信息,通过SNMP请求操作与管理实体通信。
  • snmptranslate 将对象名字和标识符相互转换的工具。用于数据格式的对象标识和可读式字符串的数据名称的转换。类似于域名与IP地址的关系。
  • snmpusm SNMPv3 USM配置工具。用于SNMPv3的用户管理。
  • snmpvacm 为一个网络实体创建和维护SNMPv3的基于视图访问控制参数的工具。用于维护SNMPv3的视图访问控制。
  • snmpconf 生成snmpd配置文件的工具。用于生成snmpd的各种配置文件,用作模板,以生成用户级配置文件。
  • snmpd Net-snmp开发的主代理程序,包括众多标准MIB的实现。还可以使用子代理对其进行扩展,是一个功能强大的SNMP代理。Linux、Unix和 Windows系统运行snmpd后,直接具备了SNMP协议支持,可以被管理站管理。许多商业化的Linux中使用snmpd作为系统的SNMP代理。
  • snmpdf 通过SNMP访问并显示网络实体磁盘利用情况的工具。用来监测网络实体的磁盘。

下面我们来说几个最常用的net-snmp工具,

常用命令:

(1).snmpget命令

1
2
3
4
5
snmpget [OPTIONS] AGENT OID [OID]...
选项:
-v 1|2c|3  指定SNMP版本
-c COMMUNITY  指定community string
-m MIB[:...]  指定MIB文件

注,snmpget 不同于 snmpwalk ,必须在命令行给出 <object>.<instance> 的格式,不能只给出 object。

案例,snmpget -v 2c -c public localhost system.sysDescr.0 #获取设备的描述信息。

1
2
[[email protected] ~]# snmpget -v 2c -c public localhost system.sysDescr.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux node1.test.com 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64

(2).snmpwalk/snmpbulkwalk 命令

1
2
3
4
5
snmpwalk/snmpbulkwalk [OPTIONS] AGENT [OID]
选项:
-v 1|2c|3  指定SNMP版本
-c COMMUNITY  指定community string
-m MIB[:...]  指定MIB文件

注,snmpbulkwalk命令: 获取snmp服务器的mib-2各种资讯,snmpbulkwalk用于通过SNMPv2 的SNMP GET BULK请求命令与其它网络实体通信,只能用于snmpv2,速度快于snmpwalk

案例,snmpbulkwalk -v 2c -c public 127.0.0.1 .1.3.6.1.2.1.1 #获取mib-2的system的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[[email protected] ~]# snmpbulkwalk  -v  2c  -c public 127.0.0.1  .1.3.6.1.2.1.1
SNMPv2-MIB::sysDescr.0 = STRING: Linux node1.test.com 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (264551) 0:44:05.51
SNMPv2-MIB::sysContact.0 = STRING: Root <[email protected]> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: node1.test.com
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (10) 0:00:00.10
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDMIBObjects.3.1.1
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (9) 0:00:00.09
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (9) 0:00:00.09
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (9) 0:00:00.09
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (9) 0:00:00.09
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (9) 0:00:00.09
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (10) 0:00:00.10
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (10) 0:00:00.10
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (10) 0:00:00.10

(3).snmpwalk命令

注,获取snmp服务器的HOST-RESOURCES的各种资讯。

案例,snmpwalk -v 2c -c public localhost system #这条指令用于查看本机系统信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[[email protected] ~]# snmpwalk -v 2c -c public localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux node1.test.com 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (3335125) 9:15:51.25
SNMPv2-MIB::sysContact.0 = STRING: Root <[email protected]> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: node1.test.com
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (10) 0:00:00.10
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDMIBObjects.3.1.1
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (9) 0:00:00.09
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (9) 0:00:00.09
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (9) 0:00:00.09
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (9) 0:00:00.09
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (9) 0:00:00.09
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (10) 0:00:00.10
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (10) 0:00:00.10
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (10) 0:00:00.10

(4).snmpdelta命令

注,监控网卡流量等信息, 指定共同体为public,协议为snmpv1,以表格的方式输出结果,显示时间戳。

案例,

1
2
snmpdelta -public -v 1 -Cs -CT 127.0.0.1 IF-MIB::ifInUcastPkts.2 IF-MIB::ifOutUcastPkts.2 #监控IF-MIB::ifInUcastPkts(输入流量),IF-MIB::ifOutUcastPkts(输出流量),如监控本地的第二块网卡instance为2。
snmpdelta -public -v 1 -Cs -CT 127.0.0.1 ifInDiscards.2 #监控ifInDiscards(已经丢弃的收到的数据包的总数),格式同上。

(5).snmpnetstat命令

注,查看snmp服务器的端口连接信息, 协议为snmp 2c。

案例,

1 snmpnetstat -v 2c -public -Can -Cp tcp 127.0.0.1 #获取127.0.0.1的TCP协议的开放端口状态

(6).snmptranslate 命令

注,在MIB OID 在数字和文字名称之间进行转换。

例子,

  • snmptranslate -On -IR HOST-RESOURCES-MIB::hrSystem #用snmptranslate把symbol 格式的HOST-RESOURCES-MIB::hrSystem 转换为 numberic 格式的oid,用-On(输出数字格式的oid),使用 -IR(允许“随机”访问 MIB)
    1
    2
    [[email protected] ~]# snmptranslate -On -IR HOST-RESOURCES-MIB::hrSystem
    .1.3.6.1.2.1.25.1
  • snmptranslate -Onf -IR HOST-RESOURCES-MIB::hrSystem #用snmptranslate把symbol 格式的HOST-RESOURCES-MIB::hrSystem 转换为symbol 格式的 oid,用-Onf(输出符号格式的oid)
    1
    2
    [[email protected] ~]# snmptranslate -Onf -IR HOST-RESOURCES-MIB::hrSystem
    .iso.org.dod.internet.mgmt.mib-2.host.hrSystem
  • snmptranslate -Tp iso.org.dod.internet.mgmt.mib-2 #用snmptranslate打印从指定OID(.1.3.6.1.2.1)开始一直到该OID(.1.3.6.1.2.1)所属的 MIB 子树末端的树型结构信息
  • snmptranslate -Ta #用snmptranslate导出所有已经加载的 MIB 的数据,每个对象一行
  • snmptranslate -Tl #用snmptranslate导出所有已经加载的 MIB 的对象,并且输出完整的 oid 路径
  • snmptranslate -To #用snmptranslate导出已经加载的所有 MIB 的数字格式的 oid ,不含值和类型,仅仅有 oid 而已
  • snmptranslate -Ts #用snmptranslate只输出文字格式的 OID 名称而已

十一、SNMP的MIB详解

1.MIB管理信息库

IETF 规定的管理信息库MIB(由中定义了可访问的网络设备及其属性,由对象识别符(OID:Object Identifier)唯一指定。MIB是一个树形结构,SNMP协议消息通过遍历MIB树形目录中的节点来访问网络中的设备。下图给出了NMS系统中 SNMP可访问网络设备的对象识别树(OID:Object Identifier)结构。

技术分享图片

 

上图中的节点是从internet开始的,其实上面还有几个节点请看下图。

技术分享图片

 

下图给出了对一个DS1线路状态进行查询的OID设置例子。

技术分享图片

 

2.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管理站发送非请求消息,一般用于描述某一事件的发生。

3.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个类别,见下图,现在mib-2所包含的信息类别已超过40个。

技术分享图片

 

应当指出,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元素
①若干个需要被管理的网络设备节点,如路由器、服务器等设备,每个节点上都运行着一个称为设备代理(agent)的应用进程,其实现对被管理设备的各种被管理对象的信息如流量等的搜集和对这些被管对象的访问的支持; 
②至少一个管理工作站,该管理站运行着管理平台应用系统,实现为管理员提供对被管设备的可视化的图形界面,从而使管理员可以方便的进行管理; 
③一个管理协议,用来定义设备代理和管理工作站之间管理信息传送的规程。其中管理协议的操作是在管理框架下进行的,管理框架定义了和安全相关的认证,授权,访问控制和加密策略等各种安全防护框架。 在运行 TCP/IP 协议的互联网环境中,管理协议标准是简单网络管理协议(Simple Network Management Protocol,SNMP),其定义了传送管理信息的协议消息格式及管理站和设备代理相互之间进行消息传送的规程。
业界需求
出于业界对网络管理协议标准化的迫切要求的驱动,IETF于1990发布了SNMPv1的正式RFC 文档;其设计思想重点放在保证协议的简单性、灵活性和可扩展性上,并希望把SNMP作为 一个过渡性的网管协议来作为实现对互连的网络设备进行管理时遵循的标准,待OSI的网 络管理协议—CMIP的开发、实现和标准化成熟和完善到可以在业界推广之后,再用CMIP来替换SNMP。但是由于各种的原因,CMIP并没有替代SNMP,而SNMP发展为业界的标准。
编辑本段主版本
分别为SNMPv1 ,SNMPv2和SNMPv3。其中SNMPv2又分为若干个子版本,其中SNMPv2c应用最为广泛:
SNMPv1
是第一个正式协议版本,在RFC1155-RFC1158中定义,该版本采用了基于共同体 名的安全机制
SNMPv2c
这个版本被称为基于共同体名的SNMPv2,使用基于共同体名的安全机制和 SNMPv2p做出的协议操作方面的扩充,由RFC1901-RFC1906定义
SNMPv3
该协议版本采用基于用户的安全机制,其安全机制是在SNMPv2u和SNMPv2*基础上 进行大量的评议以后进行了更新,并且对协议机的逻辑功能模块的进行了划分而保证了良好的可扩充性,由RFC2271-RFC2275所定义。
编辑本段SNMP管理系统及SNMP协议
使用SNMP协议的网络管理系统管理结构工作一般包括:管理进程通过定时向各个设备的设备代理进程发送查询请求消息(以轮询方式),来跟踪各个设备的状态;而当设备出现异常事件如设备冷启动等时,设备代理进程主动向管理进程发送陷阱消息,汇报出现的异常事件。这些轮询消息和陷阱消息的发送和接受规程及其格式定义都是由SNMP协议定义的;而被管理设备将其各种管理对象的信息都存放在一个称为管理信息库(Management Information Base)库结构中。 其中SNMP协议是运行在UDP协议之上,它利用的是UDP协议的161/162端口。其中161端口被设备代理监听,等待接受管理者进程发送的管理信息查询请求消息;162端口由管理者进程监听等待设备代理进程发送的异常事件报告陷阱消息,如Trap。 设备的所有的需要被管理的信息被看作一个各种被管理对象的集合,这些被管理对象由 OSI 定义在一个被称作管理信息库(Management Information Base,MIB)的虚拟的信息库中。
编辑本段管理对象库MIB
是一个按照层次结构组织的树状结构(定义方式类似于域名系统),管理对象为定义为树中的相应叶子节点。管理对象是按照模块的形式组织,每个对象的父节点表示该种对象属于上层的哪一个模块。而且OSI为树中每一层的每个节点定义唯一的一个数字标识, 每层中的该数字标识从1开始递增,这样树中的每个节点都可以用从根开始到目的节点的相应的标识对应的一连串的数字来表示,如1.3.6.1.2.1.1表示了MIBII中系统组子树,而 1.3.6.1.2.1.1.1.0表示系统组中的系统描述(sytem Descrption)对象。每个对象的一连串数字表示被称为对象标识符(Object Indentifier,OID)。 相关的一组对象的集合被定义为一个MIB模块。这些模块使用OSI的抽象语法标记 (Abstract Syntax Notation One,ASN.1)的一个子集写成。该子集被定义为管理信息结 构(Management Information,SMI)。 SNMP的消息在发送和传输时消息是采用基本编码规则(BER)对消息进行编码。 SNMP基本的标准MIB库是MIBII,具体请参考RFC 1213。 SNMP协议操作 SNMP提供有三类操作,分别为Get,Set和Trap。 Get操作实现对被管理对象所表示的管理信息的读操作。在SNMPv1中,GET操作具体一共有 两种形式 Get和GetNext操作: Get操作指示直接读取操作参数指定的OID所表示的被管理对象的管 理信息值。GetNext操作指示读取操作参数指定的OID所表示的被管理对象在MIB树中按照 字典顺序的下一个被管理对象的管理信息的值。在SNMPv2中,增加了一种GetBulk操作, 其是Get和GetNext的综合,是为了提高对被管理信息的访问的效率而增加的。 Set操作实现对被管理对象的管理信息进行写操作,其实现直接对操作参数指定的OID所表示的被管理对象对应的管理信息的值的设置。 前面几种消息是由管理工作站主动实现对被管理设备进行轮询访问时发出以得到被管理设 备的各种信息;而在被管理设备出现异常事件需要及时向管理工作站报告时,就需要Trap 操作,该操作实现被管理设备向管理工作站报告设备上出现的异常事件,如网络接口出现故障或恢复工作,设备重新启动等信息。另外在SNMPv2中新增加了一种Inform操作来实现 管理站与管理站之间的通信。 其中上述操作的消息都可以在操作参数中一次指定一个或多个管理对象OID信息,也就是说一个消息一次可以实现对多个被管理对象的操作。
编辑本段SNMPv1和SNMPv2c
管理站和被管设备上都存储有该充当密码作用的共同体名;消息发送者(一般是管理者)在 要发送的消息中的共同体名字段中填入对应于接收者的共同体名,然后以明文方式在网络 上发送消息,接收方(被管理设备)接收到消息以后,如果消息格式是正确的,则读取该字 段,与自身保存的共同体名相比较,来实现对发送消息者的认证。在一些实现中,对应于 每个共同体名还有一个机器地址列表,来表示只有地址在这个列表中的机器使用该共同体 名发送的消息才认为是可信的。这里的共同体名就担任密码的作用。同时对应于每个共同 体名都有一个访问控制权限,可能值为读或读写。只有请求的操作和使用的共同体名的权 限一致才允许进行。

 

一 SNMP协议介绍

  简单网络管理协议(SNMPSimple Network Management Protocol)是由互联网工程任务组(IETFInternet Engineering Task Force)定义的一套网络管理协议。该协议基于简单网关监视协议(SGMPSimple Gateway Monitor Protocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。虽然SNMP开始是面向基于IP的网络管理,但作为一个工业标准也被成功用于电话网络管理。

1. SNMP基本原理

  SNMP采用了Client/Server模型的特殊形式:代理/管理站模型。对网络的管理与维护是通过管理工作站SNMP代理间的交互工作完成的。每个SNMP从代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。下图10NMS公司网络产品中SNMP协议的实现模型。

技术分享图片

 

10

  SNMP代理和管理站通过SNMP协议中的标准消息进行通信,每个消息都是一个单独的数据报。SNMP使用UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。SNMP消息报文包含两个部分:SNMP报头和协议数据单元PDU。数据报结构如下图11

技术分享图片

 

11

 

  • 版本识别符(version identifier):确保SNMP代理使用相同的协议,每个SNMP代理都直接抛弃与自己协议版本不同的数据报。

 

 

  • 团体名(Community Name):用于SNMP从代理对SNMP管理站进行认证;如果网络配置成要求验证时,SNMP从代理将对团体名和管理站的IP地址进行认证,如果失败,SNMP从代理将向管理站发送一个认证失败的Trap消息(见后);

 

 

  • 协议数据单元(PDU):其中PDU指明了SNMP的消息类型及其相关参数。

 

 

2. 管理信息库MIB

  IETF规定的管理信息库MIB(由中定义了可访问的网络设备及其属性,由对象识别符(OIDObject Identifier)唯一指定。MIB是一个树形结构,SNMP协议消息通过遍历MIB树形目录中的节点来访问网络中的设备。

  下图给出了NMS系统中SNMP可访问网络设备的对象识别树(OIDObject Identifier)结构。

 

技术分享图片

 

12

 

  下图13给出了对一个DS1线路状态进行查询的OID设置例子。

 

技术分享图片

 

13

  图14中左图给出了RFC2495DS1/E1中继线的MIB信息树图,右图是NMS系统中对机架Chassis管理MIB约定。

 

技术分享图片

技术分享图片

14

 

3. SNMP的五种消息类型

  SNMP中定义了五种消息类型:Get-RequestGet-ResponseGet-Next-RequestSet-RequestTrap

 

  • Get-Request Get-Next-RequestGet-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代理使用TrapSNMP管理站发送非请求消息,一般用于描述某一事件的发生。

 

二 NMS产品中的SNMP从代理

NMS产品系统中SNMP管理模型中的各种组件及相互关系如图15所示。

技术分享图片

 

15

16给出了NMS产品的SNMP代理和MIB关系。

NMS产品的CT Access 4.02提供了各种SNMP代理,包括机架管理(Chassis Proprietary)、中继线Trunk配置(RFC2495)、软件修正改版(Software Revision)、OAM数据库维护等。

技术分享图片

 

16

下图17SNMP测试的一个输出样本:

技术分享图片

 

17

参考资料

TMN知识介绍 http://www.dset.com.cn/

NMS SNMP 参考手册
http://www.nmscommunications.com/manuals/6744-13/chap1.htm

RFC 2570 互联网网络管理框架第三版
http://www.ietf.org/rfc/rfc2570.txt

Solstice Enterprise Agents 1.0 用户手册
http://www.sun.com/software/entagents/index.html

DS1/E1/DS2/E2接口类型定义
http://www.ietf.org/rfc/rfc2495.txt

 
SNMP 是一个协议用来管理网络上的节点,(包括工作站,路由器,交换机,集线器和其他的外围设备)。SNMP是一个应用协议,使用UDP封装进行传输。UDP是一个无连接的传输层协议,在OSI模型中为第四层协议,提供简单的可靠的传输服务。SNMP使网络管理者能够管理网络性能,发现和解决网络问题,规划网络的增长。

     当前,定义了三个版本的网络管理协议,SNMP v1,SNMP v2,SNMP v3。SNMP v1,v2有很多共同的特征,SNMP v3 在先前的版本地基础上增加了安全和远程配置能力 。为了解决不同版本的兼容性问题,RFC3584定义了共存策略。

   SNMP v1 是最初实施SNMP协议。SNMPv1 运行在像UDP,IP,OSI无连接网络服务(CLNS),DDP(AppTalk Datagram-Delivery),IPX(Novell Internet Packet Exchange)之上.SNMPv1 广泛使用成为因特网上实际的网络管理协议。

   SNMP 是一种简单的request/response协议。网络管理系统发出一个请求,被管理设备返回相应。这些行为由四种协议操作组成:Get,GetNext,Set 和Trap。Get操作使用NMS来获取agent的一个或多个对象实例。如果agent返回get操作不能提供列表所有对象实例的值,就不能提供任何值。GetNext 操作是NMS用来从agent表中获取表中下一个对象实例。Set操作NMS用来设置agent对象实例的值。trap操作用于agent向NMS通告有意义的事件。

   SNMP v2是1993年设计的,是v1版的演进版。Get,GetNext和Set操作相同于SNMPv1。然而,SNMPv2 增加和加强了一些协议操作。在SNMPv2中,如果再get-request中需要多个请求值,如果有一个不存在,请求照样会被正常执行。而在SNMPv1种将响应一个错误消息。在 v1,Trap 消息和其他几个操作消息的PDU不同。v2版本简化了trap消息,使trap和其他的get和set消息格式相同。

SNMPv2还定义了两个新的协议操作:GetBulk和Inform。GetBulk 操作被用于NMS高效的获取大量的块数据,如表中一行中的多行(一个UDP数据包应答)。GetBulk 将请求返回的响应消息尽量多的返回。Inform操作允许一个NMS 来发送trap消息给其他的NMS,再接收响应。在SNMPv2

,如果agent响应GetBulk操作不能提供list中全部的变量的值,则提供部分的结果。

   SNMP v2在安全策略演变时存在多个变种,实际存在多个SNMP v2的消息格式。SNMPv2各个变种之间的不同在于安全的实施。因而各个SNMP v2变种之间的PDU都有相同的格式,而总的消息格式又都不同。

   现在,SNMP v3 在前面的版本上增加了安全能力和远程配置能力,SNMPv3结构为消息安全和VACM(View-based Access Control Model)引入了USM(User-based Security Model)。这个结构支持同时使用不同的安全机制,接入控制,消息处理模型。SNMP v3 也引入使用SNMP SET命令动态配置 SNMP agent而不失MIB对象代表agent配置。

  这些动态配置支持能够增加,删除,修改和配置远程或本地实体。

 

有三个可能的安全级别: noAuthNoPriv, authNoPriv, 和 authPriv.
noAuthNoPriv 级别指明了没有认证或私密性被执行. 
authNoPriv 级别指明了认证被执行但没有私密性被执行. 
authPriv 级别指明了认证和私密性都被执行.

auth---认证 支持MD5 or SHA;

priv---加密 支持DES or RSA;

  通用的SNMPv3消息格式遵循相同的消息封装格式包含一个头和一个被封装PDU。 头部区域,被分成两个部分,一部分处理安全,和另外一部份与安全无关的部分。与安全无关部分所有的SNMPv3部分是相同的,而使用安全相关部分被设计成各种的SNMPv3安全模型,被SNMP内的安全模型处理。

  

    SNMPv1只使用一种安全策略,团体名。团体名和密码相似。Agent能够被设置回答那些团体名能够被接受的Manager的查询。在很容易让人截取得到团体名或密码。SNMPv2增加了不少额外的安全。首先所有的包信息除了目的地址,其他都被加密。在加密的数据中包括团体名和源IP地址。Agent 能够解开加密包并使用收到的团体名和源IP地址使请求有效。SNMPv3提供三重的安全机制。最高层是认证和私密。中间层提供认证而没有私密和底层没有任何的认证机制和私密

    SNMPV1,V2均采用明文传送,SNMPV3采用加密传送,也就是说对应SNMPV1,V2用抓包工具能在数据包中直接看到团体名。

如下团体名为:snmpv2, 显然抓包可以抓到

技术分享图片

 

 














以上是关于snmp trap 与snmp相关介绍安装命令以及Trap的发送与接收java实现的主要内容,如果未能解决你的问题,请参考以下文章

linux配置团体名和trap

请问SNMP是啥,trap是啥?

snmp_trap snmptt

关于SNMP的一个问题:向管理端发送SNMP Trap报警信息。

在SNMP协议中,网络管理系统是如何与代理进行通信的?

SNMP协议介绍