APP下载

基于LSP与NDIS驱动防火墙的设计与实现

2020-11-06梅足辉

现代信息科技 2020年12期
关键词:防火墙

摘  要:信息时代个人电脑成为了生活的重要组成部分,对个人防火墙的研究对保护信息安全有重要的现实意义。目前防火墙大多在驱动层面使用包过滤技术,对数据的封包处理能力有限,并且无法接触应用层信息,过滤匹配算法也大多为线性时间算法。为了提高防火墙的过滤能力,文章提出加入LSP过滤技术对网络封包进行全面深度过滤,并改善了匹配算法,设计了一款内核与应用层双重过滤的驱动防火墙。经过测试,它对网络数据包有强大的过滤能力。

关键词:网络驱动接口规范;防火墙;LSP;包过滤

中图分类号:TP393.08       文献标识码:A 文章编号:2096-4706(2020)12-0140-03

Abstract:Personal computer plays an important role of life in the information age. Therefore it is important and realizable for us to research the firewall. At present,most firewalls use packet filtering technology at the driver level,which has limited processing capacity for data packets,and can not contact the application layer information,and most of the filtering and matching algorithms are linear time. In order to improve the filtering ability of firewall,LSP filtering technology is proposed to filter network packets comprehensively and deeply,and the matching algorithm is improved. A driver firewall with dual filtering of kernel and user layer is designed. After testing,it has a strong filtering ability for network packets.

Keywords:network driver interface specification;firewall;LSP;packet filtering

0  引  言

防火墙是保护网络安全的一种重要手段,它通常部署在内网入口处与个人主机上,具有硬件与软件的形式。防火墙通常为包过滤防火墙、状态检测防火墙等[1]。此类防火墙主要根据一些过滤规则对网络包五元组(即目的与源IP地址、目的与源端口、协议)进行过滤[2],同时匹配模式通常是从第一条规则开始逐步比对,直到遇到相同规则或者按照缺省规则处理。

由于此类防火墙通常处于网络结构下层,无法感知用户层信息。为了提升防火墙能力,本文加入了用户层的过滤HOOK;同时由于过滤匹配通常为线性算法,为了提高过滤效率,将过滤规则以哈希双链表的方式组织[3]。实验表明加入用户层HOOK的防火墙拥有了感知应用层信息的能力,并且当过滤规则数量较多时,哈希双链表也能有效提高匹配效率。

本文基于校内工业协议防火墙的项目对防火墙进行了研究,在NDIS中间层的过滤驱动中加入了LSP过滤HOOK,改善了过滤匹配算法,并使用共享内存与IOCTL作为主界面UI、应用层DLL、内核层驱动之间的通信方式,设计并实现了一款基于LSP与NIDS的驱动防火墙。

1  系统设计

1.1  模块设计

本防火墙将分为三个模块:主界面UI、应用层DLL、内核层驱动,交互过程图如图1所示。

(1)主界面UI:负责与用户的交互,例如加载LSP的DLL钩子、设定应用层与内核层的过滤规则、显示网络访问监视界面、询问用户决定以及设置注册表等功能。本模块通过共享内存与应用层DLL模块通信、通过IOCTL与内核层驱动模块通信,保证两层过滤模块能够及时获得用户期望的过滤行为。

(2)应用层DLL:这是一个运行在用户模式并注入系统协议链的DLL模块。负责在Winsock的层面截获应用程序访问网络的请求,并根据与主界面UI的共享内存设定过滤函数的逻辑,判断网络请求是否记录、通行等。

(3)内核层驱动:这是一个NDIS中间层过滤驱动,负责在内核模式根据IOCTL与主界面UI的通信结果来管理输入输出封包、记录网络活动状态等。

1.2  过滤规则

防火墙将根据用户设置的过滤规则对流经网络的数据包进行过滤与拦截[4]。各个模块具体规则信息如表1所示。

2  核心技术

2.1  匹配算法

本系统采用哈希双链表的方式进行过滤规则匹配。通常的规则匹配都是采用循环对比的方式,此方式在规则数量足够多时将会极大影响系统的运行效率[5]。因此本系统将规则以哈希表的形式存储,匹配时计算规则Key值进行匹配,时间复杂度为O(1),极大地提高了防火墙的匹配效率。

2.2  内核层面过滤

本系统采用中间层驱动作为系统内核层的过滤方式。在Windows网络中,应用层的网络請求将通过SPI接口进入内核,通过TDI接口协议驱动、中间层驱动、网卡驱动传输至下层NIC设备发送。其实这些驱动都可以选择作为防火墙的过滤技术,也各有商业软件的实现。

底层网络驱动中,协议驱动方便捕获所有接收包,但不利于捕获发送包;而网卡驱动则更加片面不能过滤到所有的封包。中间层驱动兼备两者特性,对上表现网卡驱动接口,对下表现协议驱动接口,是内核中过滤网络数据包的最佳选择,因此本系统选择中间层驱动作为内核层的过滤技术。通过中间层驱动可以过滤原始以太网络包、分析协议类型、修改网络数据包,可以过滤或修改源地址与端口、目的地址与端口、数据包内容,并可以进行任意修改、转发、丢弃,放行[6]。

本系统中间层驱动中,注册了包装句柄、小端口句柄、关联句柄、协议句柄、填写特征函数、绑定网卡设备、创建设备对象、填写IRP操作函数等。在系统发送网络数据时会调用NdisSend或者NdisSendPackets函数,本系统的中间层驱动将对上层展示为网卡驱动,获取从设备栈上层的Send操作,并在Send操作中完成对数据的过滤。同理系统Receive的回调也以类似的方式实现。

Windows传输封包在底层网络中为NDIS_PACKET、NDIS_BUFFER。NDIS_PACKET(包描述符)是一组存放NDIS_BUFFER(缓冲描述符)的链表结构。在过滤时要以两套过滤方法对两种结构进行过滤,因为系统接收时调用的函数是不确定的,所以要对两种结构的收发函数同时过滤才能截获所有封包。

2.3  应用层过滤

本系统采用LSP技术进行应用层过滤。此技术本质上是一个HOOKDLL,用户打开主程序后,本系统会将LSPDLL注册安装到当前主机的Winsock目录,并且更改协议链的顺序,否则在API调用时新的提供者将在目录结尾,永远不会被默认调用。

通过HOOK技术挂入主机协议链后,用户系统调用WSAStartup进行Winsock编程时,会调用本系统注册的SPI函数,当主机系统进行网络通信,例如使用Connect、Socket、SendTo等函数,将会传递到本系统在DLL中的Winsock API;使用WSPConnect、WSPSocket、WSPSendTo等函数,此时所有网络数据将会按照防火墙DLL中的规则对网络封包进行过滤。

2.4  系统通信方式

用户对防火墙进行操作时会通过主模块与过滤模块进行交互,例如设定内核层或者应用层的过滤规则。同时过滤模块在进行过滤时也需要与用户进行交互,例如询问用户过滤动作、显示当前过滤信息等。因此本系统需要实现各个模块之间的信息交互功能。

主界面UI与应用层DLL之间的通讯采用共享内存的方法实现。本系统在DLL中分配一片可读可写的共享内存作为通信缓冲区,在应用程序中需要使用CreateFileMapping创建内存映射获取句柄再通过MapViewOfFile获得映射用来访问共享内存。此方法在访问共同资源时需要进行对资源访问锁的控制,防止双方同时改写数据造成数据冲突。

应用层与内核层驱动之间的通讯采用IOCTL的方法实现。进行设备读写时,通常用户会操控UserBuffer直接进行读写,但是此方式会重复复制缓冲区的信息,在防火墙中信息量通常比较大,直接用UserBuffer效率十分将低下,所以本系统使用DO_DIRECT_IO的方式进行读写。使用此方式时用户访问读写区域的内存结构是一个MDL,这相当于一个指针,将应用层内存空间映射到内核空间中,这是内核空间的内存通过分页表等手段向外部的一次映射。Irp->MdlAddress则是这个MDL的指针的句柄,通过内置函数MmGetSystemAddressForMdlSage,即可得到UserBuffer对内存进行高效访问。

3  程序调试与测试

调试环境:VMware Windows 7

开发环境:Visual Studio 2017,WDK 10、SDK 10

防火墙系统运行之前需要将防火墙DLL与驱动注入主机系统,DLL注入使用LoadLibrary函数,在防火墙主机面点击加载DLL按钮即可完成DLL的加载。

驱动加载有两种方式,一种是右键打开本地连接-属性,在网络选线中选择安装,在对话框中选择防火墙的SYS文件进行安装。另一种是使用已经编译好的安装程序键入命令installdrv mfw.sys進行安装。完成后即可使用防火墙的全部功能,图2所示为防火墙的网络访问监视界面。

4  结  论

本文针对传统防火墙过滤能力单一的问题,设计了一款基于LSP与NDIS双层过滤的驱动防火墙,讨论了防火墙的模块设计和主要技术以及思路,详细阐述了如何实现数据包过滤以及一些重要技术。虽然NDIS中间层过滤驱动功能强大,但其位于系统底层,获取信息能力有限。针对这个问题,本文在防火墙加入了应用层的DLL防火墙,使防火墙过滤底层网络封包又可兼顾上层应用过滤。

驱动程序复杂,稍不注意就会出现级别越界、访问越界等问题导致蓝屏死机,同时内核系统函数也复杂多样,所以编写程序时也需要一份样例来指导。此防火墙在应用层与内核层进行双重过滤,稳定高效,安全性能显著,并且拥有图形交互界面,方便操作。本文重点阐述了防火墙的技术难点,为NDIS驱动编写人提供参考。

参考文献:

[1] DIEKMANN C,HUPEL L,JULIUS MICHAELIS,et al. Verified iptables Firewall Analysis and Verification [J]. Journal of Automated Reasoning,2018,61(1-4):191-242.

[2] NEVILLE U,FOLEY S N. Reasoning about firewall policies through refinement and composition [J]. Journal of Computer Security,2018,26(2):207-254.

[3] TRABELSI Z,ZEIDAN S,MASUD M M,et al. Statistical dynamic splay tree filters towards multilevel firewall packet filtering enhancement [J]. Computers & Security,2015,53:109-131.

[4] 宫鼎.基于权重与匹配效率的防火墙规则集优化算法 [J].现代计算机(专业版),2014(14):45-50.

[5] 万伟.基于NDIS中间层驱动的DDoS防火墙的设计 [J].实验科学与技术,2015,13(2):32-35.

[6] 王婷婷.基于NDIS中间层驱动的网络内容过滤关键技术研究 [D].天津:天津理工大学,2017.

作者简介:梅足辉(1996.11—),男,汉族,江苏镇江人,研究生,研究方向:软件开发。

猜你喜欢

防火墙
简单高效 玩转Windows 10防火墙设置
一张图看懂民间借贷“防火墙”
防火墙技术在网络安全应用中的现状与发展趋势
防火墙技术在网络安全应用中的现状与发展趋势
防火墙技术在网络安全应用中的现状与发展趋势
浅谈防火墙
H3C高端防火墙成功竞标广东电信
防火墙选购必读
新手设置Windows Vista自带防火墙
探析网络安全与防范技术