Bootstrap

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】操作。

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

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的体系结构中都起着至关重要的作用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tE0OJAAc-1650091948090)(clipboard-202204141542-5jfbe.png)]

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中的被管对象实现对设备的管理

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

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

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

通过 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三者之间有什么区别?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iP4adDhq-1650091948095)(clipboard-202204141604-b6kr7.png)]

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

二、Snmp的实现结构

在具体实现上,SNMP为管理员提供了一个网管平台(NMS),又称为【管理站】,负责网管命令的发出、数据存储、及数据分析。【被】监管的设备上运行一个SNMP代理(Agent)),代理实现设备与管理站的SNMP通信。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JwVgtPnN-1650091948097)(clipboard-202204141552-5jeky.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0GadTgzZ-1650091948098)(clipboard-202204151020-d03p1.png)]

三、Snmp有关的基本概念

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

管理信息库MIB:任何一个被管理的资源都表示成一个对象,称为被管理的对象。MIB是被管理对象的集合。它定义了被管理对象的一系列属性:对象的名称、对象的访问权限和对象的数据类型等。每个SNMP设备(Agent)都有自己的MIB。MIB也可以看作是NMS(网管系统)和Agent之间的沟通桥梁。它们之间的关系如图1所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zPkQfvyi-1650091948099)(clipboard-202204141553-ocj03.png)]

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协议,不需要在代理和管理站之间保持连接。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OrmudjQX-1650091948101)(clipboard-202204141555-qbe1r.png)]

3.2、SNMP的操作命令

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

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

3.3、SNMP 报文

SNMP协议定义了数据包的格式,及网络管理员和管理代理之间的信息交换,它还控制着管理代理的MIB数据对象。因此,可用于处理管理代理定义的各种任务。
一条SNMP消息由"版本号"、"SNMP共同体名"和"协议数据单元(PDU)"构成,数据包的长度不是固定的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iU30kLdx-1650091948102)(clipboard-202204141555-eqgtn.png)]

版本识别符(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种报文操作:

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

网管服务器 代理服务 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

;