




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要随着互联网的发展,当网络涉及不同的信任级别时,要保证安全必须安装安全控制设备,此类控制设备几乎总是某种形式的防火墙。随着网络安全问题日益严重,广大用户对网络安全产品也越来越关注。防火墙作为最早出现和使用量最大的安全产品,也受到用户和研发机构的青睐。在PC机上使用的个人防火墙,很大程度上成为广大个人用户的安全保护者。本文先介绍了个人防火墙开发的研究现状、VC+6.0和MFC程序的一些技术特点,然后对基于包过滤个人防火墙的开发进行了详细的介绍和描述。通过本文可以清楚地看到一个普通个人防火墙的开发过程。本防火墙中,用户可以自行设定过滤规则,以达到对不同源和不同目标的IP地址、端口和协议的过滤。程序可以最小化为系统托盘图标,在后台提供数据包过滤,为用户提供保护。允许用户将当前规则保存为*.rul的文件格式,供下次使用时直接导入。同时允许添加程序于开机启动项,且用户可以设定让防火墙于启动时自动开启过滤功能并最小化隐藏,使用户使用本程序更为便捷。关键词:个人防火墙,包过滤,网络安全,MFCAbstractWith the development of the Internet, security control equipment must be installed to ensure safety when the network involves a different level of trust. These control device are almost always some kind of firewall. With the growing problem of network security, the most users are increasingly concerning about network security products. Firewall, which is not only the first network security products but also has the most users, has been favored by users and R&D institutions. The personal firewall used in PC has largely become the protector of individual users security.This article describes the development of personal firewall status, some technical characteristics of VC+6.0 and the MFC program, then gives a detailed introduction and description of a packet-filtering-based individual firewalls development. A simple personal firewall development process can be clearly seen through this article. In the firewall, users can set their own filtering rules, in order to attain the filtering with different source IP, destination IP, source port, destination port and protocol. Program can be minimized into the system tray icon, protecting user in the background. It allows users to save the current rules into a file as *.rul. The rule file can be imported when needed. The firewall also allows users to make the program initial when system starts and start filtering when the program starts, which makes the firewall more convenient. Keywords:Personal Firewall, Packet Filter, Network Security, MFC 目录1 绪论11.1 研究背景11.2 研究意义22 需求分析32.1 功能需求32.2 开发工具43 系统设计83.1 设计概要83.2 选项功能113.3 界面控制124 系统实现134.1 规则基本操作134.2 拦截数据包功能184.3 主选项214.4 额外功能234.5 基本界面285 总结34参考文献35致谢36 II36基于包过滤防火墙的研究与实现1 绪论1.1 研究背景随着网络技术飞速发展和Internet的普及,个人电脑成为日常大众的工具,网络化与全球化成为了世界潮流,同时互联网为人们提供了极便利的获取信息的方法。当人们使用信息技术提高工作效率,有些人出于某种原因和心态利用信息技术非法侵入别人的计算机系统窃取机密信息、篡改和破坏数据,给社会和个人造成巨大损失。由于计算机网络规模的不断扩大以及新的应用不断涌现,威胁网络安全的潜在危险性也在增加,网络安全问题变得日趋复杂,对网络系统及其数据安全的挑战自然也随之增加。网络在使通信和资源共享交得更为容易的同时,自身也更多地被暴露在危险之中。据统计,全球约20秒种就有一次计算机入侵事件发生。由于计算机网络具有连接形式结构的多样性、终端分布的不均匀性和网络本身的开放性、互连性等特征,致使计算机网络易受黑客、恶意软件和不轨行为的攻击,所以网上信息的安全和保密是一个至关重要的问题。对个人用户而言,当连接上互联网,就代表来自四面八方的用户可以连接到这台计算机上,每台计算机都拥有0-65535号端口,那么这些端口是否安全有待考虑。防火墙正是基于对个人电脑的保护而诞生,用以关闭端口、拦截不受用户欢迎的协议类型或数据包。国内外常见的防火墙软件有:(1)GoldTach。这是一个体积小巧但功能强大的个人防火墙,集成了4个主要的功能:防火墙、进程控制、邮件保护和网页内容过滤。GoldTach可以在应用层、TDI层和NDIS层截取和捕捉数据,根据现有的规则进行分析,删除恶意的数据来保护网络安全。用户可以查看和控制进出网络的所有IP包,控制网络应用的各种操作:访问网站、充当服务器和收发电子邮件等,通过改变电子邮件附件的扩展名来保护邮件安全,过滤恶意或者无用的Http内容。(2)Norton Personal Firewall。该防火墙能够提供完整的网络安全,防止重要资料被窃,并有过滤网站的功能,还能够阻隔各种黑客可能的入侵方式,以防止私人信息被窃取和损坏。(3)Outpost Firewall Pro。这是一款短小精悍的网络防火墙软件,功能是同类PC软件中较强的,甚至包括了广告和图片过滤、内容过滤和DNS缓存等功能。它能够预防来自Cookies、广告、电子邮件病毒、后门、窃密软件、广告软件和其它Intemet威胁。该软件不需额外配置就可使用,适合普通用户使用。(4)天网个人防火墙。该防火墙提供多种预先设置的安全级别,同时也支持用户自定义应用程序的安全规则与系统的安全策略,支持应用程序通信控制,同时具备自动识别功能。此外,它还提供特洛伊木马和入侵检测功能,可以通过厂商的安全数据库自动查找系统的漏洞。天网个人防火墙占用系统资源较少,操作简单。(5)费尔防火墙。费尔防火墙1.0版是完全基于SPI技术的,是一款用于展示防火墙开发技术的开放原代码软件。费尔防火墙2.0除了使用SPI技术外,在核心层还使用了NDIS HOOK技术,因此功能上比1.0版本要强,是一款不错的防火墙软件。(6)瑞星防火墙和金山网镖。这是国内著名的商业防火墙软件,功能比较强大,工作原理都是规则匹配技术。国内个人电脑上主要安装的是这两类防火墙。在技术日益成熟的今天,网络安全尤为重要,人们使用防火墙、入侵检测、数据保护、病毒防护和行为控制等多种安全保护措施,使自己的计算机不受攻击。防火墙作为数据传入本地的第一过滤层,其重要性不言而喻。1.2 研究意义目前市场上大多数的防火墙产品仅仅是网关型的,虽然功能相当强大,但大多基于下述的假设:内部网是安全可靠的,所有的威胁都来自网外。因此,这些防火墙产品防外不防内,难以实现对企业内部局域网内主机之间的安全通信,也不能很好地解决每一个拨号上网用户所在主机的安全问题,而大多数个人上网之时,并没有置身于得到防护的安全网络内部。因此个人防火墙就显得尤为重要,可以帮助用户抵御一切来自非本计算机的恶意数据包。个人上网用户多使用Windows操作系统,而Windows操作系统本身的安全性并不如人意。各种Windows漏洞不断被公布,对用户计算机的攻击也越来越多。一般都是利用操作系统设计的安全漏洞和通信协议的安全漏洞来实现攻击。如假冒IP包对通信双方进行欺骗;对主机大量发送IP数据包进行轰炸攻击,使之崩溃;以及蓝屏攻击等。因此,为了保护主机的安全通信,个人用户可以选择使用防火墙。服务于Windows系统基于包过滤的个人防火墙,可以为世界上使用最广泛的Windows操作系统用户主机提供一定的网络安全保护。2 需求分析2.1 功能需求随着信息技术的发展,个人电脑成为日常大众的工具,互联网成为人们获取信息的重要渠道。当人们使用信息技术提高工作效率,有些人出于某种原因和心态利用信息技术非法侵入别人的计算机系统窃取机密信息、篡改和破坏数据,给社会和个人造成巨大损失。由于计算机网络规模的不断扩大以及新的应用不断涌现,威胁网络安全的潜在危险性也在增加,网络安全问题变得日趋复杂,对网络系统及其数据安全的挑战自然也随之增加。网络在使通信和资源共享交得更为容易的同时,自身也更多地被暴露在危险之中。据统计,全球约20秒种就有一次计算机入侵事件发生。防火墙正是基于对个人电脑的保护而诞生,其实现功能主要有关闭端口和拦截不受用户欢迎的协议类型或数据包。考虑到时间和编程能力,以及程序的运行效率,还有对操作系统的支持,本防火墙向简单、方便、易用的方向进行开发。防火墙的最基本功能就是拦截数据包。防火墙的规则全部由用户手动添加,规则的属性包括源IP地址、目的IP地址、源端口号、目的端口号和协议类型。默认情况是数据可以通过防火墙,防火墙根据逐条规则的五项属性依次去与收到的数据包比对,以决定是否要丢弃该数据包。防火墙的总规则数量是有一定限制的,当到达这个上限时,再添加规则程序会提出数量过多告警,规则列表用户可以选择另存为*.rul文件。用户使用防火墙时,每次启动后可以选择手动添加本次需要的规则或者导入一个先前存储在电脑里的*.rul文件。对每一条规则的操作包括添加规则、删除规则、修改规则、向上移动规则和向下移动规则。当用户想要编辑规则或者删除规则时,需要选中规则列表视图中的一条想要修改的规则,如果没有选中,那么本系统菜单中的编辑规则、删除规则以及快捷工具栏按钮中的删除规则将呈现灰色或者点击这些按钮是会弹出提示选中一条规则的警告对话框。为了用户使用方便,菜单栏、快捷按钮栏以及鼠标右击规则列表中的规则都可以得到这些效果,而且这几项存在于不同位置的相同功能为了保持一致性,都是互相调用的。作为一个保护计算机的程序,主选项中设置了一条允许把本程序加入到开机启动项,该设置是通过修改注册表而实现,效果等同于把本应用程序的快捷方式放入开始菜单-程序子菜单-启动菜单下面,本程序就能在系统开机时候自动运行,起到保护主机的作用。当然,光启动程序是不够的,所以还有一个选项就是启动防火墙程序后自动启动过滤,使防火墙在启动后就能够立即生效。这里,自动启动过滤选项同时还具有另一个功能是启动后自动最小化隐藏,就可以做到无需人工操作,程序自动于后台保护本地计算机了。但是没有规则的防火墙启动了也只是一具空壳,因此在防火墙中,每次关闭时应当自动保存当前使用的所有规则至一个文件,在下一次防火墙启动时自动加载该文件,能完美配合选项中启动后自动过滤并隐藏功能。另外,一个保护程序如果一直显现在桌面当中对用户的视觉以及操作都是很不方便的,因此设计了隐藏菜单,其中有最小化到系统托盘图标的功能,防火墙就能根据用户需求在适当的时候由用户让其安静地在后台保护用户的计算机了。当需要改变规则或者退出防火墙时,双击托盘图标或者右键引发托盘菜单即可。同样的,该右键菜单中也添加了退出功能让用户操作更为简便。退出本防火墙时,系统会弹出一个确认退出对话框,防止用户误关防火墙。帮助菜单下的关于会弹出一个对话框告诉用户如何获得本机IP。2.2开发工具2.2.1 VC+.NET混合型面向对象程序设计语言既支持面向对象设计方法,也支持面向过程设计方法和结构化设计方法,最典型的是C+语言。C+作为一种应用最广泛的面向对象程序设计语言,具有类、对象、消息等概念,全面支持面向对象技术的抽象性、封装性、继承性和多态性特征。Visual C+6.0是微软公司推出的开发Win32应用程序的、面向对象的可视化集成工具。该工具最大优点就是提供了功能强大的MFC类库,MFC是一个很大的C+类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由M-FC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大地减少程序员编写的代码数量,使编程工作变得更加轻松容易。Visual C+6.0不仅是一个C+编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。这些组件通过一个名为Developer Studio的组件集成为开发环境。Visual C+具有发展历史长、开发范围广泛、开发的应用程序运行效率高以及具备成熟的开发技术模式等特点。Visual C+.NET是Visual Studio.NET开发环境中唯一允许创建与.NET Framework不兼容应用程序的语言,这就意味着利用Visual C+.NET既可以创建传统的Windows应用程序,也可以创建托管应用程序。微软公司在Visual C+.NET中保留了传统的开发模式,同时扩展C+语言,让V-isual C+.NET在编写纯粹的.NET应用程序的同时,依然可以利用现有的成熟技术进行非托管应用程序的开发。2.2.2 MFCMFC(Microsoft Foundation Classes,微软基础类),同VCL类似,是一种Appl-ication Framework,随微软Visual C+ 开发工具发布。该类库提供一组通用的可重用类库供开发人员使用。大部分类均从CObject直接或间接派生,只有少部分类例外。MFC 应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinA-pp类对象(应用程序对象)组成。MFC提供了MFC AppWizard自动生成框架。Wind-ows 应用程序中,MFC的主包含文件为Afxwin.h。此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。由于其易用性,初学者常误认为VC+开发必须使用MFC。这种想法是错误的。作为Application Framework, MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win 32 程序设计。MFC实际上是微软提供的用于在C+环境下编写应用程序的一个框架和引擎,VC+是Win OS下开发人员使用的专业C+ SDK(SDK,Standard Software Develop Kit,专业软件开发平台),MFC就是挂在这上面的一个辅助软件开发包。MFC是Win API与C+的结合(API,即微软提供的Win OS下应用程序的编程语言接口),是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方编程语言来进行对Win OS下应用程序的开发,使这些被开发出来的应用程序能在Win OS下运行,比如VB、VC+、Java和Dehpi编程语言函数本质上全部源于API,因此开发出来的应用程序都能工作在Win OS的消息机制和绘图里,遵守Win OS作为一个操作系统的内部实现,这其实也是一种必要,微软如果不提供API,这个世上对Win编程的工作就不会存在。由于MFC基于面向对象技术,封装了大部分API函数,因而具有独特的性质。MFC是一个很大的C+类层次结构,其中封装了大量的类、接口及函数,可以将诸如窗口类定义、注册及窗口创建等操作过程通过一定的处理机制自动完成。从物理角度看,MFC是一个类库,对应于Windows下的一系列mfc*.dll文件,M-FC编程的本质就是选择该类库中合适的类来完成指定功能。从逻辑角度来看,MFC是一个应用程序框架,是一种新的程序开发模式。在该模式下,对程序的控制主要由MFC框架完成。MFC应用程序一般会包括CWinApp类、CDocument类、CCmdTarget类以及CW-inThread类。应用程序框架是MFC程序运行所必需的部分代码的集合,是MFC程序基于windows系统运行时的底层机制。因此程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大地减少程序员编写的代码数量,使编程工作变得更加轻松容易。2.2.3 IpHelperApiIP Helper是一套用于管理本地网络设置的API(应用程序编程接口),功能十分强大,通过使用这一套API,可以方便地改变计算机的网络设置或者提取有关的信息。而且IpHelpApi还提供了一种消息机制,能够在本地计算机的网络设置发生改变时通知应用程序。也就是说在该API函数出现前设置IP、掩码等各种另人难以入眠的繁琐工作现在都可以轻松搞定了。实际上,IpHelpApi不仅仅能够提取本机的网络设置信息,还能够获得网络上其它计算机的IP使用情况和MAC地址。Windows 98以上的所有操作系统在系统目录的system32下都带有iphlpapi.dll这个库文件,而且对于NT 4.0在安装了Service Pack 2以后也就有了这个库文件。也就是说使用IpHelpApi的程序可以在这些系统上运行而不需要额外的库文件,但是对于C程序员来说还必须有相应的头文件。其中最主要的两个函数是GetNumberOfInterfaces和GetInterfaceInfo,前者指出网络接口的个数,后者提取网络接口的信息。由GetInterfaceInfo返回的IP_INTERFACE_I-NFO结构中也有一个NumAdapters整型的数据域记录了正确的网卡。然后对于GetInte-rfaceInfo要注意的是它必须被调用两次,第一次获取缓冲大小,第二次才是取值。Get-InterfaceInfo返回的IP_INTERFACE_INFO不像上面的结构是用链表,而是用的动态数组的方法。其余的API函数能够让用户察看或者设置网络数据报文方面的信息。比如GetIpStatistics、GetIcmpStatistics函数能够查看当前IP数据报和ICMP数据报的流量以及废弃的数据报数量等。使用这些函数可以构建自己的网络监控程序来检查网络中的故障。当然也可以使用SetIpStatistics 函数来设置相应的IP协议栈属性,缩短或者延长IP数据报的缺省TTL值。亦或者可以使用GetIpForwardTable、CreateIpForwardEntr-y 、DeleteIpForwardEntry、SetIpForwardEntry来分别获取IP路由表的信息,创建路由表项,删除路由表项和修改路由表项。也可以用GetBestRoute、GetBestInterface获得到达指定IP的最好的路由点和网络接口。通过这些函数可以得到很多MIB变量,依靠这些MIB变量,可以非常快速地制作一个网络管理软件。2.2.4 Visual Studio.NETVisual Studio.NET是一套完整的开发工具,用于生成ASP Web应用程序、XML Web services、桌面应用程序和移动应用程序。Visual Basic.NET、Visual C+.NET、Visual C#.NET 和 Visual J#.NET全都使用相同的集成开发环境 (IDE),该环境允许它们共享工具并有助于创建混合语言解决方案。另外,这些语言利用了.NET Framework 的功能,此框架提供对简化 ASP Web 应用程序和 XML Web services 开发的关键技术的访问。Visual Studio.NET彻底改变了Windows应用程序的开发方法。Visual Studio.NET完全支持Visual Basic.NET、Visual C+.NET、Visual C#.NET和Visual J#.NET四种开发语言,实际上,Visual Studio.NET还允许一种语言创建一部分应用程序,然后使用另一种语言创建应用程序的其余部分。本防火墙程序的开发使用了Visual Studio.NET 2003作为开发环境。3 系统设计3.1 设计概要作为基于包过滤的防火墙,防火墙的规则是由用户手动添加的,规则的属性包括源IP地址、目的IP地址、源端口、目的端口和协议。一般的数据包结构如图3-1、图3-2和图3-3所示。图3-1 TCP头结构图3-2 UDP头结构图3-3 ICMP头结构基于这些结构,因此添加规则时的对话框就包含源IP、源端口、目的IP、目的端口以及协议类型五个属性。添加规则列表如图3-4所示。为了简便起见,这里允许的最大规则数量是7条,如果超过这个限制,当用户再要添加规则时,系统会提示如图3-5的错误。同样的,当用户未选定规则而想删除该规则时,会提示如图3-6的错误。在这里,由于工具栏上的图标点击的作用与菜单中相应的功能完全相同,因此工具栏中的按钮响应事件函数都是直接调用菜单栏的对应函数。对于本防火墙程序通过API函数截获的每个数据包,遍历规则列表中每条规则,如果存在某一条规则与之对应,则阻止该数据包通过防火墙。为了使用户不需要每次使用本防火墙都重新输入一遍所有规则,防火墙提供了保存当前规则到文件和读取文件以导入规则两项功能,在程序主菜单下的保存规则和读取规则两个子菜单项被点击后就能看到如图3-7所示的保存规则对话框和如图3-8所示的读取规则对话框。同时为了方便用户使用,关闭防火墙时程序会自动生成一个名为lastrules.rul的文件来记录当前使用的规则,该文件自动被保存在与本防火墙程序相同的目录路径下。在防火墙启动时,会自动从程序路径下寻找该lastrules.rul文件,如果能够找到,会自动对该文件调用LoadRules()函数来导入最后一次生效的规则。图3-4 添加规则界面 图3-5 规则过多提示图3-6 删除出错提示 图3-7 保存规则示意图图3-8 读取规则示意图对于在列表中的规则,可以选中后使用菜单、快捷按钮或者右键菜单来进行删除或修改,如图3-9所示。当然有些用户习惯双击以修改规则,这里也为对应的鼠标操作添加了响应事件,因此通过鼠标双击规则来修改该条规则也是合法的用户操作。图3-9 规则列表右键菜单当用户在添加和修改规则时,需要手动输入过滤规则的源IP地址以及目的IP地址,这里会对这两项使用inet_addr()函数进行判断,如果输入的地址并不是合法的IPV4地址,将会弹出如图3-10和如图3-11的两种错误提示。 图3-10 源地址格式错误提示图3-11 目的地址格式错误提示当前本防火墙的设计是默认放行数据包,仅对符合规则列表的数据包进行过滤。基本ICMP截获功能效果图如图3-12所示。图3-12 基本功能示意图这里使用的规则是All to All的ICMP丢弃。在命令提示符中以ping -t命令观察结果可以看到,当未启动防火墙过滤功能时网络连通,获得目标的相应数据包。当开启防火墙过滤时得到Destination host unreachable结果,而关闭防火墙过滤功能后又能继续ping通。3.2 选项功能防火墙主选项菜单下,有两个复选框,分别可以让本防火墙在系统开机启动时加载运行以及启动防火墙后自动启动过滤并最小化隐藏为图标。主选项对话框界面如图3-13所示。其中包括两个复选框选项:于系统启动时加载和自动启动过滤并最小化为图标。顾名思义,于系统启动时启动即把本程序加入到系统启动项,这里通过使用RegS-etValueEx()函数把本程序路径及程序名写入注册表路径HKEY_CURRENT_USERSoft-wareMicrosoftWindowsCurrentVersionRun来实现。在用户点击该对话框的确定按钮时,如果勾选了该复选框,就会自动写入注册表值,同样的在去掉勾选时保存选项就会自动删去该注册表值。图3-13 防火墙选项对话框自动启动过滤并最小化为图标是指在防火墙开始运行启动后直接开启过滤功能,同时不显示于桌面而最小化隐藏为图标,实现了自动服务于后台为系统提供保护。当勾选该复选框时,参数theApp.m_oOptions.m_bStartFiltering将被赋值为1,然后,在InitInstance()函数下使用if(theApp.m_oOptions.m_bStartFiltering=true) (CMainFrame *)m_pMainWnd)-OnButtonstart()。前面已经提到,防火墙在启动时,会根据前一次退出时的规则列表生成lastrules.rul文件,自动导入该文件里的规则,以使自动过滤有规则可循且这些规则是用户最近使用的。同时,程序将在启动过滤后调用隐藏菜单中最小化为图标函数,直接把程序隐藏,仅留下一个托盘图标于任务栏,使用户工作桌面不受到影响。用户完全可以在第一次使用时设定好规则,然后勾选选项中两项复选框即可放心使用。隐藏菜单下面的最小化功能可以使防火墙隐藏到右下角托盘菜单,使防火墙更为人性化,通过双击托盘图标或者在右键菜单中点击显示主窗体都可以复原防火墙主界面。图3-14是本防火墙的托盘菜单示意图。图3-14 防火墙托盘菜单最后,在退出防火墙时,程序会善意地给予用户一个退出确认框防止用户错误地关闭防火墙。如图3-15所示是确认退出对话框。图3-15确认退出对话框3.3 界面控制由于本防火墙程序主要视图界面是由IDD_FIREWALLAPPFORM组成,主要菜单部分由MENU_IDR_MAINFRAME构成,主要快捷工具栏部分由TOOLBAR_IDR_MA-INFRAME获得。由于规则视图界面的大小是固定的,因此如果使程序窗口最大化会产生视图区域边上还有很大一部分灰色区域,影响美观。因此在视图区域函数(OnInitialUpdate())中使用CFormView:OnInitialUpdate();GetParentFrame()-RecalcLayout();R-esizeParentToFit()三句语句来使程序边框的大小适合于视图,并在主窗口构建函数CMa-inFrame:PreCreateWindow(CREATESTRUCT& cs)中调用了下述三句语句:cs.style &= WS_MAXIMIZEBOX;/隐藏系统主界面最大化按钮cs.style &= WS_MINIMIZEBOX; /隐藏系统主界面最小化按钮/使本程序的窗口大小不能用鼠标点击边框边缘拖动cs.style &= WS_THICKFRAME;通过这些代码,本程序的界面就被固定了。4 系统实现本课题在Visual Studio.NET 2003中开发,使用MFC程序创建,为多文档应用程序。程序主要功能部分写在MainFrame.cpp中,程序主选项的操作部分写在AppOptions.cpp中,而主选项定义部分写在OptionDlg.cpp中。规则方面的数据结构以及一些基本操作算法写在FirewallAppDoc.cpp中,规则更改添加的内容写在 RuleDlg.cpp中,规则列表视图位于FirewallAppView.cpp,一些初始化操作位于Firewa-llApp.cpp中,对于封包的一些核心代码是在PacketFilter.cpp中。另外,程序还导入了一些头文件。例如导入Fltd- efs.h文件以使用PfCreateInterface()创建过滤接口函数、PfDel-eteInterface()删除过滤接口函数、PfAddFilterToInterface()为接口添加过滤规则函数、Pf-RemoveFromInterface()为接口移除过滤规则函数和PfBindInterface()绑定过滤接口函数等。本程序所用到的类包括MFC应用程序自动生成的关于(CAboutDlg)、主程序(C-FirewallApp)、文档(CFirewallDoc)、视图(CFirewallView)以及主框架(CMainFrame)等类。还有自己定义的选项操作(CAppOptions)、选项对话框(COptioinDlg)、包过滤(CPacketFilter)、包过滤接口(CPacketFilterInterface)和规则对话框(CRuleDlg)等类。4.1 规则基本操作规则是每个防火墙必备的东西,是防火墙过滤经过数据包的根据,规则一般由用户根据其具体需要而设定。通常,防火墙的规则由以下五部分组成:源IP地址、目的 IP地址、源端口、目的端口和协议类型。这五项也是一个数据包的基本构成项。一般来说,用户可以对一个防火墙的数据包进行增加、删除和修改工作,使得该防火墙可以随时按照用户需求而改变作用,而不是只能死板地过滤某一种数据类型。对每种不同的过滤需求,用户可能会使用不同的规则列表,这里用户可以根据不同的配置和需求保存相对应的规则列表供下次需要时导入使用,规则文件存为*.rul格式。对规则的操作主要使用对话框实现,能够提升用户与系统的交互性。4.1.1 添加规则作为防火墙最不可或缺的过滤依据,规则是必不可少的,不然防火墙就形同虚设了。防火墙规则的几条基本属性上一段已经阐述,添加规则在本程序中通过OnButtonAdd()函数和OnMenuAddrule()函数完成。其中,OnButtonAdd()函数是面向工具栏中添加规则按钮的鼠标左键单击的事件处理,OnMenuAddrule()函数是面向菜单栏中添加规则菜单项的鼠标左键单击的事件处理。为了简便起见以及两者调用功能相同,OnMenuAddrule()函数直接调用了OnButtonAdd()函数。添加规则和修改规则两个函数都调用了同一个对话框IDD_ADDRULEDLG,因此在这里先定义一个基于该对话框类的dlg。首先对头文件的包含是每个程序文件都会使用到的,而Visual Studio.NET 2003会帮助编程者自动生成一些所需的语句,例如包含头文件、定义和声明类函数等。初始化中使用CFirewallAppDoc *doc = (CFirewallAppDoc *)GetActiveDocument()语句获取当前活动文件的指针。接着对规则池判断是否到达最大规则数量(if(nRules = MAX_R-ULES)),如果条件成立,则用int i = MessageBox (规则数量过多!, Warning , MB_OK|MB_ICONEXCLAMATION)语句弹出消息框提示用户规则数量过多,如果没有超过,则用到CRuleDlg dlg;dlg.DoModal()两句语句弹出添加规则对话框供用户添加一条规则。在本程序中,为简单起见,仅把最大规则数目设定为7(#define MAX_RULES 7)。当用户点击cancel按钮取消时,系统将不保留此次添加所填写的内容,直接返回主界面(return)。当用户点击OK按钮确认添加时,会触发CRuleDlg:OnOK()函数。这里系统会使用inet_addr(const char *sIp, unsigned long *lIp)函数分别检查用户输入的源IP地址和目的IP地址,如果输入的地址是X.X.X.X格式,且每个X字段都属于0-255范围(if( octetsi255)),那么系统将不会报错,其中,表示对应所有地址,该对应由过滤功能中实现。如果输入格式不符合IPV4的地址形式,系统会对应该错误弹出错误的源地址或错误的目的地址警告框。端口方面,用户可以指定某个端口(0-65535),其中0表示对所有端口。协议类型可供选择有ALL、ICMP、TCP和UDP四种类型。本防火墙默认设定是放行数据包,因此设定的规则对应的操作就是丢弃该数据包,这里添加规则时操作项就只有丢弃数据包一个下拉项。当用户输入的规则参数没有问题后,系统将调用AddRule()函数,这里使用nRules作为哨兵参数,rulesnRules指向最后一个有效规则的后一个的位置。把当前填写的源 IP、目的IP、源端口、目的端口和协议类型依次记入rules结构中当前第一个空位置,然后对哨兵参数nRules做nRules+操作。数据操作代码如下:rulesnRules.sourceIp=s-rcIp;rulesnRules.sourcePort=srcPort;rulesnRules.destinationIp=dstIp;rulesnRules.d-estinationPort=dstPort;rulesnRtocol=protocol;rulesnRules.action=action;nRu-les+。添加成功后,返回一个0值告诉系统该规则有效,接着系统会去调用UpdateList()函数使规则列表刷新至最新的规则,这里会先把规则列表视图中所有的东西清空,然后循环调用AddRuleToList(unsigned long srcIp, unsigned long srcMask, unsigned short s-rcPort, unsigned long dstIp, unsigned long dstMask, unsigned short dstPort, unsigned i-nt protocol)函数为规则列表根据rulesnRules结构逐条添加有效规则。这里,系统会读取rules每条结构对应的srcIp、unsigned short srcPort、unsigned long dstIp、unsigned short dstPort、unsigned int protocol和int action等六项参数,并逐个添加到对应的规则列表视图的位置。这里先通过pos=m_rules.InsertItem(&it)语句获得该规则对应的规则位置,然后以it.pszText=IpToString(ip, srcMask); m_rules.SetItem(&it)语句设置该源IP地址。同样的,对源端口、目的IP地址、目的端口、协议类型和操作项的设置方法也是如此,对应选项值可获得一个String值,然后用m_rules.SetItem(&it)语句使之显示为文本。最后通过Invalidate()使窗口无效化,通知系统OnPaint()再次刷新窗口,调用View-UpdateList()函数更新规则列表。添加一条规则的周期基本完成。4.1.2 删除规则当一个防火墙的某一种过滤规则不需要的时候,用户会选择对该规则作删除处理以防止误丢不必要的数据包。删除规则相比添加规则就要容易得多了,在菜单和工具栏中分别有对应菜单项和按钮。这两项分别调用了OnMenuDelrule()函数和OnButtonDel()函数。为了使两项函数保持一致性,在OnMenuDelrule()函数中直接调用了OnButtonDel()函数。通过CFirewall-AppView *view=(CFirewallAppView *)GetActiveView()语句获得本防火墙规则列表视图的指针,然后用POSITION pos = view-m_rules.GetFirstSelectedItemPosition()语句获取被选中规则的位置。如果获得的位置结果为空(if(pos=NULL)),那么菜单项中删除规则项和工具栏中删除规则按钮都将是灰色的即不可按下的(if(pos=NULL)pCmdUI-E-nable(FALSE);else pCmdUI-Enable(TRUE))。最初的设计是当用户没有选中某一条规则时,点选删除按钮会弹出未选中规则警告框,现在用户可以对当前可执行的操作一目了然。当用户正确选中一条规则后,菜单栏的删除规则项和工具栏中删除规则按钮都将可以被执行,这里使用CFirewallAppDoc *doc=(CFirewallAppDoc *)GetActiveDocument()语句来获得当前有效的文件指针,执行DeleteRule(unsigned int position)函数。在该函数中,先判断pos参数是否和有效规则列表末端位置nRules-1相等即是否删除的是最后一条规则,如果相等,直接改变nRules的值(nRules-)即可让系统忽略掉最后一条规则的存在,因为在本系统中,所有获取规则的函数都会用到nRules参数,该参数决定了有效规则的数量,也就使在rulesnRules规则后面的所有规则都不会被程序调用。如果删除的是中间的规则,设定临时未知变量i,标记要删除的规则位置为i,将每个nRul-esi+1中数据结构依次分别赋给nRulesi,完成一条后i+。循环结束条件是当i的值与最后一条数据的位置值相同时,即已对每条需要移动位置的规则都完成操作。最后对规则数量参数nRules作减一操作(nRules-)。删除成功后,通过UpdateList()函数刷新规则列表视图区域。4.1.3 修改规则修改规则其实是等价于先删除规则再添加规则的一种操作。一般来说,用户对一条规则不是很满意,而又不愿意对规则做删除操作再添加操作这么繁琐的步骤时,会选择修改操作。修改规则放在规则菜单中,而没有在工具栏中添加相应的快捷按钮。其调用的主函数是OnEditRule()。先通过CFirewallAppDoc *doc = (CFirewallAppDoc *)GetActiveD-ocument()语句获得文件指针和CFirewallAppView *view = (CFirewallAppView *)GetA-ctiveView()语句获得视图指针,由于是修改规则,必定需要用户选中一条规则,因此当用户没有选中任何规则时,规则菜单下的修改规则项是不能被点选的,呈灰色状态。只有当用户选中一条规则时,修改规则项才能被使用。这个对比如图4-1和图4-2所示。图4-1 未选中规则时的规则菜单图4-2 选中一条规则后的规则菜单检查是否选中规则依然使用POSITION pos=view-m_rules.GetFirstSelectedItemPos-ition();if (pos=NULL)两句语句完成,与删除规则按钮的用法相同,这里也是使用if (pos=NULL)pCmdUI-Enable(FALSE); else pCmdUI-Enable(TRUE)语句来控制该菜单项是否能被使用。当这个判断条件不成立时,程序将根据pos参数给出的选中的规则的位置,去获得该条规则的各项信息。同时,创建一个基于CRuleDlg的对话框dlg,将dlg的每个填选框的信息更新为当前这条规则的信息,用户能看到如图4-3的添加修改界面,在图中可以看到已经读取的选中规则的信息。Cancel按钮依然是允许用户不保存此次修改而直接退出修改界面,用户修改规则完毕,点击OK系统同样会对所填写的所有信息进行确认,没有错误的情况下,系统自动把rulespos当前这个被选中的规则信息更新成用户新输入的规则信息。调用UpdateList()函数,以保证在当前规则列表中的规则都是最新的。图4-3 修改选中规则示意图4.1.4 保存规则当用户使用本防火墙,设定了一系列规则后,如果想要在下次使用时能够再一次调用该规则列表的话,可以把当前的规则全部保存为一个*.rul格式的文件,在需要时直接读取导入即可。保存规则在本防火墙中只有菜单项提供,没有设计工具栏快捷按钮。其使用的函数是OnSaveRules(),函数先使用CFirewallAppDoc *doc=(CFirewallAppDoc *)GetActive-Document()语句获取文件指针,当规则列表中没有任何规则时,即nRules哨兵指针的值为0,如果这时候用户点击保存规则菜单项时,会弹出如图4-4所示的警告对话框。图4-4 没有规则可供保存警告框规则列表中有规则可以保存时,系统调用CFileDialog对话框类弹出保存规则文件对话框,如果用户放弃保存,点击取消按钮即可退出保存对话框,点击保存将按照用户所填写的文件名保存为文件。用户即可在下次使用时选择菜单项的读取规则来读取之前保存的规则列表文件,可以节约用户重新设定规则的时间。4.1.5 读取规则当用户再次打开使用本防火墙时,可能之前已经保存过对应的规则列表,如果再重新每条手工添加规则会使用户感觉比较繁琐且及其浪费时间。这时,读取已经保存的规则文件就显得尤为有用。当用户选择读取规则时,使用CFileDialo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业沟通管理流程及工具箱
- 时间与空间的讲解课件
- 人教版四年级上册第一单元1.7《计算器》课时练(含答案)
- 金钱不是万恶之源500字9篇
- 以国庆节为题写600字作文12篇范文
- 古诗文阅读理解与赏析教学计划
- 早安母婴知识培训课件
- 2025年事业单位招聘考试综合类专业技能测试试卷:软件工程专业
- 南阳市高二会考语文作文(7篇)
- 2025年美容师(初级)美容美发行业挑战鉴定试卷
- 2025年长沙市中考数学真题(含答案)
- 开放性骨折感染预防的护理
- 浙江宁波江北区重点达标名校2026届中考三模语文试题含解析
- PC构件吊装专项施工方案(修改1)
- 混泥土计量管理办法
- 二级生物安全实验室备案材料
- 国防教育课件
- 完整版护士糖尿病护理课件
- 铜绿假单胞菌安全数据单
- 立足“大思政”当好引路人-如何当好班主任专题培训
- 退休干部管理暂行办法
评论
0/150
提交评论