基于SNMP的网络拓扑发现
摘 要 随着计算机网络的高速发展,网络管理变的日趋复杂,为了提高网络设备和服务管理的智能性和可操作性,对网络拓扑高效而准确地发现成为网络管理中重要的环节。 关键词 网络拓扑;简单网络管理协议;管理信息库;网络管理;三层拓扑发现;二层拓扑发现
1 引言
现代计算机网络迅猛发展,网络管理的任务也日趋复杂,而保证网络管理系统高效运行的基础正是网络拓扑发现。网络拓扑表现为计算机网络中各设备之间的连接关系。网络拓扑发现更能提高网络故障管理、计量管理、配置和名称管理、性能管理和安全管理的性能,其原理是利用协议收集网络中各设备的信息,通过某种算法生成完整的拓扑结构显示出来。本文介绍的就是基于snmp协议的网络拓扑发现。2 简单网络管理协议snmp及mib信息库概述
2.1 snmp概述
snmp名为“简单网络管理协议”,snmp基于tcp/ip协议工作,对网络中支持snmp协议的设备进行管理,通过snmp协议,管理员可以与各种类型支持snmp协议的设备进行通信,从而进行网络管理。wwW.11665.COm在具体实现上,snmp为管理员提供了一个网管平台(nms),又称为管理站或管理器,负责网管命令发出,数据存储及数据分析等。被监管的设备上则运行一个snmp代理(agent),又称为代理器,代理实现设备与管理站的snmp通信,图1描述了snmp协议的逻辑结构[1]。图1 snmp协议的逻辑结构 1990年5月,rfc1157定义了snmp的第一个版本snmpv1。rfc1157和另一个关于管理信息的文件rfc1155一起提供了一种监控和管理计算机网络的系统方法。因此,snmp得到了广泛应用,并成为网络管理的事实上的标准。90年代初snmp得到了迅猛发展,同时也暴露出了明显的不足,例如难以实现大量的数据传输,缺少身份验证和加密机制。因此,1993年发布了snmpv2,提高效率和性能,同时还支持分布式网络的管理等,但是,snmpv2并没有完全实现预期的目标,尤其是安全性能没有得到提高,如:身份验证(如用户初始接入时的身份验证、信息完整性的分析、重复操作的预防)、加密、授权和访问控制、适当的远程安全配置和管理能力等都没有实现。1996年发布的snmpv2c是 snmpv2的修改版本,功能增强了,但是安全性能仍没有得到改善,继续使用snmpv1的基于明文密钥的身份验证方式。ietf snmpv3工作组于1998年1月提出了互联网建议rfc2271-2275,正式形成snmpv3。这一系列文件定义了包含snmpv1、snmpv2所有功能在内的体系框架和包含验证服务和加密服务在内的全新的安全机制,同时还规定了一套专门的网络安全和访问控制规则。可以说,snmpv3是在snmpv2基础之上增加了安全和管理机制。2.2 mib信息库
tcp/ip网络管理系统的基础是含有被管理元素信息的数据库,其在tcp/ip和osi环境下称为mib。每个被管理资源表示成一个对象,mib是这些对象的结构化集合。mib是一个树型结构的数据库。网络中的每个系统,比如工作站,服务器,路由器等,都维护一个可以反映被管理资源在系统中状态的信息库,通过读取信息库中对象的值,管理站可以监视系统中的资源,也可以通过修改某些值来控制系统中的资源。信息库中对象的类型,意义由mib定义,管理站和代理端按同一个mib作为接口通信,可以互相理解数据的意义,实现管理。 mib树的*对象有三个,即ccitt, iso和这两个组织的联合体joint-iso-ccitt(见图2)。在iso的下面有一个美国国防部dod(department of defense)的子树(标号是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个类别,现在mib-2所包含的信息类别已超过40个。应当指出,mib的定义与具体的网络管理协议无关,这对于厂商和用户都有利。厂商可以在产品(如路由器)中包含snmp代理软件,并保证在定义新的mib项目后该软件仍遵守标准。用户可以使用同一网络管理客户软件来管理具有不同版本的mib的多个路由器。当然,一个没有新的mib项目的路由器不能提供这些项目的信息。图2
2.3 snmp支持的操作
snmp共有5种操作: (1)getrequest 读对象值操作,使管理站能够从被管理设备的代理中检索对象的值。 (2)getnextrequest 读取当前对象的下一个可读取的对象的实例值。 (3)setrequest 管理站更新代理中对象的值。 (4)getresponse 代理对getrequest/getnextrequest/ setrequest 3种操作的应答。 (5)trap 代理向管理站发送对象值。3 基于snmp协议的拓扑发现
利用snmp进行拓扑发现实质上就是扮演管理者角色的工作站读取被管理设备的mib库中相关信息来实现的。每个设备维护一个mib库,里面由此设备相关信息,使用snmp管理网络最大的优点就是可以实时发现网络拓扑的变更,但也有其局限性,即被管理的设备都要支持snmp[2]。在网络拓扑结构中,最主要的是路由器之间的连接关系和子网划分情况,所以网络拓扑关系构建的要点如下: (1)在网络拓扑关系中,主要的组成元素包括网络节点设备,如路由器、交换机以及子网、网桥、网络中的主机等。 (2)路由器、交换机及其端口配置是构建拓扑关系的关键。 网络结构是分层次管理的,所以拓扑发现也应以分层方式来发现。路由器工作在网络层并且通常我们称网络层为第三层,所以以发现路由器和子网连接结构的拓扑发现我们称作三层拓扑发现,子网中主机发现也属于三层拓扑发现,因为采用的方法主要还是依据ip地址操作来发现的;而处于数据链路层的交换机,网桥获取我们可以称作二层拓扑发现。3.1 三层拓扑发现
三层拓扑发现主要是通过对路由表的读取来获取相关ip信息来实现,图3是一个路由表信息图。图3 路由表信息图destination表示路由的目的地址网络号 。 gateway表示下一跳的路由器或网关地址。 genmask表示子网掩码。 iface表示此路由的出口。 数据包在路由过程中,先将它的目的ip依次和路由表中的子网掩码按位与操作,然后分别和每行的目的地址网络号比较,如果相同,则发到gateway标示的下一跳,如果没有匹配的则发送至默认网关,上图最后一行表示了此路由表的默认网关为192.168.1.1。网络拓扑结构在其模型上实质是一个图结构,路由器可以看作图的顶点,网络的连接状况由图的边来表示,所以说网络拓扑结构的发现是对图的遍历过程。图的遍历主要有两种方法,即深度优先搜索(dfs)和广度优先搜索(bfs)。由于拓扑发现采用分层的方式,所以采用广度优先搜索。获取管理工作站所在网络的默认网关地址(通过本地路由表获得)。默认网关的代理进程返回默认网关的iproutetable,可以获得网络中更多的路由器信息,将其放入队列(实现bfs的数据结构)中,利用先进先出的特性依次访问各个路由,重复这两步。访问过程中根据路由器各接口的连接类型来判断是否直连的是局域网(direct类型),记录其子网号和掩码。 实际中会对拓扑发现的范围进行限制,我们可以利用iproutemetric(路由器的跳数)来进行限制,获取相应子网类型的信息可以通过mib-ii中的iftable中的iftype字段来获取,iftype定义如下: iftype object-type syntax integer { other(1),regular1822(2), hdh1822(3), ddn-x25(4), rfc877-x25(5), ethernet-csmacd(6), iso88023-csmacd(7), iso88024-tokenbus(8), iso88025-tokenring(9), iso88026-man(10), starlan(11), proteon-10mbit(12), proteon-80mbit(13), hyperchannel(14), fddi(15), lapb(16), sdlc(17), ds1(18),e1(19),basicisdn(20), primaryisdn(21),proppointtopointserial(22), ppp(23), softwareloopback(24), eon(25), -- clnp over ip [11] ethernet-3mbit(26), nsip(27), -- xns over ip slip(28), -- generic slip ultra(29), -- ultra technologies ds3(30), -- t-3 sip(31), -- smds frame-relay(32) } access read-only status mandatory description "the type of interface, distinguished according to the physical/link protocol(s) immediately `below' the network layer in the protocol stack." ::= { ifentry 3 }
因为iproutetable中的iprouteifindex和iftable中的ifindex是一一对应的,所以可以通过ifindex获得它对应的iftype,从而获取子网类型。 子网内主机的发现,我们最常用的方法就是ping命令了,检查目的主机是否是活动的[3]。ping命令依靠icmp来获取目的主机的活动状态信息,前提是我们知道目的主机的ip地址,但是它的效率很低,只能通过“穷举法”来猜测,例如一个子网172.21.13.0/24,它可以有254台主机,如果使用ping的话我们只能一个一个的猜测,可能实际中主机的数目要远远小于254(针对本例来说),所以这种方法不可取。 mib-ii中存在一个ipnettomediatable对象,它记录了网络地址到物理地址的映射信息,子网中活动主机必然要在其网关的ipnettomediatable中注册自己的信息,ipnettomediatable定义如下: ipnettomediatable object-type syntax sequence of ipnettomedia entry access not-accessible status mandatory description "the ip address translation table used for mapping from ip addresses to physical addresses." ::= { ip 22 } ipnettomediaentry object-type syntax ipnettomediaentry access not-accessible status mandatory description "each entry contains one ipaddress to `physical' address equivalence." index { ipnettomediaifindex, ipnettomedianetaddress } ::= { ipnettomediatable 1 } ipnettomediaentry ::= sequence { ipnettomediaifindex ----------------------对应路由表的iface integer, ipnettomediaphysaddress ---------------------主机物理地址 physaddress, ipnettomedianetaddress ---------------------主机网络地址 ipaddress, ipnettomediatype integer } 我们可以通过ipnettomedianetaddress获取和此路由器或网关连接的子网内所有主机的ip,然后分别和路由表中的子网掩码按位与就得到了它是属于哪个子网了,当然我们也可以用ipnettomediaifindex来关联主机所属的子网号。