基于Pysnmp的局域网自动化网管的研究

2021-04-22 05:40秦子实
电脑知识与技术 2021年8期

秦子实

摘要:随着企业内网规模的扩大,内网接入终端逐渐增多,终端接入控制业务也越发繁杂,导致企业信息部门的日常业务存在大量重复性工作,且效率较低易出错。因此,企业信息部门需要一种简单的自动化网管方法,能够代替人工自动管理IP、MAC资源等网络资源,并能够进行端口MAC绑定等准入业务。本文设计并实现了一种基于Pysnmp的交换设备管理方法,通过SNMP协议读取、设置交换机配置,以达到自动化管理交换设备的目的。该方法具有依赖库少、代码编写简单、执行效率高等特点,适合局域网客制化开发与部署。

关键词:网络运维;SNMP;Python

中图分类号:TP393      文献标识码:A

文章编号:1009-3044(2021)08-0047-02

1 概述

在企业内部办公局域网,尤其是物理隔离的内网中,通常需要信息部门进行终端准入,以保护内网信息安全。随着内网规模的扩大,终端接入准入、接入點变更、设备变更、设备注销等业务也大量增加,此类业务具有工作量大、重复性高、人工易出错且步骤固定等特点,适合通过脚本自动化管理。由于企业内网较为封闭的特点,自动化脚本不应有较多的库依赖关系,同时应该方便信息部门开发部署。此外,对于大型办公内网,脚本应该具有较高的执行效率。本文针对该场景,基于Pysnmp设计了一种易于开发方便部署的方法。

2 Pysnmp安装

Pysnmp的依赖库仅有四个,依赖关系如下图1所示。

这四个依赖库为纯Python库,没有平台编译依赖,可以直接使用pypi上提供的wheel文件安装,下载完成后在内网环境按照ply、jinja2、pysmi、pyasn1、pysnmp的顺序安装即可:

或使用github上提供的源码,按照ply、jinja2、pysmi、pyasn1、pysnmp的顺序,通过在源码根目录中运行“python setup.py”,从源码安装依赖。

3 系统设计

3.1 获取数据

对于企业内网站准入业务而言,准入控制仅需要网关交换机中的ARP数据,即IP到MAC的映射关系。批量获取此类数据需要使用“nextCmd”函数:其中在第二个参数使用“CommunityData”对象生成团体字,在第三个参数使用“UdpTransportTarget”生成目标对象指定交换机snmp的IP与端口:

nextCmd函数返回一个生成器对象,可以直接使用for循环遍历:

3.2 异常数据

for循环中的四个参数在循环体中分别用于:

snmp引擎(SnmpEngine)出现异常时,errorIndication不为空,可以用于抛出异常或记录交换设备级的错误日志;

snmp代理(snmpAgent)产生异常数据时,errorStatus不为空且errorIndex有用于指定错误所在的索引值,可以用于抛出异常或记录交换机上报的异常数据。

若前三个变量均为空,则可以通过varBinds取回正常数据,异常处理通常编写如下:

3.3 ARP数据处理

在交换机返回的SNMP数据中,IP-MAC映射数据的oid为“.1.3.6.1.2.1.3.1.1.2”(即“获取数据”例子中一节“ObjectIdentity”中的参数)。在请求该oid数据后,会返回从该oid开始的UDP中的原始结果,每个条目包含一个ObjectType对象表示oid名称,以及一个OctetString对象表示oid下的值。原始数据包含非utf-8编码和十六进制数据,不方便直接处理,因此可以使用这两个对象的“prettyPrint”输出方便处理的信息。

使用nextCmd函数读取该oid数据时,对应调用的snmp“GETBULK”命令,即批量获取“下一个指定oid相关”数据,返回的数据有顺序。由于nextCmd返回从指定的oid开始的所有oid数据,本文利用数据的排序特征,仅获取.1.3.6.1.2.1.3.1.1.2集合中的数据,当snmp代理接收到第一条不属于.1.3.6.1.2.1.3.1.1.2的数据时,立即停止接收,此举能够大幅缩短数据读取时间(经测试在华为5700系列交换机上,接收IP-MAC映射数据仅耗时约1秒,而接收所有数据将耗时数十秒)。接收varBinds并判断oid是否结束的示例写法:

经过这一步处理,即可获取IP-MAC映射列表,本文以列表形式输出为例,此外也可以通过字典形式输出,可以用于数据去重:

可以看出,每条数据的第一个元素为mib字符串,可以很容易地将IP数据分离出来,第二个成员即为MAC数据。这样一来,可以得到IP-MAC数据的关系,进而通过dict或set等数据结构进行去重,将多个网关的ARP信息进行整合,即可得到局域网的整体ARP信息。

3.4 异步I/O加速

在交换机较多的场景中,若顺序执行上述步骤,依次从每个交换机中获取数据,可能会需要较长时间。Pysnmp还提供了异步I/O版本的UdpTransportTarget:

只需要将nextCmd中的第二个参数替换为这个asyncio版本的即可,之后就可以使用async/await声明函数,并使用Python异步框架asyncio中的各种调度器异步执行了。经测试,使用同步函数获取1台交换机的ARP数据约耗时1秒,使用同步函数顺序获取10台交换机数据越需要15秒,同步函数的耗时正比于交换机数量;而换用异步函数获取10台交换机约需要2秒,而交换机继续增多的情况下,耗时也并未显著增加。

4 结束语

本文介绍了使用Pysnmp获取交换机IP-MAC映射数据的方法,可以方便地实现自动化准入管理。该方法依赖库少,便于内网部署,对于交换机数量较多的大型局域网,可以使用异步I/O版本的函数,可以较大幅度地缩短函数的等待时间,是一种方便部署、性能优良的网络管理方法。

【通联编辑:梁书】