随笔- 3  文章- 0  评论- 0 
2009年10月19日
  • 什么是MIB?什么是SMI

MIB全称Management Information Base。

SMI全称Structure of Management Information。

简单的解释一下:

SMI是定义Management Information(管理信息)的一种结构定义,不同的设备信息都有不同的结构定义,而MIB就是将这些不同的管理信息组织起来的一种结构,通俗的说这种结构式一种树形结构,是一层一层下来的。

下图就是一个简单的MIB结构定义

MIB_Tree_2

上面黄色部分就是代表了CISCO公司的MIB库访问路径,总结出来就是:

iso(1).org(3).dod(6).internet(1).private(4).enterprise(1).cisco(9)

为了简单访问,我们一般使用OID(OBJECT IDENTIFIER)来标示访问,如下:

1.3.6.1.4.1.9

大概明白了什么是MIB了吧,那现在再来看看SMI。

          sysName OBJECT-TYPE
               SYNTAX DisplayString (SIZE (0..255))
               ACCESS read-write
               STATUS mandatory
               DESCRIPTION
                      "An administratively-assigned name for this managed node. By convention, this is the node's
                      fully-qualified domain name."
               ::= { system 5 }

上面的定义就是一个SMI的一个例子,上面说了些什么呢?我们从下往上来看。

::= { system 5 }

它的上一个节点叫做system,是system下面编号为5的子节点。


DESCRIPTION
         "An administratively-assigned name for this managed node. By convention, this is the node's
          fully-qualified domain name."

这个是对这个基点的描述,类似于注释信息。

 

STATUS mandatory

此节点在Agent侧实现,是有效的。

 

ACCESS read-write

远端能够读并且写这个节点的值。

 

SYNTAX DisplayString (SIZE (0..255))

这个节点是一个可显示的字符串组成的,大小为0-255。

 

sysName OBJECT-TYPE

此节点的名字叫做sysName。

 

听了上面的解释应该看懂了吧。下面我们来看一下上面那些概念在PySNMP中是怎么样来表示的。

 

 

  • PySNMP中的MIB和SMI

先看看MIB的节点的一个定义:

class MibNode:
    label = ''
    def __init__(self, name):
        self.name = name
        
    def __repr__(self):
        return '%s(%s)' % (self.__class__.__name__, self.name)

    def getName(self): return self.name
    
    def getLabel(self): return self.label
    def setLabel(self, label):
        self.label = label
        return self

    def clone(self, name=None):
        myClone = self.__class__(self.name)
        if name is not None:
            myClone.name = name
        if self.label is not None:
            myClone.label = self.label
        return myClone

MibNode定义了MIB树的节点的基础定义,name就是一个tuple,例如:(1, 3, 6, 1, 4, 1, 20408)。它代表了这个MIB节点的访问路径。

 

再看一下ObjectType的定义:

class ObjectType(MibNode):
    maxAccess = None
    def __init__(self, name, syntax=None):
        MibNode.__init__(self, name)
        self.syntax = syntax

    # XXX
    def __cmp__(self, other): return cmp(self.syntax, other)
    
    def __repr__(self):
        return '%s(%s, %s)' % (
            self.__class__.__name__, self.name, self.syntax
            )    
    def getSyntax(self):
        return self.syntax
    def getUnits(self):
        return getattr(self, 'units', '')
    def setUnits(self, v):
        self.units = v
        return self    
    def getMaxAccess(self):
        return getattr(self, 'maxAccess', 'not-accessible')
    def setMaxAccess(self, v):
        self.maxAccess = v
        return self
    def getStatus(self):
        return getattr(self, 'status', 'current')
    def setStatus(self, v):
        self.status = v
        return self
    def getDescription(self):
        return getattr(self, 'description', '')
    def setDescription(self, v):
        self.description = v
        return self    
    def getReference(self):
        return getattr(self, 'reference', '')
    def setReference(self, v):
        self.reference = v
        return self

    def asn1Print(self):
        return '\
            OBJECT-TYPE\n\
            SYNTAX %s\n\
            UNITS \"%s\"\n\
            MAX-ACCESS %s\n\
            STATUS %s\n\
            DESCRIPTION \"%s\"\n\
            REFERENCE \"%s\"\
            ' % (self.getSyntax().__class__.__name__,
            self.getUnits(),
            self.getMaxAccess(),
            self.getStatus(),
            self.getDescription(),
            self.getReference())
其实仔细的分析上面这个类,就是实现了MIB定义里面的OBJECT-TYPE、SYNTAX、MAX-ACCESS、
STATUS、DESCRIPTION关键字,有几个关键字上面有讲过了。
大家应该有点明白了PySNMP实现的一些道理了吧,如果你需要在深入的琢磨PySNMP对于MIB的表达,
请查看C:\Python26\Lib\site-packages\pysnmp\v4\smi\mibs\SNMPv2-SMI.py
(如果Python装的不一样,请自己更换一下路径)
 
 
上面讲了一些基本的MIB定义,再来看看上面的sysName在PySNMP是怎么定义的吧,如下:
sysName = MibScalar((1, 3, 6, 1, 2, 1, 1, 5), \
DisplayString().subtype(subtypeSpec=constraint.ValueSizeConstraint(0, \
255))).setMaxAccess("readwrite")
if mibBuilder.loadTexts: sysName.setDescription( \
"An administratively-assigned name for this managed\nnode. \
 By convention, this is the node's fully-qualified\ndomain name. \
  If the name is unknown, the value is\nthe zero-length string.")

sysName是MibScalar的实例(MibScalar在SNMPv2-SMI.py中有,大家可以自己看看定义)

OID为(1, 3, 6, 1, 2, 1, 1, 5),

节点的数据类型为可显示字符串DisplayString(),数据类型的约束为0-255个字符subtype(subtypeSpec=constraint.ValueSizeConstraint(0, 255))),

访问的权限为可写可读setMaxAccess("readwrite")

节点的描述信息为setDescription("An administratively-assigned name for this managed\nnode. By convention, this is the node's fully-qualified\ndomain name. If the name is unknown, the value is\nthe zero-length string.")

 

上面的描述够简单了吧,上面的描述是在

C:\Python26\Lib\site-packages\pysnmp\v4\smi\mibs\SNMPv2-MIB.py

文件的第26行,有兴趣可以仔细看一下。

 

再给大家列一下资料,要向成为专家还得从下面这些文档看起。

1、Structure and Identification of Management Information for TCP/IP-based internets    

http://www.ietf.org/rfc/rfc1065.txt

这篇文档定义了SMI的基本语法,就是我们前面提到的DESCRIPTION、STATUS、ACCESS等。

2、Management Information Base for Network Management of TCP/IP-based internets   

http://www.ietf.org/rfc/rfc1066.txt

这篇文档定义了机遇TCP、IP网络的基本MIB信息定义

3、Management Information Base for Network Management of TCP/IP-based internets: MIB-II 

http://www.ietf.org/rfc/rfc1213.txt

这篇文档是对MIB的扩充,也就是通常所说的MIB 2。

 

 
 
posted @ 2009-10-19 18:01 qigo4c 阅读(877) 评论(0) 编辑
2009年10月18日

安装PySNMP还是略微有点麻烦,首先我们要下载PySNMP,和它的一些依赖,当然假设您的电脑上已经装了Python了。

  • 下载PySNMP:

http://sourceforge.net/projects/pysnmp/files/

我下的时候是pysnmp-4.1.11a.tar.gz,是4.1.11a版本的,同时还有一个pysnmp-mibs-0.0.7a.tar.gz,这个是MIB文件,下好了,暂时不用,后面会讲这个到底干什么的。

  • 下载ASN.1 library for Python:

http://sourceforge.net/projects/pyasn1/files/

这个是PySNMP的依赖,必须下的。我下载的时候,最新版本是pyasn1-0.0.9a.tar.gz。

  • 下载Python Cryptography Toolkit:

http://www.amk.ca/python/code/crypto.html

这个东东是用来加密用的,SNMPv3标准支持加密么,但是安装的时候就有点麻烦了,因为是需要C编译的,我为了省心直接下载了一个已经编译好的版本,当然它也只能用于特定操作系统的特定版本Python了,如果你需要其它的操作系统或者Python版本,那就辛苦一下自己编译吧。

编译好的版本见下:

http://www.voidspace.org.uk/python/modules.shtml#pycrypto

我下的是pycrypto-2.0.1.win32-py2.6.exe 。

 

 

下载好了,那么开始安装啦,先装pyasn1-0.0.9a.tar.gz,解压后,直接在dos窗口运行setup.py install,一大堆提示后出现

Writing C:\Python26\Lib\site-packages\pyasn1-0.0.9a-py2.6.egg-info

就OK了。

接下来是Python Cryptography Toolkit,直接运行pycrypto-2.0.1.win32-py2.6,一路Next就可以了。

最后就是PySNMP了,和pyasn1一样,解压后,直接在窗口运行setup.py install,最后会出现

Writing C:\Python26\Lib\site-packages\pysnmp-4.1.11a-py2.6.egg-info

 

装完了以后,让我们来测试一下安装的成果。

在Pysnmp解压的目录下有一个example的目录,首先运行

\examples\v3arch\agent\cmdrsp.py

可以直接双击运行(当然前提是你绑定好了py文件的映射了),或者在DOS窗口下运行python cmdrsp.py。

接下来就是去DOS窗口运行\examples\v3arch\manager\getgen.py

在DOS窗口会出现:

1.3.6.1.2.1.1.1.0 = Example Command Responder

(千万别双击啊,要不然一闪而过,你可看不见这个结果了。)

 

如果上面的example的例子测试通过了,那就说明你的安装都OK,我们就可以不如PySNMP的世界啦。

posted @ 2009-10-18 22:09 qigo4c 阅读(667) 评论(0) 编辑

1、网络管理的基本概念

网络是现在生活当中必不可少的东西,没有它可以说还真没有办法工作和生活。但是面对组成这个网络的众多网络设备,管理起来可不是很简单的事情。

真的难以想象,我目前在敲得这些字,要经过多少厂家的不同型号的设备才会让大家看到。网络的复杂性使管理变得相当痛苦。

要管理网络设备,首先当然是要知道网络设备上的已有信息,其次是能够通过某种手段去改变设备上的信息,从而改变设备的行为。

想想我们这个世界的那些研究员、科学家当然非常早的就想到了这一点,网络管理早在30多年前就开始慢慢形成。而目前事实上的工业标准就是SNMP(简单网络管理协议)。

那么我们首先了解一下作为一个网络管理标准协议的东西,必须具有哪几部分的必须要有的内容呢?

a、网络管理是在两个不同的设备上面交换信息,并对交换的信息由一个一致的处理,这个就是“协议”,也就是设备和设备之间必须有一个统一的标准来传递信息,并有一种非常容易达到一致处理方式的规定。

不同设备间信息的传递是信息都是非常复杂的,SNMP定义了一个非常简单的规则来扩充各个设备的定义,后面会讲具体的。

b、网络设备都是基于受限情况下的系统,它的CPU、内存、存储空间都是极其有限的,因此SNMP就必须满足能够使用非常少的CPU和内存。而基于SNMP的网络管理软件就必须能够同时处理众多的请求,因为网络设备是非常多的,都需要统一到网络管理软件上来。

c、信息传输的安全性,毕竟网络管理都是基于远程的管理,因此必须将传输的信息加密,早期的SNMPv1,SNMPv2c都无法真正满足信息加密的要求,直到SNMPv3的出现,终于能够满足基于用户密码验证和传输信息加密的要求了。

 

2、SNMP的架构

SNMP管理模型定义了三种实体:Agent、Master和Proxy。

Agent是运行在设备侧,用于向Master提供设备信息或接受来自Master的信息。

Master运行在网络管理程序上,它会向设备提出获取信息的请求,并对获得到的信息进行处理。

Proxy是用来解决在Master和Agent之间存在防火墙等情况下,不能直接通信的时候所使用的。有时候,Master和Agent因为不同的SNMP版本无法通信时,Proxy也可以代为作为转换网关。

在这里需要特别强调的一点是,在现代的SNMP标准上,Agent往往可以讲它分成两部分来考虑:Subagent和Master Agent,在Master Agent和Subagent之间可以使用一种非常简单的SNMP来进行通信。

作为被管理的Agent,它可以用概念性的表来对自己的信息进行管理,而Master可以使用如Get之类的请求,来要求Agent返回比管理设备的相关信息。同时也有一种机制,叫做Trap,可以让Agent主动的去告诉Master相关信息。 

对于被管理的网络设备对象,如何去命名这些对方,并对不同类型的设备进行区分呢?这个就要靠叫做OID的东西了,OID就是一串加上点分隔的一串数字,它可以用来代表一类事物。

posted @ 2009-10-18 21:27 qigo4c 阅读(440) 评论(0) 编辑