[关闭]
@ranger-01 2018-05-16T11:55:28.000000Z 字数 5612 阅读 1744

SNMP 简介

snmp


1. 为什么会有SNMP

随着网络的规模越来越庞大,网络中的设备种类繁多,如何对越来越复杂的网络进行有效的管理,从而提供高质量的网络服务已成为网络管理所面临的最大挑战。网络管理已成为整个网络解决方案中重要的一部分。

网络管理通常包含4个要素:

image_1c2o48jio1sfj1iol12g317cm9mqm.png-35.8kB

注: “对MIB的读取与写操作”是指对MIB所标示的对象进行get和set。相当于这个对象提供了get和set方法

2. SNMP简介

2.1 SNMP 报文

get/set:
image_1c2o92g1d1mivi6ufrnacs16ju1t.png-194.2kB

PDU类型 名称
0 get-request
1 get-next-request
2 get-response
3 set-request
4 trap

trap V1
image_1c2o92smh5085um1hrmhdfi402a.png-92.2kB

trap V2
image_1c2o93b2v7hfjofo9eqs3pbj2n.png-71.1kB

2.2 SNMP 协议数据单元(PDU)

SNMP规定了5种协议数据单元PDU(也就是SNMP报文),用于NMS与Agent的交互
image_1c2o4qdk11dcpd52og0ajr1vef13.png-42kB
各种报文的操作如下:

前面3种操作由NMS向Agent发出,后面2种操作由Agent向NMS发出。

2.3 MIB file

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

MIB file 语法

  1. MY-MIB DEFINITIONS ::= BEGIN
  2. IMPORTS
  3. OBJECT-TYPE, Integer32, NOTIFICATION-TYPE, enterprises
  4. FROM SNMPv2-SMI
  5. ;
  6. myCompany OBJECT IDENTIFIER ::= {enterprises 42}
  7. testCount OBJECT-TYPE
  8. SYNTAX Integer32
  9. MAX-ACCESS read-only
  10. STATUS current
  11. DESCRIPTION "A sample count of something."
  12. ::= {myCompany 1}
  13. testDescription OBJECT-TYPE
  14. SYNTAX OCTET STRING
  15. MAX-ACCESS read-only
  16. STATUS current
  17. DESCRIPTION "A description of something"
  18. ::= {myCompany 2}
  19. testTrap NOTIFICATION-TYPE
  20. STATUS current
  21. DESCRIPTION "Test notification"
  22. ::= {myCompany 3}
  23. END

2.4 SNMP 协议版本

SNMP协议在OSI模型的应用层(第七层)运作,在第一版中指定五种核心PDU:

SNMP第二版加入:

SNMP第三版提供重要的安全性功能:

2.5 SNMP 技术术语

3. SNMP 实现之:net-snmp

image_1c2oerhcae7gq9p1n1819h11qpc34.png-155.4kB

3.1 查看net-snmp相关package

  1. # yum list all | grep net-snmp*
  2. net-snmp.x86_64 1:5.5-44.el6_4.4 updates
  3. net-snmp-devel.i686 1:5.5-44.el6_4.4 updates
  4. net-snmp-devel.x86_64 1:5.5-44.el6_4.4 updates
  5. net-snmp-libs.i686 1:5.5-44.el6_4.4 updates
  6. net-snmp-libs.x86_64 1:5.5-44.el6_4.4 updates
  7. net-snmp-perl.x86_64 1:5.5-44.el6_4.4 updates
  8. net-snmp-python.x86_64 1:5.5-44.el6_4.4 updates
  9. net-snmp-utils.x86_64 1:5.5-44.el6_4.4 updates
  10. # rpm -qa | grep net-snmp*
  11. net-snmp-utils-5.5-60.el6.x86_64
  12. (snmp客户端,如snmpget)
  13. net-snmp-devel-5.5-60.el6.x86_64
  14. (开发subagent时要用到的编译工具:net-snmp-config --compile-subagent Test Test.c
  15. net-snmp-5.5-60.el6.x86_64
  16. server端:snmpdsnmptrapd
  17. net-snmp-perl-5.5-60.el6.x86_64
  18. (可以根据mib生成对应源代码:env MIBS="+/etc/snmp/mibs/Test-MIB.my" mib2c Test
  19. net-snmp-libs-5.5-60.el6.x86_64
  20. # rpm -ql net-snmp-utils
  21. /usr/bin/encode_keychange
  22. /usr/bin/snmpbulkget
  23. /usr/bin/snmpbulkwalk
  24. /usr/bin/snmpdelta
  25. /usr/bin/snmpdf
  26. /usr/bin/snmpget
  27. /usr/bin/snmptrap
  28. ...
  29. ...

3.2 net-snmp扩展MIB

用net-snmp扩展MIB库,实现方法可归结为四种:

1)一是静态库方式,通过修改配置头文件,在相应地方包含新引入的mib模块的.c和.h文件,然后重新编译库文件和扩展代码;这种方式不够灵活,每次修改扩展的MIB后,都需要重新编译snmpd和扩展的代码,再重新安装snmpd到系统中。

2)二是编译动态共享库,只需把新引入的MIB模块的.c和.h文件编译成动态库,通过设置能够让代理程序载入。

对于第二种方式,一需要编译成.so动态共享库,二需要原代理程序是否包含dlmod或load命令,三还要看系统是否支持。一般情况下仅支持Unix平台。

3)三是扩展一个子代理,让SNMPD以主代理的模式运行,对于SNMPD我们只要让它启动就可以,不需要任何的更改和配置,把子代理编译生成的程序运行起来就可以扩展自定义的MIB库。

4)用shell脚本来扩展

3.3 snmp常用命令

snmptranslate

  1. % snmptranslate .iso.3.6.1.private.enterprises.2021.2.1.prNames.0
  2. NET-SNMP-MIB::prNames.0
  3. # http://www.oidview.com/mibs/0/SNMPv2-MIB.html
  4. % snmptranslate -On .iso.3.6.1.private.enterprises.2021.2.1.prNames.0
  5. .1.3.6.1.4.1.2021.2.1.2.0
  6. % snmptranslate -Of .iso.3.6.1.private.enterprises.2021.2.1.prNames.0
  7. .iso.org.dod.internet.private.enterprises.ucdavis.procTable.prEntry.prNames.0
  8. # Specifying a MIB object
  9. % snmptranslate sysUpTime.0
  10. Invalid object identifier: sysUpTime.0
  11. % snmptranslate -IR sysUpTime.0
  12. SNMPv2-MIB::sysUpTime.0
  13. % snmptranslate -On -Td -IR sysUpTime
  14. % snmptranslate -On -Td -Ib 'sys.*ime'
  15. % snmptranslate -Tp -IR system

net-snmp-config

  1. # net-snmp-config | grep display
  2. --version displays the net-snmp version number
  3. --indent-options displays the indent options from the Coding Style
  4. --debug-tokens displays a example command line to search to source
  5. --configure-options display original configure arguments
  6. --prefix display the installation prefix
  7. --snmpd-module-list display the modules compiled into the agent
  8. --default-mibs display default list of MIBs
  9. --default-mibdirs display default list of MIB directories
  10. --snmpconfpath display default SNMPCONFPATH
  11. --persistent-directory display default persistent directory
  12. --perlprog display path to perl for the perl modules

3.4 net-snmp FAQ

4. SNMP 实现之pysnmp

4.1 依赖

  1. build-pysnmp-mib

    1. yum install pysnmp
    2. apt-get install python-pysnmp4
  2. pysnmp: pip isntall pysnmp

4.2 write an snmp agent

  1. 写mib file: MY-MIB.txt
  2. 检查mib file是否正确(在ubuntu上有这个命令):smilint ./MY-MIB -s
  3. convert mib to python module build-pysnmp-mib -o MY-MIB.py MY-MIB
  4. write agent code
  5. start snmptrapd(注意调整snmptrapd config): snmptrapd -f -Lo
  6. get info from agent: snmpwalk -m MY-MIB -v 2c -c public localhost .1
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注