当前位置:首页 期刊杂志

基于PYTHON开发的IP管理系统

时间:2024-05-04

李杨

(广西医科大学第二附属医院 广西壮族自治区南宁市 530007)

网络在我们工作和生活当中无所不在,而以太网作为当前主流网络协议,IP 地址是以太网重要组成部分,接入网络每台设备都分配1 个或者多个IP 地址作为网络ID,使得设备间才能互联互通,因此,IP 地址是我们重要网络资源,在一个小的企业或网络环境当中,运维人员只要简单分几个IP子网,分几十和上百个IP 地址,不需要投入太多的时间和精力去管理。但在一个大的网络环境当中,几十甚于几百个子网,几千台甚于几万台的终端,那分配、管理、维护这些IP,对于网络管理人员来说是一个大的挑战。IP 管理上存在问题,容易造成网内IP 冲突,造成网络不稳定甚于网络不通,在出现故障或者安全事件时,由于没有IP 记录,造成无法追查故障源及相关责任人。因此在一个大网络环境当中,IP管理是一个必要而且重要的工作。

1 常用IP管理方式

1.1 EXCEL电子表格用于IP和管理

对于很多网络管理者,由于条件限制,大部分采用EXCEL 电子表格来记录IP 地址,通过手工输入及记录设备IP 和MAC 信息,日常维护和管理通过电子表格删除和添加、修改表格上条目。对于小型网络,由于要维护和操作的IP量少,由专人来管理,EXCEL 还能应付。但对于大型网络来说,要记录及维护大量设备信息,EXCEL 记录的方式就存在如下问题:

(1)存在多个版本,内容不统一:由于要不断去更新和维护IP 信息,存在不同的人去维护和更新IP 记录表,大家手上版本可能不一致。

(2)IP 是静态记录,与现网运行数据不一致:人工手动录入,存在漏录和录入错误等问题。特别是12 个字母和数字的MAC 地址,很容易输入错误。

1.2 开源IP管理软件

为了解决电子文档管理和维护IP 信息存在问题,国内外软件公司和开发者开发一些IP 管理软件,按是否收费来分的话:可以分为收费及开源两种。

收费比较有名软件:solarwinds,开源比较有名软件:PHPIPAM。收费软件费用比较贵,对于很多单位和公司来说,IP 管理系统并不是生产效益型软件,申请一笔购买经费还是比较困难。

对于网络管理人员来说,开源软件就是一个比较好选择。我们单位也部署有PHPIPAM,大概使用2年时间,PHPIPAM 使用PHP 开发,以MYSQL 作后台数据库。虽然解决电子文档式IP 管理方式的多个版本问题。但还是需要人工手动录入,也同样存在录入错误及与设备运行数据不一致问题。

2 IP管理系统开发

我单位目前终端大概有4000 左右,子网数量大概有100 多个,网络设备总共200 多台,到今年年底由于单位新大楼正式启用,网络设备数增加到500 台左右,终端也会增加到7000 左右。因此,传统的IP 管理方式已经不适合我们当前网络规模。

根据当前我们当前需求,开发一套适合自己的IP 管理系统。

2.1 架构

采用当前主流系统BS 架构,不需要开发和维护客户端,减少开发及维护量。服务器前端建立WEB 服务,客户端使用浏览器对系统进行访问及操作。后台采用数据库,将数据采集统一存放到数据库,方便前面对数据管理及检索。这套IP 系统只给维护人员使用,共20 多个人访问,数据量最多就是10 万条左右,由于数据量不大,所以本次后台采用免费的MYSQL 数据库,功能和性能都能满足我们对IP 管理要求。服务器操作系统采用LINUX 系统,相对于WINDOWS SERVER,LINUX 更稳定,被病毒针对也会少很多,更适合作为服务器端操作系统。而且作为一名网络和系统维护人员,我更喜欢命令行维护方式,简单、能复制、及使用维护脚本完成不少维护工作。

2.2 开发工具选择

在开发工具上,我们在GOLANG 和python 上选择,Golang 也就是我们常说的 Go,是由 Google 开发的一种计算机编程语言。Golang 是一个带有轻量并强大库以及拥有优越的性能和速度的静态类型语言。

而Python 是一种多用途的编程语言, Python 是由一位荷兰程序员 Guido van Rossum 编写,于 1991年首次发布。Python 最重要的一方面是它是一种解释型语言,这就意味着Python 代码不会在运行时被翻译成机器语言,而大多数编程语言会在代码编译过程中完成这种转换。这种编程语言(解释型)也被称为「脚本语言」,它们最初是被用来做一些小项目的。

我们IP 系统只定位于网络和系统维护人员使用,访问量和性能要求不是很高,因此,根据对比两个语言特征,PYTHON 更适应一些轻量系统开发,而且PYTHON 有着更强大的库,它能使我们的开发工作更容易。因此,本系统选用PYTHON 做开发工具。

2.3 功能需求

根据我们网络和终端维护过程存在问题,我们的IP 管理除了解决IP 管理方向的问题,还有网络设备信息采集与统计功能,目前具体功能如下:

(1)定时自动采集所有网络设备的ARP 表并记入数据库:

主要通过系统自动采集网络设备的ARP 表,从ARP 表提取出IP 和与其对应的MAC 地址,再通过SQL 语句插入到数据库,完成IP 信息采集和记录。

(2)使用者能通过WEB 界面登录系统,使用IP 和MAC、科室、姓名等关键字查找匹配IP 信息内容。

我们用HTML 开发前台的WEB 界面,并安装部署WEB 服务器,该系统使用人员通过WEB 界面完成IP、MAC 与其对应的科室、姓名及设备名称等将IP 信息的搜索及维护。

(3)通过具体的MAC 地址查找该设备连接到哪台交换机那个端口及分配的VLAN 号等信息。

由于我们单位目前有100 多台交换机,是一个大型网络,虽然大部分已经做了堆叠,减少设备管理平面,但现在还有70 多个管理平面。由于网络前期缺少规划,单位内存在乱接乱挂等问题,即有些设备网络接入另1 个楼层的交换机,在配置时,有时要登录好几台交换机,才能确认是从接入到哪台交换机。为了能更快定位设备网络接入点,减少一些没必要操作,通过系统使用接入设备的MAC 地址,搜索到该具体接入到哪个交换机的哪个端口和VLAN ID,就可以直接登录该设备配置,减少登录设备次数,提高工作效率。

(4)能动态采集网络交换机厂商及序列号、软件版本等信息。

在大型网络里存在多台网络设备,但大家对设备信息采集、记录、维护方式,以EXCEL 电子表格为主,也有部分企业和单位,购买网管软件,通过网管软件来采集或者维护。我们单位也购买过一套网管软件,由于不好用,现在处于停用状态。因此,本系统根据我们日常管理和维护要求,开发该功能,通过系统自动采集设备的厂商、设备型号、软件版本等信息,减少网络维护人员工作量及保证设备信息准确性。

2.4 功能实现

2.4.1 自动采集ARP

自动采集方式有很多种,一般常用方式:

(1)登录设备,命令行采集;

(2)通过SNMP 协议,SNMPWALK 利用各厂商的MIB 库的ARP 表的OID 取回ARP 表内容。

用第一种方式命令行采集,需要服务器不断使用用户名和密码登录设备,并使用命令:display arp 查看ARP 表,把输出结果再通过程序来处理,采集到IP 和其对应的MAC地址,有时遇到特殊情况,还需要程序与交换机CLI 界面互动,比较麻烦。用第二种方式,即利用SNMP 协议采集,我们只需要在各个网络设备开启SNMP 协议,服务器定时通过SNMP 协议采集回ARP 表,整个过程简单而且易于实现。

因此,本系统采用第二种SNMP 方式,PYTHON当前有不少SNMP 模块包,本次程序采用PYSNMP。SNMPWALK 采集函数:我们只需输入网络设备的IP、community、ARP 的OID,即可采集回该网络设备的APR 表,华为、H3C 交换机的ARP 的OID 值都是:1.3.6.1.2.1.4.22.1.2通过该函数传回来的数据,是包含SNMP 的值的格式如下:SNMPv2-SMI::mib-2.4.22.1.2.69.192.168.101.202 =0xc8a776d34749,需要对这些字符串做处理,从里面提出IP和MAC 地址。

这字符串经过处理后,已经提取到IP 和MAC 地址,IP格式:192.168.101.202,MAC 地址格式:c8a776d34749,为了采集到各网的网络设备的ARP 表,需要对全网网络设备做个遍历,就可以实现。由于本系统包含网络设备管理模块,因此,只要从数据库的设备表提取的各台设备的IP 地址及SNMP 的community,就能使用该模块功能实现全网的ARP动态收集。

2.4.2 数据插入数据库

在ARP 正常采集后,我们还需要将IP 和MAC 地址写到数据库,以供前台WEB 界面调用、检索、查询。本系统采用PYTHON 的pymysql。

2.4.3 WEB 服务器安装及WEB 界面开发

由于开发工具采用PYTHON,因为采用PYTHON 成熟的WEB 架构django,能让我们更快速开发、设计、部署网站。Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。用户的操作流程如下:

可以将不同功能模块放置不同的APP,本次创建三个APP:ARP、MAC、DEVICE 分别对应IP 管理模块、MAC地址查找模块、设备管理模块。

2.4.4 定时数据采集

由于单位内接入网络的设备大概有4000 多台,而且设备开机的时间也不尽相同,为了尽可能采集到网络内的ARP信息,需要按一定周末采集ARP 信息。我们单位交换机厂商都是华为和H3C,ARP 的老化时间都是20 分钟,即假如设备离线20 分钟后,将在ARP 表项中清除,根据这个特点。我们每15 分钟采集一次,采集一次需要1 分钟就可以完全采集。因此,每15 分钟采集一次不会占用太多服务器资源而影响到性能。服务器的linux 自带的定时任务:crontab

通过crontab 定义启动采集程序的时间,配置如下:

*/15 * * * * python3 /home/python/arp.py

2.4.5 根据MAC 地址查找对应网络设备及端口及VLAN

由于华为和H3C 的MID 库的OID 值的不一样,而且返回的值内容和格式也不一样。因此,该功能华为和H3C 采用不同的实现方式。

华为实现方式:

查询 MAC 地址和接口的对应关系,华为官方给出的MIB 内容:

节点:dot1dTpFdbAddress,OID:1.3.6.1.2.1.17.4.3.1.1 含义:表示MAC 地址。

节点:dot1dTpFdbPort ,OID:1.3.6.1.2.1.17.4.3.1.2 含义:表示MAC 地址对应的端口号。

节点:dot1dBasePortIfIndex,OID:1.3.6.1.2.1.17.1.4.1.2 含义:端口号对应的接口索引。

节点:ifName ,OID:1.3.6.1.2.1.31.1.1.1.1 含义:接口索引对应的接口名称。

通过查看华为的文档,通过MAC 地址来定位所在设备端口及VLAN,流程比较复杂,假如我要查MAC 地址:18.d7.93.00.22.1b 所在交换机端口,那具体流程如下:

(1)dot1dTpFdbPort+MAC 地址查找对应端口数字。

其中要先把MAC 的十六进制先转换成十进制。18.d7.9 3.00.22.1b=24.215.147.0.34.27

通过snmpget OID: 1.3.6.1.2.1.17.4.3.1.2.24.215.147.0.34.27,结果如下:

SNMPv2-SMI::mib-2.17.4.3.1.2.24.215.147.0.34.27 =INTEGER: 298

(2)通过dot1dBasePortIfIndex 查询MAC 地址对应接口的索引。

通过SNMPGET OID:10.9.250.11 1.3.6.1.2.1.17.1.4.1.2.298结果如下:

SNMPv2-SMI::mib-2.17.1.4.1.2.298 = INTEGER: 145

(3)通过ifName 查询接口索引对应的接口名称。

那么用snmpget OID: 1.3.6.1.2.1.31.1.1.1.1.145 结果如下:

IF-MIB::ifName.145 = STRING: GigabitEthernet2/0/36

(4)由于单位网络部分的子网的网关不是终结本楼层交换机,存在二层往上透传的情况,存在同一个MAC会透传到其他交换机。我们单位交换机之间互联都是采用TRUNK 方式,因此,我们还要进一步判断,查到MAC 所对应端口的类型hwL2IfPortType 是不是ACCESS 或auto,即2 或7,假如是就是设备接入端口,假如不是,那就是通过这个端口透传上来的,我们还要继续到其他交换机去查找和匹对。

那么用snmpget OID: 1.3.6.1.4.1.2011.5.25.42.1.1.1.3.1.3.2 98,结果如下:

SNMPv2-SMI::enterprises.2011.5.25.42.1.1.1.3.1.3.298 =INTEGER: 2

(5)确定好接入端口后,就可以通过hwL2IfPVID 的值来获取该端口的VLAN 号。

那么用snmpget oid:1.3.6.1.4.1.2011.5.25.42.1.1.1.3.1.4.2 98,结果如下:

SNMPv2-SMI::enterprises.2011.5.25.42.1.1.1.3.1.4.298 =INTEGER: 12

H3C 实现方式:

H3C 的官方文档提供的MIB 库信息如下:

节点:dot1dTpFdbAddress,OID: 1.3.6.1.2.1.17.7.1.2.2.1.1含义:表示MAC 地址。

节点:dot1dTpFdbPort ,OID: 1.3.6.1.2.1.17.7.1.2.2.1.2 含义:表示MAC 地址对应的端口。

节点:dot1dTpFdbStatus,OID: 1.3.6.1.2.1.17.7.1.2.2.1.3 含义:MAC 表项的状态。

通过SNMPWALK OID 1.3.6.1.2.1.17.7.1.2.2.1 设备采回信息如下:

SNMPv2-SMI::mib-2.17.7.1.2.2.1.3.3813.72.125.46.229.227.25= INTEGER: 3

SNMPv2-SMI::mib-2.17.7.1.2.2.1.3.3813.112.58.166.93.167.105= INTEGER: 3

其中3813 是VLAN 号,以点号作为分隔符,后面6 个数字就是MAC 地址转换成十进制表示形式。

我们只知道接入设备MAC 地址,没有VLAN 信息,无法通过SNMPGET 直接取到某个具体MAC 地址所接入端口号信息。

(1)因此,对于H3C 交换机,我们只能通过snmpwalk遍历MAC 地址表,提取出MAC 地址,再判断是否有等于我们所查找的MAC 地址条目。如我们要查找的MAC 地址:30.9c.23.c4.6d.83

假如snmpwalk 取回来的内容包含如下信息就表明,该交换机的MAC 地址表中包含有30.9c.23.c4.6d.83,VLAN的信息也可能从这里提取,VLAN 的MAC 地址前面的数字就是VLAN 号,本案例的VLAN 号就是81.

SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.81.48.156.35.196.109.131= INTEGER: 27

(2)根据该MAC 条目所对应的端口index 信息,再去判断端口的类型 hh3cifVLANType 的值是不是2,即端口类型为ACCESS,就是设备接入交换机端口,假如不是,那就是从其他交换机透传上来,还要继续到其他交换机搜索和匹配。

通过snmpget oid :1.3.6.1.4.1.25506.8.35.1.1.1.5.27 结果如下:

SNMPv2-SMI::enterprises.25506.8.35.1.1.1.5.27 =INTEGER: 2

(3)通过ifName 查询接口索引对应的接口名称。

用snmpget OID: 1.3.6.1.2.1.31.1.1.1.1.27 结果如下:

IF-MIB::ifName.27 = STRING: GigabitEthernet1/0/27 2.4.6 网络设备厂商及主机名、型号、序列号采集

还是采用SNMP 方式,这部分OID 如下:

厂商和型号的都是sysDescr OID: 1.3.6.1.2.1.1.1.0

主机名sysName OID:1.3.6.1.2.1.1.5.0

我们在该功能实现时还是采用PYSNMP 模块,但由于SNMP 是取具体OID 的值,采用SNMPGET,而不是采用SNMPWALK(snmpwalk 是对OID 值的遍历,比如某个OID 值下面有N 个节点,则依次遍历出这N 个节点的值)。在主机名方面华为和H3C 通过同一个sysName OID的SNMPGET 回来的值是一样,不需要不同的方式来处理。格式如下:

S

NMPv2-MIB::sysName.0 = STRING: N-A-1B-1FRouDianjing-SW-12

但对于同一个sysDescr OID 的SNMPGET 回来的值的格式,华为和H3C 是不一样的,需做不同处理。

华为的sysDescr 内容格式:

H3C 的sysDescr 内容格式:

SNMPv2-MIB::sysDescr.0 = STRING: H3C Comware Platform Software, Software Version 7.1.070, Release 6113

H3C S5130S-52P-EI

Copyright (c) 2004-2017 New H3C Technologies Co., Ltd.All rights reserved.

因此我们需要对SNMPGET 取回的内容,根据不同厂商做不同处理,才能取出厂商,设备型号及软件版本号。

但对于序列号,华为和H3C 采用OID 前缀也基本一样:1.3.6.1.2.1.47.1.1.1.1.11 但采回来值格式也是不一样,特别我们单位交换机都是做了堆叠,要同时采同个堆叠内所有交换机的序列号,那就更复杂。

华为堆叠设备ID,第1 台的ID 是以67108873 为开始,后面那几台以1048576 为步进;而H3C 这套堆叠的设备ID,第1 台的ID 是以2 为开始,后面那2 台是1 为步进。

根据这个规律,华为交换机通过SNMPGET 取序列号的OID 如下:

第1 台:1.3.6.1.2.1.47.1.1.1.1.11.67108873

第2 台: 1.3.6.1.2.1.47.1.1.1.1.11.68157449

第3 台: 1.3.6.1.2.1.47.1.1.1.1.11.69206025

第4 台: 1.3.6.1.2.1.47.1.1.1.1.11.70254601

……以此类推,在上1 台基础上加1048576,即为该台设备ID 值。

假如交换机不做堆叠,就按第1 台来的OID 来取序列号。

H3C 交换机通过SNMPGET 取序列号的OID 如下:

第1 台:1.3.6.1.2.1.47.1.1.1.1.11.2

第2 台: 1.3.6.1.2.1.47.1.1.1.1.11.3

第3 台: 1.3.6.1.2.1.47.1.1.1.1.11.4

第4 台: 1.3.6.1.2.1.47.1.1.1.1.11.5

假如交换机不做堆叠,就按第1 台来的OID 来取序列号。

……以此类推,在上1 台基础上加1,即为该台设备ID值。

2.5 IP系统登录及使用

2.5.1 登录系统

由于IP 系统,记录全单位的IP 信息,对访问系统的人要做权限及访问控制。因此,需要输入用户名和密码才能正常访问系统,结果如图1。

图1

2.5.2 IP 管理界面

由于在交换机的ARP 表上只有IP 和MAC 地址信息,因此科室及人员姓名/设备/办公室等信息需要通过编辑界面来添加,根据单位管理要求,对于电脑设备,也需要通过编辑方式把电脑的设备厂商、设备型号、设备序列号、生产日期通过编辑界面来添加。同时搜索框可以基于IP 地址、MAC 地址、科室、人名等做模糊搜索,搜索结果如图2。

图2

2.5.3 MAC 地址搜索界面

以下截图是基于搜索框里MAC 地址来找到该设备接入1 号楼弱电井内网交换机标识为11 交换机把第3/0/37,当前端口的VLAN 号为36,同时也列出交换机的管理IP,当我们需要维护和处理故障时,就直接登录到该交换机的查看或配置第3/0/37 端口数据,方便我们日常工作,结果如图3。

图3

2.5.4 设备管理界面

登录设备管理界面,以模糊搜索,列出设备信息如下,为了方便资产管理,在该功能模块添加该交换机是在哪个项目上采购的,通过编辑界面来添加这部分内容,搜索结查如图4。

图4

3 结语

根据本单位IT 运维遇到有关IP 及网络接入等相关问题,我个人独立完成该系统开发,并于2022年3月正式上线。自上线以来的几个月,该系统得到使用人员好评,解决IP管理混乱,单位内IP 经常冲突问题;同时也解决由于原有部分科室网线无序接入到交换机,需要登录多台设备才能完成设备配置问题,提高工作效率;而且也解决由于网络交换机多,需要人工花不少时间一台台登录设备收集设备信息问题。

由于IT 运维人员经常要到科室,为了方便他们随时随地访问系统,开通VPN,运维人员可以随时用手机通过VPN 接入该系统,查找、维护该系统上的IP 等信息。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!