1工具的整体架构设计
1.1对象模型的设计Perl语言本身并没有面向对象的特性,为了设计出比较结构清晰的对象模型,本管理工具采用CPAN(Perl综合程序库)提供的第三方程序模块Object::InsideOut作为支持面向对象特性的框架。1.1.1设备抽象层设计考虑到需要提供一个高效统一的管理工具,那么就需要将过去分散孤立的脚本和软件提供的功能整合在一起。整合并不是简单的将原有功能罗列在一起,而应该是有机结合,结构清晰,设计风格统一,能够便于复用。根据对当前数据中心内网络设备管理的需求分析,设备抽象层的类大体可以分为主机,交换机,存储等三大类[5,6]。在具体细分,主机类又可以根据其操作系统的不同,分为Windows,Redhat,Suse,Unix等等,交换机类根据厂商产品系列的不同可以分为Brocade,Cisco,Qlogic等等,存储也可分为EMC的Symetrics,vMax,vPlex,IBM的DS8000,XIV,SVC等[7,8]。无论封装实现的是什么设备,无论底层有多么大的不同,为了便于上层集成调用,应当对上层提供一致的接口。从上层来看,无论底层封装的是什么设备,对上层无外乎两个操作,信息收集与数据录入。因此,所有的设备类都需要实现两个方法,collect与import_to_database[9,10]。collect方法实现从设备收集信息的逻辑,而import_to_database实现向数据库录入的逻辑。1.1.2协议适配层设计由于本文中设计的是一个集中统一网络管理的工具,必须通过一些网络协议来远程操控设备。常见的网络管理协议有SSH,Telnet,Winexe等。现实中,不同设备可能共用同一种协议,同一种设备可能在不同协议之间切换的现状,也就是说,特定协议与特定类型的设备之间是没有必然联系的[11]。这就决定了网络协议的逻辑不能在设备抽象层内实现,而应该独立出来,单独设计一个协议适配层。设计良好的协议适配层类能够在不同设备之间轻松调换使用,提供了极大的开发灵活性[12]。对于一个网络协议,常见的用户场景就是,建立连接,发送命令并接收返回的文本,关闭连接。所以,一个协议适配层类应当实现三个方法,open,cmd,close。open方法用于建立连接,cmd方法用于发送命令并接收文本,close方法用于关闭连接。在设备抽象类的对象实例化的时候,只需要通过目标设备的对象的属性将协议对象动态传递进去即可。由于协议适配层的类具有相同的接口,更换协议对设备抽象层的类来说是完全透明的。1.1.3自动识别模块设计管理众多的设备的静态登记信息,如果只是依赖管理员的记忆力,或者是Excel表格,费时费力,结果也并不可靠[13]。首先要设计一个能够从网络当中自动抓取活动IP,并识别出运行在该IP地址上的设备类型的模块。当活动IP地址被从一个子网中扫描出来以后,进一步识别设备的类型可以分为网络扫描和远程命令试探两个阶段。第一阶段的网络扫描主要是为了下一步的命令试探缩小范围。无论是主机,交换机,还是存储设备,都会对外打开一些固定的网络服务,这些网络服务通常都监听特定的端口,通过扫描端口可以大致了解设备打开了哪些网络服务,进一步可以猜测设备可能对应的类型[14]。在扫描端口之后,进入第二阶段,发送前期锁定的几种可能的设备类型上支持的命令,再通过Perl语言内置的正则表达式搜索特征关键字。如果成功捕获到了响应的关键字,就成功地识别了设备类型。类型识别成功后,才能调用响应类型的设备抽象类,对设备进行信息收集与管理。
2自动识别模块的具体实现
2.1网络扫描部分在第一阶段的网络扫描中,首先由Subnet类负责活动IP的获取,之后将活动的IP地址实例化为IP类的实例。之后IP类会扫描该IP地址上的哪些端口已经被监听了。这两个类依赖于Nmap提供底层功能的支持。Nmap是一款用于网络安全审计的工具,可以列举主机,监控网络服务运行情况。Nmap不仅可以扫描单个IP地址,还可以对整个网络进行大规模扫描。同时,Nmap也是一款遵守GNU通用公共许可协议的软件,可以免费地在本文要设计的工具中集成使用。2.2远程命令试探部分这部分逻辑通过一组工厂类被实现。当设备类型被检测完成后就会实例化响应类型的对象来完成后面的信息收集与数据录入工作。考虑到设备类型较多,都在一个工厂类内实现太过繁杂,可以将具体工作分解到若干个类中完成,每个工厂负责某一大类设备的识别与实例化工作,形成一个三层的工厂树。处理具体大类的工厂类可分为处理服务器的ServerFactory,处理交换机的SwitchFactory,处理存储的StorageFactory等等。首先由顶层的基本工厂类接收一个IP地址作为参数,然后将IP地址像放上流水线一样,依次交给每一个负责具体大类的工厂类处理,当流水线上的某一个工厂类成功的处理了这个IP地址,就用识别的到的类型为该IP地址实例化一个设备对象出来,如果当前工厂类无法处理,则交给流水线上的下一个工厂类继续处理。要发送远程命令首先涉及到选用什么网络协议的问题。网络协议一般都会监听固定的端口号,这就是所谓知名端口。通过查找知名端口表就可以知道网络设备打开了哪些网络协议的服务。通常,打开22号端口意味着设备打开了SSH协议的服务器,这是一台Linux或者Unix系列操作系统的服务器的常见配置。这种情况下,工厂类就会调用SSH协议,发送Linux或者Unix系统上的命令,然后尝试从返回的文本捕获预期的关键字。可以看到,ServerFactory在处理的时候,首先检查22端口是否已被监听。发现22端口已被监听之后,则通过SSH协议连接目标IP地址,发送Linux和Unix系列操作系统上的uname命令,如果从返回的文本里捕获到“Linux”,表明目标服务器是一个Linux服务器,如果捕获到“AIX”,表明目标服务器已经安装了IBM的AIX操作系统。
3网络管理工具的完整运行流程
整个工具运行时的完整流程如图3所示。scan_network是整个程序的入口点,通过-n选项传递一个网络地址及其子网掩码,Subnet类会找出这个网段里的所有可用的活动的IP地址,然后为每一个IP地址调用scan_ip。在scan_ip中,BaseFactory会被调用,它会依次尝试使用StorageFactory,SwitchFactory,ServerFactory来处理这个IP地址。每个工厂类都会检查该地址上有哪些端口被打开了,然后使用命令尝试识别设备的类型。类型识别完成后,就会为该地址实例化一个设备对象,调用它的collect方法收集信息,然后调用import_into_database完成数据录入。
4结束语
本网络管理工具基于端口扫描和工厂模式设计实现,具有自动化程度高,易学习,易配置的特点。面向对象的设计风格使其代码逻辑更为清晰,更加易于复用。一改过去管理工具功能单一,分散,成本高,维护困难的局面,可大量节省人力,使管理人员更多地把精力集中在对网络整体拓扑的关注上面,而不必过多将精力耗费在细节问题上。管理人员可以基于该工具本身数据库所包含的信息,自行开发一些分析工具,满足自己个性化的需求。信息收集与分析的分离也职称论文发表带来了极大的灵活性,使得该工具的适应范围更广。
作者:王瑛 单位:上海中医药大学 现教中心