Net-SNMP
2010-10-11 11:07:09 阿炯

Net-SNMP是一个免费的、开放源码的SNMP实现,以前称为UCD-SNMP。它包括agent和多个管理工具的源代码,支持多种扩展方式。NET-SNMP是一种开放源代码的简单网络管理协议(Simple Network Management Protocol)软件。 NET-SNMP支持SNMP v1, SNMP v2c 与 SNMP v3,并可以使用 IPV4 及 IPV6 。基于(BSD及BSD like)许可。

软件构成
* 命令行应用程序
1. 从支持SNMP的设备获得数据.支持独立请求 (snmpget, snmpgetnext), 与重复请求 (snmpwalk, snmptable, snmpdelta).
2. 对支持SNMP的设备配置属性.(snmpset).
3. 从支持SNMP的设备获取特定的信息.(snmpdf, snmpnetstat, snmpstatus).
4. 将MIB OIDs的两种表现形式(数字及文字)相互转换.并显示MIB的内容与结构(snmptranslate).

* 一个图形化的MIB浏览器(tkmib).基于Tk/perl.
* 一个接收SNMP提示消息(SNMP traps)的守护程序.(snmptrapd).可以将选定的SNMP消息记录到系统日志(syslog),NT 事件日志(NT Event Log),文本文件中.或是转发到其它的SNMP管理程序,也可以传给外部的应用程序.
* 一个回应SNMP查询的客户端.(snmpd).它集成了大量SNMP的模块.并可通过动态链接库,外部脚本与命令,多路SNMP技术(SMUX),以及可扩客户端协议(AgentX)进行扩展.
* 一个用来开发SNMP应用程序的程序库.支持C 与 perl 的 APIs.

操作系统支持
NET-SNMP支持许多UNIX发行版,并支持部分UNIX-like的操作系统,也支持微软的Windows。

简单网络管理协议(Simple Network Management Protocol,SNMP)是一种用于监控和管理网络设备的标准协议。SNMP 允许网络管理员监控设备性能、查找问题、配置设备以及远程管理网络设备。自 1988 年首次发布以来,SNMP 已经发展到多个版本,分别是 SNMPv1、SNMPv2c 和 SNMPv3。每个版本都在性能、功能和安全性上有着不同的改进。

SNMP 是网络管理协议族的一部分,通常运行在应用层,用于传输管理数据到管理站点。SNMP 基于请求 - 响应的模型,网络管理站点(NMS)发出请求,管理代理(Agent)响应并返回所请求的数据。设备代理通常嵌入在交换机、路由器、服务器、打印机和其他网络设备中。其基本架构由以下几个组件组成:
管理站点 (NMS):运行 SNMP 应用程序的系统,负责发送查询、接收响应以及监控设备的状态。
管理代理 (Agent):运行在被管理设备上的软件,负责收集设备信息,并通过 SNMP 协议将数据发送给管理站点。
管理信息库 (MIB):一组对象的数据库,这些对象定义了网络设备的信息结构。通过 OID(对象标识符)能够唯一标识这些对象。



它使用五种基本的操作来进行通信:
GET:用于请求设备的指定数据。
SET:用于更改或设置设备上的参数。
GETNEXT:请求设备中的下一个对象,用于遍历 MIB。
TRAP:设备主动作出告警,无需管理站点发出请求。
INFORM:与 TRAP 类似,但可以确认是否接收到消息。

SNMPv1

SNMPv1 是最早的 SNMP 版本,于 1988 年发布。它是一个相对简单的协议,用于在管理站和设备之间进行通信。SNMPv1 提供了基础的网络监控功能,可以查询设备状态、设置设备参数,并接收设备的告警信息。


简化设计:SNMPv1 具有较为简单的设计,适用于中小型网络管理。
有限的操作集:支持的操作主要为 GET、SET、GETNEXT、TRAP 等,适合基本的监控和管理任务。
使用不安全的社区字符串:SNMPv1 采用 “社区字符串”(Community String)进行设备认证。这是一种简单的文本密码,但并没有加密或其他安全保障。这意味着所有 SNMP 报文都以明文方式传输,容易受到窃听和伪造。

SNMPv1 虽然在简单的网络管理中能够满足基本需求,但其存在诸多局限:
安全性不足:报文以明文传输,容易受到攻击者拦截、篡改或伪造。
功能限制:只提供基本的网络监控和设备管理功能,缺乏对大规模复杂网络的支持。
效率低下:在大规模网络环境下,SNMPv1 的效率较低,尤其是在 MIB 信息繁多时。

SNMPv2c

随着网络规模和复杂性的增加,SNMPv1 的局限性逐渐显现,导致了 SNMPv2 的诞生。SNMPv2 最初是在 1993 年发布,增加了若干新功能。然而,SNMPv2 原版由于复杂的安全模型并未被广泛采用,因此后续衍生了 SNMPv2c(SNMPv2 Community-based),其简化了安全模型并保留了原版的多数新功能。


改进的协议操作:在 SNMPv2c 中,增加了两个新的操作 ——GETBULK 和 INFORM。
1.GETBULK:用于高效检索大量数据,例如获取大量路由表条目,这大大减少了管理站与代理之间的通信次数。
2.INFORM:与 TRAP 不同,INFORM 要求管理站确认接收到消息,提供了更可靠的通知机制。
更高效的管理能力:SNMPv2c 提供了更高效的性能和数据检索机制,适用于更大规模的网络。
基于社区字符串的认证:SNMPv2c 继续使用 SNMPv1 的社区字符串作为认证机制,因此在安全性方面仍然存在较大的漏洞。尽管它改进了数据传输的效率,但仍然未能解决明文传输的安全隐患。

局限:
缺乏强大的安全机制:SNMPv2c 的最大缺陷仍然是安全性问题。由于继续沿用了社区字符串的认证方式,攻击者可以通过嗅探网络轻松地拦截 SNMPv2c 报文,进而发起攻击。
与 SNMPv1 的兼容性问题:虽然 SNMPv2c 在设计上旨在保持与 SNMPv1 的兼容性,但实际在某些场景下,SNMPv1 和 SNMPv2c 之间的兼容性依然存在问题。

SNMPv3

为了彻底解决前两个版本中存在的安全问题,SNMPv3 于 1998 年发布。与 SNMPv1 和 SNMPv2c 不同,SNMPv3 的主要目标是增强安全性,提供加密、认证和用户控制。

强大的安全性:SNMPv3 引入了用户安全模型(User-Based Security Model,USM),提供了三种安全级别:
无认证无加密:与 SNMPv1 和 SNMPv2c 类似,报文以明文传输,无认证和加密。
有认证无加密:提供报文的完整性检查和源身份验证,但数据仍然以明文传输。
有认证有加密:提供完整的身份验证、数据完整性检查和加密,确保数据传输的安全性。
访问控制:SNMPv3 通过访问控制模型(VACM)允许更细粒度的权限控制,管理员可以精确设置不同用户对不同对象的访问权限。
消息加密:SNMPv3 允许对报文进行加密,使用的加密算法包括 DES 和 AES 等,确保数据在传输过程中不会被窃听。
抗重放攻击:通过引入时间戳和报文计数器,SNMPv3 能有效防止重放攻击。


优势:
高度安全性:SNMPv3 是第一个真正解决了 SNMP 安全性问题的版本。通过使用加密和认证机制,SNMPv3 可以防止未经授权的访问和数据窃听。
可扩展性:SNMPv3 的架构设计允许随时扩展新的安全功能或其他特性,适应未来的网络管理需求。
细粒度的访问控制:SNMPv3 允许管理员设置复杂的访问控制策略,确保不同用户只能访问与其角色相关的设备信息。

SNMPv1、SNMPv2c 和 SNMPv3 的对比

特性SNMPv1SNMPv2cSNMPv3
发布年份198819931998
认证机制社区字符串(明文)社区字符串(明文)用户认证(支持加密和完整性检查)
安全性高:提供认证、加密
功能改进基本操作 (GET, SET, TRAP 等)增加 GETBULK 和 INFORM增加用户认证、加密和访问控制
消息加密支持多种加密算法(如 DES, AES 等)
效率低效提高效率,支持批量操作因为加密,效率可能稍低于 SNMPv2c
复杂度中等高(需要更复杂的配置)
适用场景小型或不安全需求的网络较大型网络管理高安全性和大型网络环境


SNMPv1 是最早的版本,发布于 1988 年,定义在 RFC 1155 和 RFC 1157 中。它提供了基本的网络管理功能,包括设备监控、性能统计数据收集、设备配置和管理网络中的故障。SNMPv1 使用社区字符串(Community String Authentication)进行认证,这是一种基于文本的简单认证机制,通常默认值为 “public” 或 “private”,因此安全性较差。此外,SNMPv1 只支持 32 位计数器,对于高速网络可能会遇到计数器溢出的问题。

SNMPv2c 是 SNMPv2 的一个变种,称为社区字符串基础的 SNMPv2。它在 SNMPv1 的基础上引入了一些改进,包括对 64 位计数器的支持、更多的标准错误码信息、更多的数据类型以及新的操作命令,如 GetBulk 和 Inform 操作。GetBulk 命令允许管理器在一条消息中请求多个变量,而 Inform 命令则允许代理向多个管理器发送通知。尽管 SNMPv2c 在功能上有所增强,但它仍然使用社区字符串进行认证,且缺乏加密机制,因此在安全性方面并没有显著提升。

SNMPv3 是最新的版本,发布于 1998 年,定义在 RFC 1905、RFC 1906、RFC 2571、RFC 2572、RFC 2574 和 RFC 2575 中。它引入了重大的安全改进,包括基于用户的安全模块(User Security Model, USM)的认证和加密,以及基于视图的访问控制模型(View-based Access Control Model, VACM)的访问控制。SNMPv3 支持多种认证和加密算法,如 MD5、SHA 和 DES,提供了强大的安全性。此外,SNMPv3 还引入了通知确认(Notification Originated PDU)和新的 VACM 配置,使得网络管理更加安全和可靠。

SNMPv1:基础版本,功能简单,安全性低。
SNMPv2c:增加了新功能,但安全性仍然有限。
SNMPv3:在安全性方面有显著提升,是推荐使用的版本。

SNMP必知的简单网络管理协议

一、什么是SNMP
SNMP是“Simple Network Management Protocol” 的缩写,中文意思是简单网络管理协议,它是由互联网工作小组在RFC1157中定义的应用层协议,用于在网络实体或节点之间交换管理或监控信息。
 
二、为什么需要SNMP
作为运维人员,我们很大一部分的工作就是为了保证我们的网络能够正常、稳定的运行。因此监控,控制,管理各种网络设备成了我们日常的工作。在网络兴起的早期,维护方式就是运维人员蹲在近端对设备进行各种操作,当网络设备越来越多,网络规模越来越大时,管理工作会变得越来越单调乏味,这样的近端维护方式也近乎不可能。因此,远程管理网络的需求日益迫切,SNMP应运而生。使用SNMP,一个运行网管软件的工作站就能对成千上万的网络设备进行监控和信息采集,这些信息可以用来构建网络或者定位网络中的问题。

三、SNMP的优点
如其名字所述,这个协议简单易懂,部署的开销成本也小。正因为它足够简单,所以被广泛的接受,事实上它已经成为了主要的网络管理标准。在一个网络设备上实现SNMP的管理比绝大部分其他管理方式都简单直接。使用SNMP将带来如下好处:
标准化的协议:SNMP是TCP/IP网络的标准网络管理协议。互联网标准协议是由互联网组织志愿贡献的开放、非专利性的,SNMP的维护及将来所有的增强都将基于现有的协议标准。

广泛认可:所有主流供应商都支持SNMP。所有SNMP管理的设备使用相同的管理接口以支持通用的管理消息集合。

可移植性:SNMP独立于操作系统和编程语言。SNMP的功能设计同样是可移植的。同时它定义了一套核心操作集,所有支持SNMP的设备都需要支持这套操作。

轻量级:SNMP增强对设备的管理能力的同时不会对设备的操作方式或性能产生冲击。网络设备可以以极小的资源消耗和些微的负载作为代价增加SNMP的管理支持。

可扩展性:在所有SNMP管理的设备上都会支持相同的一套核心操作集。SNMP也支持计算机网络设备中各种类型的设备信息的交互,设备加入网络也变得简单。

广泛部署:SNMP是最流行的管理协议,最为受设备供应商关注,被广泛部署在各种各样的设备上。

四、SNMP的关键特征
SNMP一般主要由三个组件构成,这三个组件分别是:
网络设备:一般是指网络中需要监控和管理的设备或管理对象。
Agent:agent是网络设备和管理组件的中间件,是驻留在网络设备中的程序进程,它收集设备的管理信息并与管理组件交互。

一个典型的agent应有如下特征:
●支持完整的SNMP协议
●保存与检索定义在MIB中的管理信息
●收集与维护本地设备的信息
●发送事件给管理组件
●作为某些非SNMP可管理的节点上的代理
管理组件:一个管理组件或者说管理系统是一个远程部署的独立实体(区别于agent部署于被管理设备上)。一般典型可视为一台部署了管理组件的计算机,并且可能从地理位置上都与网络设备相隔甚远,管理者只需要通过这台计算机就能够对设备进行各种监控与管理操作。

一个典型的管理组件应有如下特征:
●实现网络管理系统
●支持完整的SNMP协议
●查询agent,获取agent 的响应消息,设置agent的变量,告知agent异步事件已收到等
通讯:管理组件与agent之间以协议数据单元进行通讯( Protocol Data Units,PDUs),数据在进行网络传输前必须进行分块和封装,SNMP传输的过程中,数据首先会被封装成PDU,PDU再被UDP协议封装进行传输。

SNMP消息的格式可以参考下图


1.msgVersion 指定SNMP的版本
2.msgID 指定SNMP消息唯一辨识符
3.msgMaxSize 指定交互SNMP实体所能接收的最大消息大小
4.msgFlags 指定消息的安全级别
5.msgSecurityModel 指定消息所使用的安全模式.SNMPv3为USM
6.msgAuthoritativeEngineID 此消息交互的SNMP实体的 SNMP EngineID
7.msgAuthoritativeEngineBoots 此消息交互的SNMP实体启动的次数
8.msgAuthoritativeEngineTime 此消息交互的SNMP实体自上次启动后所过去的时间
9.msgUserName 此消息交互的SNMP实体所使用的用户名
10.msgAuthoritaticationParameters 认证协议的参数
11.msgPrivacyParameters 加密协议的参数
12.contextEngineID 作为实现了某个具体管理功能上下文的唯一辨识符
13.contextName 用来标记一个上下文的名称
14.pdu SNMP实体间通信数据单元

管理模式:SNMP 对于管理组件和agent的实现一般可划分为如下三个层面:
●协议,定义SNMP的基本操作和管理组建与agent间消息交换的格式

●管理信息结构(Structure of Management Information (SMI)),定义SNMP该以何种形式访问管理对象的规则集合

●管理信息库(Management Information Base (MIB)),定义管理对象属性的集合
MIB和SMI使用一种叫做ASN.1(Abstract Syntax Notation One)的表示法来描述,这是一种以ASCII文本格式清晰描述数据的表示法。MIB的数据通过SNMP消息进行网络传输,传输前会通过简单编码规则( Basic Encoding Rules (BER))进行编码。
 
五、SNMP的基本操作
SNMP是一个请求-响应式的协议,它的基本操作可以分类如下:
●检索数据
●修改变量
●接收主动上报消息

检索数据:管理组件向agent发送请求以获取数据,有如下操作类型:
●GET:GET请求用以从agent上获取指定OID对应的一条或多条值。
●GETNEXT:与GET请求类似,最明显的区别是GETNEXT获取指定OID在系统树种所处位置的下一个OID。
●GETBULK:用于从agent上获取大表中的大量数据。

修改变量:管理组件有时会希望能够修改设备上的一些变量:
●SET:管理组件使用这个命令来修改设备的一些配置值。

接收主动上报消息:
●TRAP: 当agent遇到数据传输问题,或设备出现故障希望上层管理组件知晓时,使用TRAP操作上报此信息。

六、SNMP的版本
SNMP发展到目前,一共经历了三个主要版本,SNMPv1,SNMPv2c,SNMPv3。对于当今互联网迅猛发展的今天,信息安全已经是一个关乎产品命运的重要问题,曾经的SNMP由于缺乏足够的安全性而被人诟病甚至弃用,因此SNMPv3版本做了大量关于安全性的增强,这里我们也主要关注于SNMPv3版本的特性。SNMPv3的主要目的如下:
1.校验收到的SNMP消息在网络传输过程中是否被篡改。
2.校验收到的SNMP消息其身份证明是否已经被创建。
3.检测收到的SNMP消息是否包含管理消息,是否是即时创建的。
4.保护每个收到的消息的内容不会被公开。
为实现上述目标,SNMP为系统提供了一个安全的管理环境,涉及以下内容:
●SNMP实体的身份证明以增强SNMP实体间的通信——每一个SNMP实体都会有一个叫SNMP EngineID的身份标识符,SNMP通信只能发生在已知身份的SNMP实体间(TRAP和Notification不受此规则限制。)

●支持安全模式——一个安全模式定义了管理域或内部网络中的安全策略,SNMP包含USM安全模式的实现。

●定义消息安全的校验服务规范:
○反信息篡改:保护校验通过的实体所生成的消息在传输过程中不会被未经校验的SNMP实体所修改。
○反伪装:防止SNMP实体通过伪装成其他实体的身份来越权执行某些操作。
○反消息流篡改:防止SNMP消息流被恶意重排序,推迟或重复从而施加未经校验的管理操作。
○反消息泄露:防止SNMP实体通信的信息被窃听。

●USM的规格定义——USM一般由如下几个通信机制组成:
○非认证不加密通信
○认证不加密通信
○认证加密通信

●定义不同的认证与加密协议——目前USM支持MD5和SHA认证协议,DES和AES加密协议。
●定义发现流程:可以通过通信地址发现SNMP实体的SNMP EngineID
●定义时间同步流程:增强远程SNMP实体间认证通信。
●定义SNMP 框架 MIB——增强对SNMP实体的管理和配置。
●定义USM的MIB——增强远程配置与管理的安全模式。
●定义VACM 的MIB——增强远程配置与管理的访问控制。

最新版本:5.6
该版本提供了不少新特性,包括 SNMP over DTLS、TLS、TSM,基于主机的配置文件等等。

项目主页:http://net-snmp.sourceforge.net/