首页 > 范文大全 > 正文

Linux下基于内容过滤防火墙性能的改进

开篇:润墨网以专业的文秘视角,为您筛选了一篇Linux下基于内容过滤防火墙性能的改进范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:论文以linux Netfilter第七层封包分析模块为基础,分析了此类防火墙在实际应用中存在的不足,通过改变L7-filter的封包处理方式有效地解决了封包误判的问题;并通过运用状态检测技术,来提升封包经过防火墙时处理的性能,使得在网络流量高或过滤规则多的情况,不会因为内容过滤机制速度过慢,而拖垮网络的整体性能,通过如上的改进,使得内容过滤机制具有更大应用价值。

关键词:防火墙;封包识别;内容过滤;连线跟踪

近年来防火墙对网络的保护越来越重要,特别是P2P软件越来越多的趋势下,传统防火墙并不能有效的过滤P2P软件,因此越来越多的防火墙改用Connection Classification针对整个连线进行较完整的扫描。虽然有厂商推出此类防火墙,特别针对P2P使用的动态连线端口提供了连线过滤能力,但是商业应用层防火墙的售价偏高,而且商业用的防火墙,其操作系统不对外开放,只能通过厂商的软件更新才可以升级,而P2P系统与技术的更新非常快,所以商用防火墙要一直依赖厂商推出的更新特征值或者软件升级的方式让使用者升级,使用者才有可能让所购买的防火墙可以过滤最新的P2P软件。

而本片论文所使用的是目前网络上都可以取得的Open Source套件,也有许多热心的程序员不断地更新P2P软件的特征值,让使用者可以在花费较低成本的情况下,来达到与商用防火墙相同的目的。

1Netfilter/iptables工作原理

从Linux内核2.4版本开始,内置了IP信息包过滤工具Netfilter/iptables系统,它使防火墙配置和信息包过滤变得更加容易,其中Netfilter是用来实现防火墙的过滤器,而iptables则用来指定Netfilter规则并管理内核包过滤,它为用户配置防火墙规则提供了方便,通过iptables可以加入、插入或删除内核包过滤表(链)中的规则,这些规则由Netfilter及其相关模块执行。

Netfilter是嵌入内核IP协议栈的一系列调用入口,设置在报文处理的路径上,Netfilter就是根据网络报文的流向,在以下几个点插入处理过程:

NF_IP_PRE_ROUTING,在报文作路由以前执行;

NF_IP_FORWARD,在报文转向另一个NIC以前执行;

NF_IP_POST_ROUTING,在报文流出以前执行;

NF_IP_LOCAL_IN,在流入本地的报文作路由以后执行;

NF_IP_LOCAL_OUT,在本地报流出路由前执行。

检查点分布在协议栈的流程中,流程图如下。

Netfilter框架为多种协议提供了一套类似的钩子(HOOK),用一个struct list_headnf_hooks[NPROTO][NF_MAX_HOOKS]二维数组结构存储,一维为协议族,二维为上面提到的各个调用入口。每个希望嵌入Netfilter中的模块都可以为多个协议族的多个调用点注册多个钩子函数(HOOK),这些钩子函数将形成一条函数指针链,每次协议栈代码执行到NF_HOOK()函数时,都会依次启动所有这些函数,处理参数所指定的协议栈内容。

每个注册的钩子函数经过处理后都将返回下列值之一,告知Netfilter核心代码处理结果,以便对报文采取相应的动作:

NF_ACCEPT:继续正常的报文处理;

NF_DROP:将报文丢弃;

NF_STOLEN:由钩子函数处理了该报文,不要再继续传送;

NF_QUEUE:将报文入队,通常交由用户程序处理;

NF_REPEAT:再次调用该钩子函数。

Netfilter/iptables IP信息包过滤系统是一种功能强大的工具,可用于添加、编辑和删除规则,这些规则是在做信息包过滤时,防火墙所遵循和组成的规则。

2L7-filter

L7-filter是基于连线跟踪和字符串匹配的网络应用层过滤方式,L7-filter是将网络上的封包在应用层的数据内容重新拷贝一份,然后把拷贝内容以字符串的形式与事先设定好的特征码进行匹配过滤。这里的特征码是以正则表达式的形式存放在.pat文件里(此处采用的正则表达式是version 8版本),并通过iptables命令将正则表达式预处理后,传到内核netfilter中,因而它具有更好的通用性和扩展性。

以大家常用的BT为例,如果要封锁防火墙内网的BT,执行的命令如下:

iptables -A FORWARD-m layer7 --l7proto bittorrent -j DROP

其中bittorrent表示BT协议。在/etc/l7-filter/protocols目录下,存在一个bittorrent.pat文件,文件里存放的是BT发送的封包特征码,特征码以正则表达式的形式存放。bittorrent.pat文件内容如下:

bittorrent //与.pat的文件名相同

\x13bittorrent protocol//BT 握手协议的封包特征

由于L7-filter的数据是存放在内核中的,如果系统是作为路由的功能,且联机数很大时,操作系统(linux)要为连接记录分配大量的内存空间来存放相应联机数的应用层数据。因此缓冲区的长度不宜过大,另外对于一个应用程序所发送的封包而言,其握手或协商作用的封包通常是在前几个封包,当连接正常通信时,其封包特征不是很明显,因此L7-filter只检测每个连接的前若干个封包(默认值是10个,可以通过修改/proc/net/layer7_numpackets值进行配置)。

L7-filter对封包应用层数据的预处理原理如下:

1.基于匹配是将数据当作是字符串来处理,且‘\0’(二进码00000000)是字符串结尾的标志,在拷贝应用层的封包数据中出现‘\0’时,去掉所有的‘\0’。

2.将封包应用层数据中出现的大写字符转换成小写,从而使用匹配时大小写不敏感。但是相关的匹配算法则可以实现大小写敏感。

3.L7-filter在处理.pat文件理的正则表达式时,也是先将正则表达式中出现在的大写字符转换成小写,然后检查正则表达式的格式是否出错。

3存在的不足之处

3.1存在误判

数据在网络的传输过程中,数据内容是无法估计的,基于应用层过滤的方式势必会造成误判,尽管在编辑正则表达时要求规范,但是误判还是难以避免,比如说迅雷,其发送的UDP封包的特征值是“\x32\0\0\0”,但是从上一节介绍L7-filter预处理封包是将\0去除的原则,这里的特征码的正则表达式将会被处理成“^\32”(其中^号表示数据开始位置),并将此规则用于迅雷封包的过滤,设定规则的命令为(网络环境的配置如上同):

iptables -A FORWARD-m layer7 --l7proto xunlei -j DROP

由此正则表达式可以看出,网络上的封包凡是以\x32开的数据全将被DROP(阻挡)。基于网络封包数据的不可预测性,这里假设整个网络环境中,封包中数据中每个字符出现的率是相等的,第一位数据的可能是256种(ASCII码0-255),\x32出现的机率是1/256,则采用“^\x32”的正则表达式过滤迅雷时,会阻挡掉网络中1/256的封包,这样的机率会严重影响网络的正常传输,误判非常严重。

另外,对于L7-filter对于\0字符不处理的情况下,如果P2P软件是以\0,或是以\0为特征的一部分作特征码时,L7-filter性能就非常差,并且误判也会增加。

类似的情况还有很多,例如:BT的UDP track的特征“.........\0\0\0\x01”等。

3.2过滤速率较低

在目前Linux防火墙架构中,封包必须逐一比对防火墙规则直到比对到符合的规则为止,才会停止比对。同样的Netfilter的extension matching module L7-filter也是一样,当规则使用越多,L7-filter比对的次数也越多次。与传统Layer4防火墙不同点在于L7-filter在第一次透过封包内容比对出结果后,便会在此封包所属Conntrack上增加一个辨识出来的应用软件名称,以供以后可以透过搜寻这个名称来直接比对;就如同Layer4防火墙是直接比对封包的包头来决定是否符合规则。因为将封包内容透过字符串比对是非常缓慢的。虽然有了这样的方式,但是字符串比对与传统Layer4防火墙直接比对每个封包的包头,在速度上仍有不小的差异。这种状况会随着防火墙规则数量的增加而产生性能上的落差。

4性能的改进

4.1L7-filter误判的改进

鉴于L7-filter针对数据包中‘\0’不作处理的规则,为了提高L7-filter的性能,降低针对‘\0’特征码误判率问题,我们在这里对L7-filter预处理数据内容的规则进行修改。

L7-filter在实现匹配之前,是先将数据包内容中出现的大写字母转变为小写,iptables在读.pat文件中的正则表达式时,也是先将正则表达式中出现的大写字母转变成小写,实现大小写不敏感的。但是在实际的应用中,正则表达式算法是大小写敏感的。因此我们可以将数据包中的‘\0’用一个特定的大写字母(在选择替代大写字母时,不能与正则表达中出现的特殊符号冲突,这里取N)来代替,用这个大写字母实现‘\0’匹配。因此L7-filter的字符串预处理改进为:

1.在.pat正则表达文件中,用‘\NULL’表示‘\0’,当iptables读.pat文件时,将\NULL转化成大写字母N,然后将正则表达式转到内核数据空间。(只将代表‘\0’的字符串用一个大写字来代替,而其它的没有改变,仍能保证匹配的大小不敏感。)

2.在L7-filter在组织连机的数据包时,同样要将数据中的‘\0’替换成大写字母N,但是,针对网络封包长度的特点,当封包中数据量太少的情况下,会在封包的结尾加一些‘\0’填充,来满足网络封包的最小长度要求。因此这里为了使有限的缓冲区能够存放最多的封包数量的数据和提高匹配效率,在这里先将数据包数据中结尾出现的填充字符‘\0’去掉,然后将数据封包中非填充字符‘\0’替换成大写字母N,在这里强调的是,原封包中的数据不能改动,只改动拷贝数据。

综上所述,可以看出实现L7封包数据预处理后,能够克服L7-filter不处理‘\0’的缺陷。

4.2过滤速率的改进

我们修改图1的第一个检查点(NF_IP_PRE_ROUTING)动作如图2,在第一次比对出结果后,透过将此封包所属连线的状态标示存储在Conntrack中,当之后封包进入防火墙后,可以查询此封包所属的连线是否已经有比对结果的标示存在,若有则直接取得该结果,如果没有则依照防火墙内的规则一条一条的比对。如果封包一直没有比对结果,我们可以设定一个门槛值,当每条连线比对超过这几个封包都没有结果后,我们就可以默认策略设定为ACCEPT或是DROP写入对应的Conntrack Entry中,避免封包比对没有比对规则还会不断的进入系统比对。

除了抛弃(DROP)与允许(ACCEPT)之外,我们增加另一额外的目的函数,称为STATE;当封包比对有结果后,可以将此结果透过STATE这个目标函数,将结果存入Conntrack[11]。

iptables t mangle I PREROUTING m statecheck -accept j ACCEPT

iptables t mangle I PREROUTING m statecheck -drop j ACCEPT

iptables t mangle I PREROUTING m layer7 l7proto msn-login j STATE --drop

如上前两条防火墙的规则,是在NF_IP_PRE_ROUTING检查点最前面放置两条防火墙规则,可以让封包进入PREROUTING后马上通过我们写的statecheck matching module来对比,去查询State Table中是否已经存有应对的状态,即图2增加的检查功能部分。而第三条规则代表msn-login不被允许,除此之外目标函数STATE需在应对Conntrack的状态标记为“drop”,即图2的Save State部分。后续同一连线包一进入Netfilter后,我们的statecheck matching module即可根据此状态将其丢弃,不需要再做其它规则的比较,即图2的Apply Action部分。

STATE目标函数除了“drop”外,还有其它函数可供使用,如“accept”、“MARK X”。

5结束语

随着网络的发展,未来会有越来越多的软件会使用P2P的方式做传输,相对的所使用的端口一定没有固定,甚至会伪装成其它的应用软件的端口,传统的只看固定端口来做网络安全的控管已经明显的不足。应用层防火墙的应用会越来越广,甚至在频宽管理的应用上都会采用第七层辨识的方式来控制,未来基于应用层的过滤方式只会越来越被广泛的应用。

参考文献

[1] The netfilter project team,“Linux Netfilter/iptables frameworks,” Nov 1999. [Online].省略/. [Accessed:Sep. 2004].

[2]L7-filter Classifier project team,“L7-filter Classifier,” May 2003. [Online]. Available:l7-filter.省略/. [Accessed: Oct.2004].

[3]Steve Suehring,Robert L. Ziegler著,何泾沙 等(译). Linux防火墙(第3版)[M].北京:机械工业出版社,2006.12

[4]赵炯. Linux内核完全剖析[M].北京:机械工业出版社,2006

作者简介

王冬霞(1983-),湖南邵阳人,东华理工大学硕士,研究方向:嵌入式系统设计及应用