大纲

一、什么是SNMP

二、SNMP背景

三、SNMP结构概述

四、SNMP支持的网管操作

五、SNMP的实现结构

六、SNMP的技术内容

七、SNMP的发展历史

八、SNMP的技术术语

九、综合上述(总结)

十、Net-SNMP详解

十一、SNMP的MIB详解

注,实验环境 CentOS 6.4 x86_64 软件版本 net-snmp 5.5。(说明:本博文的一些图片自于开源社区与官方网站并不是所有内容全是原创)


一、什么是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支持。


3.支持的平台

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


4.实验环境 

  • 操作系统,CentOS 6.4 X86_64

  • 软件版本,net-snmp 5.5


5.同步时间

1
[root@snmp ~] # ntpdate 202.120.2.101


6.安装yum源

[root@node1 ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@node1 ~]# 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
[root@node1 ~] # 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
[root@node1 ~] # yum install -y net-snmp net-snmp-utils


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

1
2
3
4
[root@node1 ~] # 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
[root@node1 ~] # 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
[root@node1 ~] # 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
[root@node1 ~] # 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