标题：SNMP
概念
简单网络管理协议（SNMP），由一组网络管理的标准组成，包含一个应用层协议（application layer protocol）、数据库模型（database schema）和一组资料物件。该协议能够支持网络管理系统，用以监测连接到网络上的设备是否有任何引起管理上关注的情况。该协议是互联网工程工作小组（IETF，Internet Engineering Task Force）定义的internet协议簇的一部分。元件架构请参考本词条结尾的扩展阅读条目“简单网络管理协议（SNMP）基本元件和架构”。工作过程在典型的SNMP用法中，有许多系统被管理，而且是有一或多个系统在管理它们。每一个被管理的系统上又运行一个叫做代理者（agent）的软件元件，且通过SNMP对管理系统报告资讯。
基本上，SNMP代理者以变量呈现管理资料。管理系统透过GET，GETNEXT和GETBULK协定指令取回资讯，或是代理者在没有被询问的情况下，使用TRAP或INFORM传送资料。管理系统也可以传送配置更新或控制的请求，透过SET协定指令达到主动管理系统的目的。配置和控制指令只有当网络基本结构需要改变的时候使用，而监控指令则通常是常态性的工作。
可透过SNMP存取的变量以阶层的方式结合。这些分层和其他元数据（例如变量的类型和描述）以管理信息库（MIBs）的方式描述。协议发展第一版
SNMP第一版和SMI规格的资料型态SNMP第一版SMI指定许多SMI规格的资料型态，它们被分为两大类：
简单资料型态 
泛应用资料型态 
第二版
SNMP第二版和管理资讯结构SNMP第二版SMI在RFC 2578之中描述，它在SNMP第一版的SMI规格资料型态上进行增加和强化，例如位元串（bit strings）、网络位址（network addresses）和计数器（counters）。
SNMP协定在OSI模型的应用层（第七层）运作，在第一版中指定五种核心PDU：
GET REQUEST 
GET NEXT REQUEST 
GET RESPONSE 
SET REQUEST 
TRAP 
其他PDU在SNMP第二版加入，包含：
GETBULK REQUEST 
INFORM 
SNMP第二版SMI资讯模块SNMP第二版SMI也指定了资讯模块来详细说明一群相关连的定义。有三种SMI资讯模块：MIB模块、回应状态、能力状态。
第三版
SNMP第三版SNMP第三版由RFC 3411-RFC 3418定义，主要增加SNMP在安全性和远端配置方面的强化。
SNMP第三版提供重要的安全性功能：
信息完整性：保证封包在传送中没有被窜改。 
认证：检验信息来自正确的来源。 
封包加密：避免被未授权的来源窥探。
信息
MIB，Management Information Base：管理信息库，由网络管理协议访问的管理对象数据库，它包括SNMP可以通过网络设备的SNMP管理代理进行设置的变量。SMI，Structure of Management Information：管理信息结构，用于定义通过网络管理协议可访问的对象的规则。SMI定义在MIB中使用的数据类型及网络资源在MIB中的名称或表示。
使用SNMP进行网络管理需要下面几个重要部分：管理基站，管理代理，管理信息库和网络管理工具。管理基站通常是一个独立的设备，它用作网络管理者进行网络管理的用户接口。基站上必须装备有管理软件，管理员可以使用的用户接口和从MIB取得信息的数据库，同时为了进行网络管理它应该具备将管理命令发出基站的能力。
管理代理是一种网络设备，如主机，网桥，路由器和集线器等，这些设备都必须能够接收管理基站发来的信息，它们的状态也必须可以由管理基站监视。管理代理响应基站的请求进行相应的操作，也可以在没有请求的情况下向基站发送信息。
MIB是对象的集合，它代表网络中可以管理的资源和设备。每个对象基本上是一个数据变量，它代表被管理的对象的一方面的信息。
最后一个方面是管理协议，也就是SNMP，SNMP的基本功能是：取得，设置和接收代理发送的意外信息。取得指的是基站发送请求，代理根据这个请求回送相应的数据，设置是基站设置管理对象(也就是代理)的值，接收代理发送的意外信息是指代理可以在基站未请求的状态下向基站报告发生的意外情况。
SNMP为应用层协议，是TCP/IP协议族的一部分。它通过用户数据报协议(UDP)来操作。在分立的管理站中，管理者进程对位于管理站中心的MIB的访问进行控制，并提供网络管理员接口。管理者进程通过SNMP完成网络管理。SNMP在UDP、IP及有关的特殊网络协议(如，Ethernet, FDDI, X.25)之上实现。
风险
接入Internet的网络面临许多风险，Web服务器可能面临攻击，邮件服务器的安全也令人担忧。但除此之外，网络上可能还存在一些隐性的漏洞。大多数网络总有一些设备运行着SNMP服务，许多时候这些SNMP服务是不必要的，但却没有引起网络管理员的重视。
根据SANS协会的报告，对于接入Internet的主机，SNMP是威胁安全的十大首要因素之一；同时，SNMP还是Internet主机上最常见的服务之一。特别地，SNMP服务通常在位于网络边缘的设备（防火墙保护圈之外的设备）上运行，进一步加剧了SNMP带来的风险。这一切听起来出人意料，但其实事情不应该是这样的。
背景知识
SNMP开发于九十年代早期，其目的是简化大型网络中设备的管理和数据的获取。许多与网络有关的软件包，如HP的Open View和Nortel Networks的Optivity Network Management System，还有Multi Router Traffic Grapher（MRTG）之类的免费软件，都用SNMP服务来简化网络的管理和维护。
由于SNMP的效果实在太好了，所以网络硬件厂商开始把SNMP加入到它们制造的每一台设备。今天，各种网络设备上都可以看到默认启用的SNMP服务，从交换机到路由器，从防火墙到网络打印机，无一例外。
仅仅是分布广泛还不足以造成威胁，问题是许多厂商安装的SNMP都采用了默认的通信字符串（例如密码），这些通信字符串是程序获取设备信息和修改配置必不可少的。采用默认通信字符串的好处是网络上的软件可以直接访问设备，无需经过复杂的配置。
通信字符串主要包含两类命令：GET命令，SET命令。GET命令从设备读取数据，这些数据通常是操作参数，例如连接状态、接口名称等。SET命令允许设置设备的某些参数，这类功能一般有限制，例如关闭某个网络接口、修改路由器参数等功能。但很显然，GET、SET命令都可能被用于拒绝服务攻击（DoS）和恶意修改网络参数。
最常见的默认通信字符串是public（读/写）和private（只读），除此之外还有许多厂商私有的默认通信字符串。几乎所有运行SNMP的网络设备上，都可以找到某种形式的默认通信字符串。
SNMP2.0和SNMP1.0的安全机制比较脆弱，通信不加密，所有通信字符串和数据都以明文形式发送。攻击者一旦捕获了网络通信，就可以利用各种嗅探工具直接获取通信字符串，即使用户改变了通信字符串的默认值也无济于事。
近几年才出现的SNMP3.0解决了一部分问题。为保护通信字符串，SNMP3.0使用DES（DataEncryptionStandard）算法加密数据通信；另外，SNMP3.0还能够用MD5和SHA（SecureHashAlgorithm）技术验证节点的标识符，从而防止攻击者冒充管理节点的身份操作网络。
虽然SNMP3.0出现已经有一段时间了，但目前还没有广泛应用。如果设备是2、3年前的产品，很可能根本不支持SNMP3.0；甚至有些较新的设备也只有SNMP2.0或SNMP1.0。
即使设备已经支持SNMP3.0，许多厂商使用的还是标准的通信字符串，这些字符串对黑客组织来说根本不是秘密。因此，虽然SNMP3.0比以前的版本提供了更多的安全特性，如果配置不当，其实际效果仍旧有限。
禁用SNMP
要避免SNMP服务带来的安全风险，最彻底的办法是禁用SNMP。如果你没有用SNMP来管理网络，那就没有必要运行它；如果你不清楚是否有必要运行SNMP，很可能实际上不需要。即使你打算以后使用SNMP，只要现在没有用，也应该先禁用SNMP，直到确实需要使用SNMP时才启用它。
下面列出了如何在常见的平台上禁用SNMP服务。
■Windows XP和Windows 2000
在XP和Win2K中，右击“我的电脑”，选择“管理”。展开“服务和应用程序”、“服务”，从服务的清单中选择SNMP服务，停止该服务。然后打开服务的“属性”对话框，将启动类型改为“禁用”（按照微软的默认设置，Win2K/XP默认不安装SNMP服务，但许多软件会自动安装该服务）。
■WindowsNT4.0
选择“开始”→“设置”，打开服务设置程序，在服务清单中选择SNMP服务，停止该服务，然后将它的启动类型改为禁用。
■Windows9x
打开控制面板的网络设置程序，在“配置”页中，从已安装的组件清单中选择“MicrosoftSNMP代理”，点击“删除”。检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices和HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run注册键，确认不存在snmp.exe。
■Cisco Systems硬件
对于Cisco的网络硬件，执行“noSNMP-server”命令禁用SNMP服务。如果要检查SNMP是否关闭，可执行“showSNMP”命令。这些命令只适用于运行CiscoIOS的平台；对于非IOS的Cisco设备，请参考随机文档。
■HP硬件
对于所有使用Jet Direct卡（绝大部分HP网络打印机都使用它）的HP网络设备，用telnet连接到Jet Direct卡的IP地址，然后执行下面的命令：
SNMP-config:0
quit
这些命令将关闭设备的SNMP服务。但必须注意的是，禁用SNMP服务会影响服务的发现操作以及利用SNMP获取设备状态的端口监视机制。
■RedHatLinux
对于RedHatLinux，可以用Linuxconf工具从自动启动的服务清单中删除SNMP，或者直接从/etc/services文件删除启动SNMP的行。对于其他Linux系统，操作方法应该也相似。
保障SNMP的安全
如果某些设备确实有必要运行SNMP，则必须保障这些设备的安全。首先要做的是确定哪些设备正在运行SNMP服务。除非定期对整个网络进行端口扫描，全面掌握各台机器、设备上运行的服务，否则的话，很有可能遗漏一、二个SNMP服务。特别需要注意的是，网络交换机、打印机之类的设备同样也会运行SNMP服务。确定SNMP服务的运行情况后，再采取下面的措施保障服务安全。
■加载SNMP服务的补丁
安装SNMP服务的补丁，将SNMP服务升级到2.0或更高的版本。联系设备的制造商，了解有关安全漏洞和升级补丁的情况。
■保护SNMP通信字符串
一个很重要的保护措施是修改所有默认的通信字符串。根据设备文档的说明，逐一检查、修改各个标准的、非标准的通信字符串，不要遗漏任何一项，必要时可以联系制造商获取详细的说明。
■过滤SNMP
另一个可以采用的保护措施是在网络边界上过滤SNMP通信和请求，即在防火墙或边界路由器上，阻塞SNMP请求使用的端口。标准的SNMP服务使用161和162端口，厂商私有的实现一般使用199、391、705和1993端口。禁用这些端口通信后，外部网络访问内部网络的能力就受到了限制；另外，在内部网络的路由器上，应该编写一个ACL，只允许某个特定的可信任的SNMP管理系统操作SNMP。例如，下面的ACL只允许来自（或者走向）SNMP管理系统的SNMP通信，限制网络上的所有其他SNMP通信：
access-list 100 permit iphost w.x.y any
access-list 100 deny udp any any eq snmp
access-list 100 deny udp any any eq snmp trap
access-list 100 permit ip any any
这个ACL的第一行定义了可信任管理系统（w.x.y）。利用下面的命令可以将上述ACL应用到所有网络接口：
interface serial0
ip access-group 100 in
总之，SNMP的发明代表着网络管理的一大进步，现在它仍是高效管理大型网络的有力工具。然而，SNMP的早期版本天生缺乏安全性，即使最新的版本同样也存在问题。就象网络上运行的其他服务一样，SNMP服务的安全性也是不可忽视的。不要盲目地肯定网络上没有运行SNMP服务，也许它就躲藏在某个设备上。那些必不可少的网络服务已经有太多让人担忧的安全问题，所以最好关闭SNMP之类并非必需的服务——至少尽量设法保障其安全。
数据
简单网络管理协议（SNMP）是目前TCP/IP网络中应用最为广泛的网络管理协议。1990年5月，RFC1157定义了SNMP（simplenetworkmanagementprotocol）的第一个版本SNMPv1。RFC1157和另一个关于管理信息的文件RFC1155一起，提供了一种监控和管理计算机网络的系统方法。因此，SNMP得到了广泛应用，并成为网络管理的事实上的标准。
SNMP在90年代初得到了迅猛发展，同时也暴露出了明显的不足，如，难以实现大量的数据传输，缺少身份验证（Authentication）和加密（Privacy）机制。因此，1993年发布了SNMPv2，具有以下特点：
支持分布式网络管理
扩展了数据类型
可以实现大量数据的同时传输，提高了效率和性能
丰富了故障处理能力
增加了集合处理功能
加强了数据定义语言
信息库
管理信息库MIB指明了网络元素所维持的变量（即能够被管理进程查询和设置的信息）。MIB给出了一个网络中所有可能的被管理对象的集合的数据结构。SNMP的管理信息库采用和域名系统DNS相似的树型结构，它的根在最上面，根没有名字。图3画的是管理信息库的一部分，它又称为对象命名（objectnamingtree）。
对象命名树的顶级对象有三个，即ISO、ITU-T和这两个组织的联合体。在ISO的下面有4个结点，其中的一个（标号3）是被标识的组织。在其下面有一个美国国防部（DepartmentofDefense）的子树（标号是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个类别，见表4。现在demib-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}等。
查询
作用简述SNMP是"SimpleNetworkManagementProtocol"的缩写，中文含义是"简单网络管理协议"，这个协议的作用和详细情况，各位可以参考有关资料．这里只介绍针对这个协议进行状态查询的工具软件Snmputilg.exe．也是支持工具目录中所提供的．至于用途，不外乎是给系统管理员提供关于SNMP方面的信息，便于在排除故障的时候当做参考．打开工具显示界面之后，你就可以用来执行诸如GET,GET-NEXT等等操作或进行有关的设置．另外，这个工具也能将数据保存到剪贴板，或将数据保存为以逗号为结束符号的文本文件．在使用中应当注意：即使多数对象的都使用了默认的ID标识（数值），你也要谨慎地使用SNMPSET命令，因为不正确地使用这个命令之后，可能导致网络名称资源方面的问题或是在引起连通方面的问题。使用方法1.启动程序：在windows2000的环境中，点击"开始－>运行"，在编辑框中键入snmputilg然后回车或点击"确定"。
2.和以前遇到的不同，Snmputilg.exe是一个图形界面的工具，尽管执行程序的时候可以使用命令行控制窗口打开它，但实际启动成功之后出现的界面仍然是图形的
3.工具启动后，Node编辑框中显示的是默认的回送地址，地址值是127.0.0.1；CurrentOID指的是"当前对象标识符"，标识是windows系统中用来代表一个对象的数字，每个标识都是整个系统中唯一的，也就是说，标识不会、也不允许重复．图中显示的值是.1.3.6.1.2.1．public是community一项的默认选择．上面所介绍的这些项目也可选定别的值。
4.如果选择了别的系统的IP地址，则必须运行SNMP服务，而目标系统必须配置好网络访问的地址，所谓配置，包括地址设置和权限打开．同时，所需要的辅助工具也应当具备或运行．缺省情况下，windows2000对所有另外系统的IP地址都是允许访问的。
5.另一个问题是community，当选定community的值时，一要注意它所代表的对象必须存在，二要注意其"可读"属性只有获准许可之后才能进行读操作．三要注意这个项目在windows系列的不同版本中，对访问地址的限制可能不一样。
6.凡是SNMP可以执行的功能（SNMPFunctiontoExecute），在图中下拉组合框中都已经列出，可供选择．选择好之后，请鼠标点击ExecuteCommand按钮来执行对应的操作。
以下是这些操作的功能简介：
GETthevalueofthecurrentobjectidentifier：得到当前对象的ID标识数值
GETtheNEXTvalueafterthecurrentobjectidentifier(thisisthedefault)：得到紧接当前对象之后的下一个对象的ID标识数值（这是默认的）
GETtheNEXT20valuesafterthecurrentobjectidentifier：得到当前对象之后的20个对象的ID标识数值
GETallvaluesfromobjectidentifierdown(WALKthetree)：得到从当前对象往下的所有对象的ID标识数值
WALKthetreefromWINSvaluesdown：从WINS值往下漫游目录
WALKthetreefromDHCPvaluesdown：从DHCP值往下漫游目录
WALKthetreefromLANMANvaluesdown：从LANMAN值往下漫游目录
WALKthetreefromMIB-IIdown(InternetMIB)：从MIB-II往下漫游目录
7.显示结果含义解释：
这些结果可以清除，也可以保存或更新，要实现上述功能，可以使用菜单中对应的操作，具体地说，这些操作包括：
将一个或多个结果拷贝入剪贴板.
删除现在列出的所有内容．
清除已经执行过的所有的命令.
请求记录当前已经选定的项目.
产生一个文本文件，用该文件保存所有的记录的映像
编辑或设置某个对象的标识．在使用这个操作时要谨慎，因为一旦进行了不正确地设置，将可能导致网络名称资源方面的问题或是在引起连通方面的问题.
协议操作
SNMPv2标准的核心就是通信协议———它是一个请求/应答式的协议。
这个协议提供了在manager与agent、manager与manager之间交换管理信息的直观、基本的方法。
每条SNMPv2的报文都由一些域构成:
如果发送方、接收方的两个Party都采用了验证(authentication)机制,它就包含与验证有关的信息;否则它为空(取NULL)。验证的过程如下:发送方和接收方的Party都分别有一个验证用的密钥(secretkey)和一个验证用的算法。报文发送前,发送方先将密钥值填入图中digest域,作为报文的前缀。然后根据验证算法,对报文中digest域以后(包括digest域)的报文数据进行计算,计算出一个摘要值(digest),再用摘要值取代密钥,填入报文中的digest域。接收方收到报文后,先将报文中的摘要值取出来,暂存在一个位置,然后用发送方的密钥放入报文中的digest。将这两个摘要值进行比较,如果一样,就证明发送方确实是srcParty域中所指明的那个Party,报文是合法的;如果不一样,接收方断定发送方非法。验证机制可以防止非法用户"冒充"某个合法Party来进行破坏。
authInfo域中还包含两个时间戳(timestamp),用于发送方与接收方之间的同步,以防止报文被截获和重发。
SNMPv2的另一大改进是可以对通信报文进行加密,以防止监听者窃取报文内容。除了privDst域外,报文的其余部分可以被加密。发送方与接收方采用同样的加密算法(如DES)。
通信报文可以不加任何安全保护,或只进行验证,也可以二者都进行。
OSI
在CLTS上的映射
在CLTS[7，8]上的SNMP映射是直通方式的。步骤原理和UDP采用的相同。注意CLTS
和服务都是通过包含了全部地址信息的UDP信息传输包来提供的。因此，[1]中的“传输地
址”，映射在CLTS上的SNMP仅仅是一个传输选项和网络地址。
应该注意到，正如[1，5]中描述的那样，映射在面向非连接的传输服务上的SNMP和
SNMP的结构原理是完全一致的。然而，CLTS本身既可以采用一个面向无连接方式，又可以采用面向连接的网络服务方式实现。在这种映射中描述的映射支持任意实现方式。(当提供所有网络服务时，应该以CLNS为实现基础。)
周知地址
不象Internet协议组，OSI没有使用周知口。当然，多路分解技术基于“选择器”发生，“选择器”是具有局部重要意义的不透明八位字串。为了照顾基于CLTS的可互操作的SNMP实现，定义四个选择器是必要的。当CLTS采用无连接模式的网络服务来提供反向SNMP传输时，应该采用由6个ASCII字符组成的“snmp-l”传输选择器；按照约定，会发送一个SNMP中断给一个正在监听由7个ASCII字符组成的“snmp-l”传输选择器的SNMP管理器。当CLTS采用面向连接的网络服务来提供反向SNMP传输时，应该采用由6个ASCII字符组成“snmp-o”传输选择器；按照约定，会发送一个SNMP中断给一个正在监听由7个ASCII字符组成的“snmp-o”传输选择器的SNMP管理器。
中断
当SNMP中断在CLTS上发送时，Trap-PDU中的代理地址字段包含了IP地址“0.0.0.0”。SNMP管理器可以基于由传输服务提供的信息(也就是源自T-UNIT-DATA.INDICATION基本数据单元的)探知陷阱的来源。
最大消息尺寸
一个在OSI上运行SNMP的实体应该准备好接收大小至少484个字节的消息。鼓励应用随时可能发生的更大的数值。
作用
SNMP是目前最常用的网络管理协议。SNMP被设计成与协议无关，所以它可以在IP，IPX，AppleTalk，OSI以及其他用到的传输协议上被使用。SNMP是一系列协议组和规范（见下表），它们提供了一种从网络上的设备中收集网络管理信息的方法。SNMP也为设备向网络管理工作站报告问题和错误提供了一种方法。
目前，几乎所有的网络设备生产厂家都实现了对SNMP的支持。领导潮流的SNMP是一个从网络上的设备收集管理信息的公用通信协议。设备的管理者收集这些信息并记录在管理信息库（MIB）中。这些信息报告设备的特性、数据吞吐量、通信超载和错误等。MIB有公共的格式，所以来自多个厂商的SNMP管理工具可以收集MIB信息，在管理控制台上呈现给系统管理员。
通过将SNMP嵌入数据通信设备，如路由器、交换机或集线器中，就可以从一个中心站管理这些设备，并以图形方式查看信息。目前可获取的很多管理应用程序通常可在大多数当前使用的操作系统下运行，如Windows95、Windows98、WindowsNT和不同版本UNIX的等。
一个被管理的设备有一个管理代理，它负责向管理站请求信息和动作，代理还可以借助于陷阱为管理站主动提供信息，因此，一些关键的网络设备（如集线器、路由器、交换机等）提供这一管理代理，又称SNMP代理，以便通过SNMP管理站进行管理。