0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SNMP协议在设备监控中的使用

京东云 来源:jf_75140285 作者:jf_75140285 2025-06-27 11:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

随着网络技术的飞速发展,网络管理变得日益重要。网络管理员需要一种高效、可靠的方式来监控网络设备、收集状态信息并对其进行配置。简单网络管理协议(SNMP)正是为此目的而设计的。本文将对SNMP进行详细介绍,并提供使用SNMP进行网络管理的基本指南。

1.简介

SNMP(Simple Network Management Protocol)是一个基于互联网协议族(IP)的网络管理标准,用于在IP网络中的管理节点与被管理节点之间进行通信,以实现对网络设备的远程监控和管理。SNMP具有简单、高效、易于实现和扩展性强等优点,因此在网络管理领域得到了广泛应用。

2.SNMP的组成和版本

2.1.SNMP协议的组成

SNMP协议架构主要包括以下几个部分:

wKgZO2heFJeALSFMAAHIRoxbf_Y301.png



1.管理信息库(MIB):MIB是一个信息数据库,用于存储被管理设备的信息,如设备类型、接口状态、路由表等。MIB是SNMP的核心,管理站通过SNMP协议获取MIB中的信息,以实现对网络设备的监控和管理。

2.管理站(NMS):NMS是网络管理系统中的核心组件,负责收集、处理和存储来自被管理设备的信息。NMS通常运行在网络管理中心的服务器上,通过网络管理软件实现对网络设备的远程监控和管理。

3.代理(Agent):Agent是被管理设备上的软件模块,负责接收NMS的查询请求,并返回MIB中的相关信息。同时,Agent还可以将设备的状态变化通知给NMS。

2.2.SNMP协议版本

目前SNMP协议有三个版本,分别是:V1、V2和V3

•V1:SNMP协议的最初版本

•V2:在V1的基础上增加community(团体名),这里的团体名可以理解为密码

•V3:增加认证和对密文的传输的支持,这种方式安全等级最高

3.SNMP报文

wKgZPGheFJmAE32zAAAKGyHuD1A140.png



SNMP报文包含三个部分

•版本号:表明当前使用的版本,管理站和代理之间的版本号必须相同才能通信

•团体名:团体(community)是基本的安全机制,用于实现SNMP网络管理员访问SNMP管理代理时的身份验证,类似于密码,默认值为 public。团体名(Community name)是管理代理的口令,管理员被允许访问数据对象的前提就是网络管理员知道网络代理的口令。

•PDU:snmp的数据结构

3.1.PDU详细报文

wKgZO2heFJqAXX-cAAAZRvCHvmY485.jpg



3.2.PDU类型

•get-request:从代理(本质上是设备)获取一个或多个参数值

•get-next-request:从代理紧接着取出下一个参数值

•set-request:设置代理一个或多个参数值

•get-response:对上述三种请求的响应

•trap:设备主动上报的数据

3.3.差错状态

•noError:无错误

•tooBig:代理无法将回答装入到一个SNMP报文中

•noSuchName:操作指明了一个不存在的变量

•badValue:一个set操作指明了一个无效值或无效语法

•readOnly:管理进程试图修改一个只读变量

•genErr:某些其他差错

3.4.trap类型

•coldStart:代理进行了初始化

•warmStart:代理进行了重新初始化

•linkDown:一个接口从工作状态变为故障状态

•linkUp:一个接口从故障状态变为工作状态

•authenticationFailure:从SNMP管理进程接收到具有一个无效共同体的报文

•egpNeighborLoss:一个EGP相邻路由器变为故障状态

•enterpriseSpecific:代理自定义事件,需要用后面的“特定代码”来指明

4.MIB详解

4.1.MIB树结构

MIB以树状结构进行存储,树的叶子节点表示管理对象,它可以通过从根节点开始的一条惟一路径来识别,这也就是OID(Object Identifier)。

wKgZPGheFJqAYBHhAAAr5BO9Byk041.jpg

OID是由一些系列非负整数组成,用于唯一标识管理对象在MIB树中的位置。由SMI来保证OID不会冲突。

MIB文件一旦发布,OID就和被定义的对象绑定,不能修改。MIB节点不能被删除,只能将它的状态置为“obsolete”,表明该节点已经被废除。

在上图的树形结构中,mgmt对象可以标识为:{ iso(1) org(3) dod(6) internet(1) mgmt(2) },简单标记为:1.3.6.1.2,这种标识就叫做OID。

NMS通过OID引用Agent中的对象。

4.2.MIB分类

MIB可以分为公有MIB和私有MIB两种。

•公有MIB:一般由RFC定义,主要用来对各种公有协议进行结构化设计和接口标准化处理。大多数的设备制造商都需要按照RFC的定义来提供SNMP接口。

•私有MIB:是公有MIB的必要补充,当公司自行开发私有协议或者特有功能时,可以利用私有MIB来完善SNMP接口的管理功能,同时对第三方网管软件管理存在私有协议或特有功能的设备提供支持。

网络设备的很多数据都以MIB的树结构存储,根据数据对应的OID,我们便可以获取到网络设备的各种统计数据和配置数据,实现网络设备的监控。

5.SNMP实践

5.1.snmp命令

5.1.1.snmpwalk

用于获取 SNMP 设备上的数据,它遍历设备的 SNMP 树,并返回特定对象标识符(OID)的值,通常用于查询设备的信息和状态。使用 snmpwalk 可以获取有关设备的详细信息,例如接口、系统信息、传感器状态等。以下是 snmpwalk 的一般用法:

snmpwalk -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID
SNMP_VERSION:SNMP 版本,通常是 "1"(SNMPv1)或 "2c"(SNMPv2c)。
COMMUNITY_STRING:SNMP 社区字符串,用于身份验证。
TARGET_HOST:目标设备的主机名或 IP 地址。
OID:要查询的对象标识符。

5.1.2.snmptrap

snmptrap 用于生成和发送 SNMP 陷阱(trap)到 SNMP 管理器,这些陷阱通常表示设备上发生的重要事件或告警。snmptrap 常用于监控设备状态变化和异常事件。以下是 snmptrap 的一般用法:

snmptrap -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST TRAP_OID [OID_VALUE] [OPTIONS]
SNMP_VERSION:SNMP 版本,通常是 "1"(SNMPv1)或 "2c"(SNMPv2c)。
COMMUNITY_STRING:SNMP 社区字符串,用于身份验证。
TARGET_HOST:目标 SNMP 管理器的主机名或 IP 地址。
TRAP_OID:陷阱的对象标识符,表示事件类型。
OID_VALUE:可选,与陷阱相关的 OID 值。
OPTIONS:可选,包括发送陷阱的其他选项,如 -p(指定陷阱端口)等。

5.1.3.snmpget

用于获取单个 SNMP 对象的值。你可以指定要查询的 OID,它将返回相应的值。

snmpget -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID

snmpget -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID

5.1.4.snmpset

用于设置 SNMP 对象的值。它允许你修改设备上的特定 OID 的值。

snmpset -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID TYPE VALUE

5.1.5.snmpbulkwalk

类似于 snmpwalk,但它使用了 SNMP Bulk Protocol(SNMPv2c)来提高效率,特别对于大型数据集。

snmpbulkwalk -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID

5.1.6.snmpinform

用于向 SNMP 管理器发送 SNMP INFORM 消息,这是一种更可靠的通知机制,它需要管理器进行确认。

snmpinform -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID

在网络设备信息采集中,我们通常会通过snmpget和snmpwalk命令获取网络设备的各种运行和配置数据。

5.2.代码实现

基于以上知识,我们考虑通过代码的方式执行snmp命令,获取设备的基本信息,实现设备的自动化监控。本文所有案例都基于Java语言,其余语言类似。

5.2.1.引入依赖

如下所示,我们引入snmp的依赖:

< dependency >
   < groupId >org.snmp4j< /groupId >
   < artifactId >snmp4j< /artifactId >
   < version >2.7.0< /version >
< /dependency >

5.2.1.代码实现

public class SnmpUtils {
    
    /**
     * 根据oid获取数据
     * @param ip
     * @param community
     * @param oid
     * @return
     */
    @SneakyThrows
    public static void snmpGet(String ip, String community, String oid) {

        Snmp snmp = null;
        try {

            snmp = new Snmp(new DefaultUdpTransportMapping()); // 构造一个UDP
            snmp.listen(); // 开始监听snmp消息

            CommunityTarget target = new CommunityTarget();
            target.setCommunity(new OctetString(community));// snmpv2的团体名
            target.setVersion(SnmpConstants.version2c); // snmp版本
            target.setAddress(new UdpAddress(ip));
            target.setTimeout(1000); // 时延
            target.setRetries(2); // 重传

            PDU pdu = new PDU();
            pdu.setType(PDU.GET);
            pdu.addOID(new VariableBinding(new OID(oid)));

            ResponseEvent responseEvent = snmp.get(pdu, target);
            PDU response = responseEvent.getResponse();
            Vector< ? extends VariableBinding > bindings = response.getVariableBindings();
            bindings.forEach(item ->{
                System.out.println(String.format("OID为:%s的值为:%s", item.getOid().toDottedString(), item.getVariable().getSyntaxString()));
            });

        }finally {
            if (snmp != null) {
                snmp.close();
            }
        }
    }

    /**
     * 根据oids获取数据
     * @param ip
     * @param community
     * @return
     */
    @SneakyThrows
    public static void getTable(String ip, String community, List< String > oidList)
    {
        Snmp snmp = null;
        LinkedHashMap< String, List< String >> resMap = new LinkedHashMap<  >();
        try {

            snmp = new Snmp(new DefaultUdpTransportMapping()); // 构造一个UDP
            snmp.listen(); // 开始监听snmp消息

            CommunityTarget target = new CommunityTarget();
            target.setCommunity(new OctetString(community));// snmpv2的团体名

            target.setVersion(SnmpConstants.version2c); // snmp版本

            target.setAddress(new UdpAddress(ip));
            target.setTimeout(1000); // 时延
            target.setRetries(2); // 重传

            TableUtils utils = new TableUtils(snmp, new DefaultPDUFactory(
                    PDU.GETNEXT));// GETNEXT or GETBULK
            utils.setMaxNumRowsPerPDU(109); // only for GETBULK, set max-repetitions, default is 10

            utils.setCheckLexicographicOrdering(false);

            OID[] oids = oidList.stream().filter(StringUtils::isNotBlank).map(OID::new).toArray(OID[]::new);

            List< TableEvent > table = utils.getTable(target, oids, null, null);
            table.forEach(item ->{
                for (VariableBinding column : item.getColumns()) {
                    System.out.println(String.format("当前的oid为:%s,结果为:%s", column.getOid().toDottedString(), column.getVariable().getSyntaxString()));
                }
            });
        }finally {
            if (snmp != null) {
                snmp.close();
            }
        }
    }
}

其中snmpGet方法对应snmpget命令,snmpWalk方法对应snmpwalk命令。

6.总结

本文开篇即对SNMP(简单网络管理协议)的基本概念与核心构成进行了全面阐述,紧接着深入剖析了SNMP命令在实际网络管理场景中的具体应用。在文章的最后部分,通过Java编程语言的实践应用,本文成功展示了SNMP命令的实现过程。对SNMP协议的深入理解与掌握,无疑将为网络设备的数据监控及多元化自动化管理提供有力支持,进而显著提升网络运维的工作效率。


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SNMP
    +关注

    关注

    0

    文章

    94

    浏览量

    30579
  • 设备监控
    +关注

    关注

    0

    文章

    19

    浏览量

    6399
  • 京东云
    +关注

    关注

    0

    文章

    200

    浏览量

    235
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    IDC机房设备监控SNMP协议获取设备信息

    SNMP
    深圳市金鸽科技有限公司
    发布于 :2023年03月02日 19:52:49

    snmp协议抓包分析

    snmp 协议,下图的情况不解,程序怎么控制,询问你一此,应答一次;图中确实连续询问三次,连续应答不三次。希望能帮我解决下
    发表于 03-03 15:37

    Labview监控带有snmp网卡设备有没有问题?

    想用Labview监控带有snmp网卡的设备协议是TCP/IP.设备给出了MIB文件(管理信息库(MIB)是TCP/IP网络管理
    发表于 06-15 09:22

    用LWIP的SNMP监控嵌入式设备

    各位大神: 最近要搞一个项目,用LWIP的SNMP监控嵌入式设备,对ucos和lwip还算熟悉,但对snmp一头雾水,请搞过snmp的大神指
    发表于 03-24 04:35

    SNMP协议WAGO工业以太网系统的应用是什么?

    SNMP管理网络由哪些部分组成?SNMP协议WAGO工业以太网系统的应用是什么?
    发表于 05-20 06:46

    AN_基于FreeRTOS+LwIP的SNMP实现方案

    、路由器和其他网络设备的远程管理和监视。利用SNMP协议可以更好地管理和监控网络。管理工作站可以远程管理所有支持该协议的网络
    发表于 11-02 07:03

    协议转换网关支持OPC UA及SNMP协议

    工业自动化领域中,Modbus RTU、IEC61850、IEC101、PLC协议SNMP OPC UA是常见的通信协议。为了实现不同系统之间的数据交互,将上述
    发表于 10-09 19:52

    什么是简单网络管理协议(SNMP)

    什么是简单网络管理协议(SNMP) SNMP(Simple Network Management Protocol,简单网络管理协议)的前身是简单网关
    发表于 03-20 15:13 2549次阅读

    基于SNMP协议的电网实时视频监控系统设计

    电网设备数量、复杂度日益提高,不同电力设备生产厂商的视频设备采用的协议标准、功能、兼容性不同,需要采用统一的
    发表于 10-31 15:31 10次下载
    基于<b class='flag-5'>SNMP</b><b class='flag-5'>协议</b>的电网实时视频<b class='flag-5'>监控</b>系统设计

    snmp协议详解

    )定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种
    发表于 01-15 15:13 7412次阅读
    <b class='flag-5'>snmp</b><b class='flag-5'>协议</b>详解

    SNMP五种协议数据单元以及SNMP框架组成

    五层协议的应用层协议,用于网络管理的协议SNMP主要用于网络设备的管理。由于
    的头像 发表于 08-19 17:32 6867次阅读

    使用 ntopng 和 SNMP 监视网络设备

    总结SNMP广泛用于网络监控。能够远程监控网络设备是清晰了解当前和过去网络运行状况的基础。ntopng系统地与SNMP
    的头像 发表于 02-07 16:48 1503次阅读
    使用 ntopng 和 <b class='flag-5'>SNMP</b> 监视网络<b class='flag-5'>设备</b>

    什么是SNMPSNMP是如何工作的?

    用于监控和管理各种设备,包括路由器、交换机、服务器和打印机等。 SNMP工作原理如下:一个网络设备分为两类,
    的头像 发表于 12-27 13:58 2726次阅读

    snmp协议的主要功能 snmp协议在哪一层

    SNMP(Simple Network Management Protocol)是一种用于网络管理的应用层协议。它主要用于监控和管理网络上的设备以及收集
    的头像 发表于 01-22 15:00 3089次阅读

    机房动环监控系统Modbus转SNMP V3协议远程I/O模块

    的新型监控方案的需求日益迫切。在此背景下,钡铼技术推出了IOy系列SNMP协议远程IO模块BL197。 一、SNMP
    的头像 发表于 08-30 16:25 1308次阅读