摘 要:在Linux平台上进行DHCP服务器搭建和配置时,需要网络管理人员具备较强的Linux环境应用专业知识,还要能够灵活运用各种相关命令对DHCP配置文件进行操作和检验,作业复杂且强度较大。为了有效降低DHCP管理和配置的门槛,提高网络管理人员的工作效率,采用PyQt5语言设计了一种能够运行在Windows平台的DHCP配置管理系统,通过交互友好的界面,使得仅掌握基本网络知识的普通网络管理人员,即可通过该系统对运行在远程Linux操作系统平台上的DHCP服务进行管理和配置。实践表明,该系统能够有效降低专业网络管理人员的作业强度,同时为非Linux专业技术人员的网络管理提供了便利,具有良好的应用价值。
关键词:DHCP服务器;网络管理与配置;DHCP配置文件;Linux服务器;Linux网络管理员;PyQt5
中图分类号:TP317.4 文献标识码:A 文章编号:2095-1302(2025)02-0-04
0 引 言
随着互联网技术的不断发展,人们的工作、学习和生活已经越来越密切地与互联网联系在一起。各种不同规模的网络连接类型如个人网、局域网、城域网、广域网等被建立起来,以满足人们的多样化需求。众所周知,IP地址是网络中各通信节点的重要标识,快速有效地分配IP地址,是高效组网的重要保障,组网规模的不断扩大,对IP地址合理的分配、管理工作提出了更高的要求。动态主机网络配置协议(Dynamic Host Configuration Protocol, DHCP)[1]是一种能够为主机分配IP地址并实现集中管理的技术,采用该技术可以使得网络环境中的大量主机自动获取到合适的IP地址,无需人工介入,这使得快速大规模组网能够很容易地实现。
通常,DHCP采用客户端/服务器模式,服务器负责集中管理,客户端向服务器提出配置申请,服务器根据策略返回相应配置信息给客户端。由于Linux操作系统具有较高的安全性、稳定性,且开源免费,这使得采用Linux操作系统作为DHCP服务器成为众多用户的首选。然而,对Linux操作系统的操作基本采用命令形式,在Linux环境下配置DHCP服务器[2],操作人员不仅要具备熟练的网络专业知识,还要具有较高的Linux应用水平,这会对部分非专业网络运营单位在本单位网络系统组建完毕后进行日常管理和维护时造成很大的困难。另外,即便是专业的网络管理人员,通过大量的命令来配置和管理DHCP服务器,也很难保证不会出现失误,以致浪费大量的时间和精力。
为了有效解决上述问题,本文采用PyQt语言[3-4],设计了一套在Windows平台上运行的功能软件,该软件通过友好的交互界面,借助网络实现远程与Linux操作系统的交互,从而达到配置DHCP服务器的目的。
1 DHCP远程管理系统总体介绍
本系统围绕方便易用、安全可靠、功能全面等用户体验及性能指标相关要求进行设计,主要包括如图1所示的功能模块。图1中给出的功能模块按照用户操作顺序进行部署,其中管理系统登录是指具有相应权限的用户在Windows平台运行软件,通过自己的账号登录到管理系统中,系统根据账号确认用户角色并赋予用户相应的操作权限,系统超级管理员可以调整和修改其他用户权限。由于该部分内容属于一般管理系统基本具备的常规功能,本文在此不展开讨论。用户正常登录后,在界面选择历史记录或手工输入目标服务器IP地址,可以进行网络嗅探,主要目的是查看前向用户提供网络是否畅通、远程服务器是否接受连接等信息,防止因网络环境状况问题导致用户误判,从而采取不必要的其他操作。
获取到网络嗅探成功后的提示信息后,用户通过操作相应界面元素登录到远程服务器,此时系统从数据库中将用户近期通过系统进行配置的相关数据信息提取到缓存中,同时系统会把服务器中的dhcpd.conf文件加载到本地并进行解析,按照配置文件中各网络节点的配置内容填充界面相应元素,供用户调整或参考。用户操作完成后,系统收集并核查界面中的配置信息,信息核查通过后,把有关信息作为历史数据记录到数据库,同时重新刷新dhcpd.conf文件并把该文件写回到远程Linux服务器。如果用户在操作过程中的某个时间点选择撤销操作,则系统会选择上次的历史记录或根据用户操作,选择其他历史记录覆盖当前配置。配置完成后,用户可以通过系统操作界面向远程服务器发送控制命令,操作服务器执行相关操作,服务器执行结果通过网络回传到系统供用户检验。
2 设计与实现
根据图1所示的系统功能,本文就用户管理、远程服务器操作、作用域配置及地址域绑定等系统重要功能的软件实现方法进行讨论。
2.1 用户管理
通过系统操作远程服务器的用户,必须是管理员授权的用户,授权用户使用自己的账号登录系统后,系统会根据该用户的权限,决定哪些DHCP信息可以被该用户配置,哪些DHCP信息只能被浏览。对远程服务器的操作,系统同样根据权限决定哪些命令可以被发送执行,哪些命令不可以被发送执行。设计中,采用SQLServer数据库[5-6]实现用户管理的有关功能,主要涉及的表格有用户基本信息表、用户权限(角色)表、用户配置历史信息记录表等。其中配置历史信息记录表,由系统根据用户账号自动维护,即当管理员在用户基本信息表中添加了某条用户记录后,系统自动创建对应该用户的配置历史信息表,删除某条用户记录后,该用户的配置历史信息表也随之删除。
设计中操作SQLServer数据库的主要流程如下:
(1)程序启动过程中,关联SQLServer:
self.db=QSqlDatabase.addDatabase(\"QODBC\")
(2)确定目标数据库是否存在:
query.exec(\"Select * from sys.databases where name=\"+dbName +\"'\")
(3)如果不存在则创建用户数据库,数据库名由管理员指定:
query.exec(\"create database \"+ dbName)
(4)用户数据库存在,与用户数据库建立连接,并打开用户数据库。PyQt5与SQLServer中用户数据库建立连接的方式有多种,本文采用如下方式连接:
class DBConfig():
def__init__(self,dbName):
self.conn_str=
{
\"dbname\":\
\"Driver={SqlServer};
Server=localhost;Database=\"+dbName+\";
Uid=xxx;Pwd=xxxxx\"}
(5)检查管理员配置信息,确定有关表项是否存在,表项不存在则创建,已存在则按照要求初始化:
def create_all_table(self):
query=QSqlQuery()
for v in
self.dbConfig.sqlstr_tab_create.values():
query.exec(v)
2.2 操作界面设计
本文主要设计了远程服务器连接界面、主窗口界面、作用域配置界面及地址绑定管理界面,具体如图2~图5所示。
图3为成功连接服务器后向用户展示的主窗口界面,该界面采用QTableWidget控件向用户展示历史配置记录(从菜单选择)或根据dhcp.conf文件解析作用域列表,每行对应1个子域。第0行为表头,除提供各字段提示信息外,还添加了显示值为“全选”的QCheckBox,提示用户在后续的操作中,可以通过该复选框对除第1行外的其他所有行进行操作。第1行为默认域,该域的值只能通过点击后面的“配置”按钮进入作用域配置管理页面进行修改,不能删除。从第2行开始的后续各行,都可以根据用户需要动态添加或删除,其组成控件从第1列开始依次为QCheckBox、QLabel、QLineEdit和QPushButton。每一行的控件引用及其所在行由Python字典维护,用户通过“增加”按钮可以动态向QTableWidget中添加任意多行,后台采用Python字典记录新增行所有控件的引用信息,由于新增行地址段都为空白,所以不存在配置信息同步问题,但当通过“删除”按钮配合复选框的选择状态,对QTableWidget中被选中的行进行删除操作时,存在以下情况:
情况1:用户删除的行是QTableWidget尾部1个或连续的几个空白行;
情况2:用户删除的行是在QTableWidget中随机选择的空白行;
情况3:满足情况1的行不空,含有用户输入地址段,但未执行绑定;
情况4:满足情况2的行不空,含有用户输入段,但未执行绑定;
情况5:满足情况3,但已执行地址绑定操作;
情况6:满足情况4,但已执行地址绑定操作。
对上述情况,需要分别进行处理,主要处理措施为:
(1)对于情况1,直接从控件缓存字典中删除对应记录,无需额外进行其他操作。
(2)对于情况2,在控件缓存字典中,按行号查找对应控件记录,删除对应记录,重新按照现存记录进行编号,并映射到QTableWidget。
(3)对于情况3,同步删除地址段记录列表后执行情况1的操作。
(4)对于情况4,搜索地址段记录列表,删除记录后重新编号,执行情况2的操作,重新将地址段记录映射到新调整后的控件中。
(5)对于情况5,同步删除绑定的子域缓存记录字典,如果记录已被保存到数据库,从数据库删除,执行情况3的操作。
(6)对于情况6,删除子域记录,重新对子域缓存记录进行编号,设置子域记录映射关系,从数据库中删除对应记录,执行情况4的操作。
对上述动态新增或删除控件事件的管理,采用每种类型的控件创建对应的QSignalMapper类对象进行实现,通过setMapping()方法, QSignalMapper类对象将map()槽与控件的signal连接,再进一步把map()槽发射的mapped()信号与自定义槽函数连接,即可监控动态创建的控件。以动态创建的复选框为例,具体方法的代码如下所示:
self.checkBoxSignalMapp.setMapping(checkBoxItem,self.rows-1)
checkBoxItem.clicked.connect(self.checkBoxSignalMapp.map)
self.checkBoxSignalMapp.mapped.connect(self.on_checkbox_click)
代码中,checkBoxSignalMapp为QCheckBox控件对应的QSigalMapper对象,self.on_checkbox_click为自定义槽函数。
图4和图5所示的作用域配置界面和地址域绑定管理界面的控件管理方法与上述类似,缓存管理办法稍有不同,此处不再详述。
2.3 DHCP服务配置文件解析
dhcpd.conf文件是DHCP服务的配置文件[7],该文件一般包括3个部分:parameters、declarations、option。在获取到该文件后,采用逐行扫描各部分关键词的办法识别配置文件中不同的组成部分,并依据语义,将整个配置文件在缓存区中生成一个或多个网段域,每个网段域对应生成基本定义子域和主机声明子域。在处理过程中,不仅要依靠关键词对特定域起始部分进行识别,还要依据特定符号和特定方法对特定域中的特殊部分进行进一步界定和识别。如本文采用正则表达式对IP地址(IPV4)和Mac地址进行识别,具体代码如下:
self.reIPMatchStr=r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([0-9]{1,3}\b)'
self.reMACMatchStr=r'(([0-9a-fA-F]{2}[:]){5}([0-9a-fA-F]{2})|([0-9a-fA-F]{2}[-]){5}([0-9a-fA-F]{2}))'
上述reIPMatchStr为IP地址的匹配模式,reMACMatchStr为Mac地址的匹配模式。其他关键词和特殊界定符见表1。
具体实现方法的代码如下所示:
for j in range(len(sectEveryLine)):#对分割后的每一行进行搜索
if not sectEveryLine[j].startswith('#'):
if sectEveryLine[j].find('subnet')gt;=0 and sectEveryLine[j].find('netmask')gt;=0:
subStart=sectEveryLine[j].find('subnet')
netmaskStart=sectEveryLine[j].find('netmask')
subLine=sectEveryLine[j][subStart:netmaskStart]
netLine=sectEveryLine[j][netmaskStart:]
subnetIP=re.search(self.reIPMatchStr, subLine)
netmaskIP=re.search(self.reIPMatchStr,netLine) subDict.setdefault(\"subnet\",subnetIP.group())subDict.setdefault(\"netmask\",netmaskIP.group())
以上代码片段,仅用来说明采用正则表达式对目标进行匹配的实现方法,成功匹配目标后,还需要将匹配信息记录到对应的数据字典中,以备后续增加、删除、修改,以及写回、撤销配置文件数据等。
2.4 远程Linux服务器交互
paramiko是一个基于SSH用于连接远程服务器并执行相关操作的模块,使用该模块可以命令远程服务器,并对远程服务器文件进行操作。本文采用该模块的相关方法实现与远程服务器的连接,并最终实现DHCP配置文件的相关配置操作[8-10]。同时,通过该模块的远程命令操作功能,还进一步实现了界面化的远程DHCP服务器管理功能,使得用户能够通过本文实现远程操作,实时对服务器运行状况进行诊断、监控。
3 结 语
团队与有关网络管理部门合作,基于PyQt5开发了一种远程DHCP服务器监管系统,该系统在实际应用中能够为网络管理人员提供安全、便捷的服务器管理方式,有效降低了工作强度,提高了工作效率,取得了较好的效果。
参考文献
[1]张韬.关于DHCP服务攻击的安全防护策略部署[J].计算机安全,2014(12):29-32.
[2]赵琳.实时监控Linux服务器性能[J].网络安全和信息化,2019(8):65-69.
[3]王硕. PyQt5快速开发与实战[M].北京:电子工业出版社,2017.
[4]耿颖.使用Python语言的GUI可视化编程设计[J].单片机与嵌入式系统应用,2019,19(2):20-22.
[5]云洋.基于Python的图片爬虫程序设计[J].电子技术与软件工程,2018(17):241-242.
[6]杜田,许大璐,朱校娟,等.基于Python的多源地理数据高效质检系统[J].测绘地理信息,2020,45(5):84-88.
[7]冯贵兰,李正楠,周文刚.大数据分析技术在网络领域中的研究综述[J].计算机科学,2019,46(6):1-20.
[8]何波.基于Python的新浪微博中爬虫程序维护方法[J].软件,2022,43(2):52-54.
[9]周竞鸿.大数据背景下依托于Python的网络爬虫技术研究[J].信息系统工程,2021(3):69-70.
[10]单艳,张帆.基于Python的网页信息爬取技术研究[J].电子技术与软件工程,2021(14):238-239.
作者简介:杨立志(1973—),男,硕士,副教授,研究方向为嵌入式技术、物联网应用技术。
苏春芳(1979—),女,硕士,副教授,研究方向为物联网应用技术、图像处理。
倪 峰(1981—),女,硕士,讲师,研究方向为网络安全、物联网应用技术。
收稿日期:2024-01-28 修回日期:2024-03-08
基金项目:2023年江苏省高校优秀科技创新团队项目(苏科教[2023]3号)资助