张辉
摘 要:论文提供了一种Windows防火墙设计方案,它是基于Windows 2000操作系统、DDK for Windows 2000工具开发包以及VC++6.0等平台而开发的程序。该程序按照功能模式划分,可分为两大块内容,一个是Filter_Hook Driver驱动,另一个就是用户操作界面了。在这里,Filter_Hook Driver驱动的作用是注册过滤钩子回调函数,并且按照用户提供的过滤规则进行数据包的过滤;用户操作界面的作用是实现用户自定义去增添与删减过滤规则,用户并且可以自行以文件形式来保存增添进来的过滤规则。
关键词:网络驱动;防火墙;回调函数
中图分类号: TP309 文献标识码:B
1 引言
Internet的高速发展对人们的生活习惯、事物认知都产生了巨大的改变。人们体验着互联网在生活上所带来的全新感知,习惯着信息时代所带来的各种的便利。然而,网络在给大家带来生活便利的同时,也给人们的安全带来了威胁。防火墙作为一种重要的网络安全技术,越来越发挥着重要的作用。
防火墙的作用是按用户自定义的规则来过滤对其所抓取的数据包,因此防火墙设计的核心任务就是要实现对数据包的抓取。抓取数据包也有很多方法,比较简单的方法是使用一个基于Windows平台的免费公共网络访问系统—Winpcap(Windows Packet Capture),但Winpcap的主要功能是独立于主机协议(如TCP/IP)去发送和接收原始数据的。这就意味着,Winpcap并不能够阻塞、过滤或者控制其它的应用程序对数据包的接收和发送,它的作用仅仅是监听网络上传送的数据包。使用Win2000 DDK中提供的Filter-Hook Driver驱动(过滤钩子驱动)来实现数对据包的过滤是一个更好的选择[1,2]。
2 程序设计方案
如图1所示,基于网络驱动的Windows防火墙设计可以分成两个部分,用户界面代码部分和过滤钩子驱动代码部分。而过滤钩子驱动代码部分又是依赖于网络适配器模块,网络适配器模块是基于IP Filter_Hook代码和网络适配器代码两部分。也就是说只要将IP Filter_Filter代码以及网络适配器驱动代码做出编写,那么这个设计的过滤钩子驱动代码部分也就能够有了大概的轮廓;在用户界面代码部分,只要通过基础的代码编写出简易的用户界面即可。
利用在Windows 2000 DDK中所介绍的Filter-Hook Driver驱动来实现对所有的进出接口的数据进行过滤。这其中主要是包含这些过程:首先开始先要确定并且搭建Kernel模式Filter-Hook Driver驱动,接下来就是要获取所有指向IP Filter Driver驱动的指针,然后就要运用前面所获取到的指针,来进行发送有不同类型的IRP(一种规范化的技术文档)将过滤函数实现安装,再接着将抓取到的数据准备过滤,最后在过滤数据完成以后,将能够过滤函数撤消掉[3]。
在用户界面代码部分所涉及到的内容其实就是用户能够看到的程序界面,也就是用户和防火墙进行对话的对象。它负责管理用户自己定义的过滤规则,并且与数据Filter_Hook驱动功能来实现互相通信。还有就是主要利用Filter_Hook Driver驱动模块的输出接口所提供的对象指针来实现注册过滤函数,撤消过滤函数,安装新的过滤规则,清除所有规则这四个功能。
3 Filter_Hook Driver驱动的实现
3.1 创建Kernel模式驱动
首先需要通过Filter_Hook Driver驱动程序来设置回调函数,在过滤钩子驱动程序作为该驱动程序的主体,并且通过系统提供的IPFilter Driver驱动注册这些回调函数,做完这些之后,IP Filter_Driver驱动就可以通过滤器钩子来想办法去处理传入或者传出的数据包。PacketFilterExtensionPtr数据类型的定义是用来定义注册过的过滤钩子驱动。
Filter_Hook Driver驱动函数会对这些传进来以及传出去的数据包来做一些不一样的处理动作。开始是将数据包的专属信息和IP Filter Driver驱动提供给过Filter Hook的信息来做一次对比,通过这个来对比,数据包接下来该做怎样的处理。接下来,在Filter_Hook Driver驱动对数据包做完检测之后,就去回复响应代码或者将PF_PASS給IP Filter_Hook,并且告知IP Filter_Hook驱动对数据包来做出处理[4]。
3.2 设置和清除Filter_Hook
通过Driver Entry函数来自定义驱动初始化的部分以及驱动卸载的部分。Filter_Hook Driver驱动程序在设置Filter Hook回调函数的时候,并且对IP Filter Hook驱动的每个传入IP数据包或者传出的IP数据包发出通知,让它调来使用钩子回调函数。Filter Hook会先清除之前注册的过滤函数。Filter Hook驱动首先需要将设备对象的指针作为IP过滤器驱动来创建一个IRP,之后,Filter_Hook Driver驱动把这个IRP发送给IP Filter Hook驱动,这样是为了记录并且清除回调函数[5]。
对Filter_Hook Driver驱动的设置或者清除回归函数的方式描述:想要获得IP Filter Hook驱动的对象指针,Filter_Hook Driver驱动函数就需要调用IoGet函数。在这次调用中,Filter_Hook Driver驱动传递了指向缓冲区的指针以及容纳返回的文件和设备的指针。Filter_Hook Driver驱动程序想要建立一个IRP,需要使用PF_SET_EXTENSION_POINTER控制码,并且把它提交给IP Filter Hook驱动程序来实现,通常情况下,Filter-hook驱动程序建立所需的IRP都是通过调用IoBuildDeviceIoControlRequest函数。
END_MESSAGE_MAP()
CFirewallApp::CFirewallApp()
{}
CFirewallApp theApp;
SetRegistryKey(_T("FirewallApp"));
if (!ProcessShellCommand(cmdInfo))
return FALSE;
enum { IDD = IDD_ABOUTBOX };
protected:
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
在这次调用之中,过滤器钩子驱动发送了指定值的IOCTL_PF_SET_EXTENSION参数以及包括了PF_SET_EXTENSION_HOOK_INFO结构的缓冲区域。同时为了设置Filter_Hook,这个结构还包含有设置Filter_Hook回调函数地址的信息。这个控制码也被用来清除回调函数从IP Filter Hook的程序之中[6,7]。
3.3 实现FILTER_HOOK
将两个或者两个以上的过滤规则连在一起的链表称之为过滤列表,在这个程序里它定自义了一个CFilterList的结构,也就是将指针指向后一个过滤规则的pNext指针添加到每个规则上面,通过这种办法就能够把两个或者两个以上的过滤规则连在一起形成过滤列表。而需要做的就是去记录首地址就能够来整理这些所有的过滤规则。在钩子回调函数中,当有数据包需要通过时,就得去遍历整个列表。
函数开始过滤,首先将保重的内容复制到共享的内存中,接着来判断是否符合IP规则。如果符合IP规则,那么就对IP规则去做出处理,并且接着选取下条过滤规则,来做出判断。如果不符合IP规则的,就再去检查看是否符合ICMP规则,如果符合ICMP的规则,那么就按ICMP规则来处理,并且选取下一条规则,来做出判断。如果ICMP规则也不符合的话,那么久去判断看是否符合TCP规则,如果符合TCP规则的话,那么就按照TCP的规则来处理,并且选取下一条规则。但是,要是不符合的话,那么就檢查看是否符合UDP规则,如果符合UDP的规则的话,那么就按照UDP的规则来处理,并且来选取下一条规则。像上面的情况一样,如果不符合规则,那么就结束规则的过滤。
通过CDriver类向驱动程序来发送这些设备控制代码用户程序的主要的实现。程序在初始化时通过加载Filter_Hook Driver驱动,然后当点击开始按钮时向驱动发送START_IP_HOOK来安装过滤钩子;点击停止按钮时发送STOP_IP_HOOK控制代码来清除过滤钩子;点击添加过滤规则选项时,就会弹出添加规则对话框,来为使用者提供添加过滤规则的输入界面;点击删除选项时则会实现删除所选定的过滤规则的功能;当使用者点击安装规则选项和卸载规则选项时,则会分别发送控制代码ADD_FILTER和CLEAR_FILTER来实现过滤规则的加载或者卸载。
4 结束语
本文运用了Filter-Hook Driver技术,设计了使用者自动添加、删除过滤规则,同时可以按照使用者已有的过滤规则完成数据包过滤等的功能。然而,经过检测使用者明显可以观察到,当使用者添加了比较多的过滤规则并进行数据过滤时,其反应的速度就会变的比较慢,因此使用者还需要努力对过滤规则对比算法做出进一步的改进。此外,还可以增加像日志功能这样的一系列类似的功能,日志功能是一项比较重要的功能,只有通过防火墙日志,使用者才可以更好的对防火墙做维护以及管理。
基金项目:
1. 山西省教育科学“十三五”规划2016年度课题“网络工程专业一体化实践教学体系的实践研究”(项目编号:GH-16186)。
2. 2016年山西省信息化基金项目“基于知识工程的网络信息安全支撑服务研究”。
参考文献
[1] 王文鹏,黄俊.对BM模式匹配算法的一种改进[J].计算机工程与用,2011,47(32):108-111.
[2] 殷超,李大兴.基于改进BMSU法的确定型有穷自动机的设计[J].微计算机信息,2008,24(3-1):215-216.
[3] 贺龙涛,方滨兴,胡铭矜.对BM串匹配算法的一个改进[J].计算机应用,2003,23(3):6-8.
[4] S.Wu, U.Manber A fast algorithm for multi-pattern searching In Technical Report, TR-94-17 Dept. of Computer Science, University of Arizona 1994.
[5] 殷丽华,方滨兴,张宏莉.快速的多模式匹配算法[J].哈尔滨工业大学学报,2007,39(12):1926-1929.
[6] Gary Plumbridge, Jack Whitham, Neil Audsley. Blueshell: a platform for rapid prototyping of multiprocessor NoCs and accelerators [J]. ACM SIGARCH Computer Architecture News, 2013,41(5): 107-117.
[7] Karthik Lakshmanan, Dionisio De Niz, Ragunathan Raj, Gabriel Moreno. Overload provisioning in mixed-criticality cyber-physical systems [J]. ACM Transactions on Embedded Computing Systems, 2012,11(4): 83-85.