首页 > 范文大全 > 正文

一种Netfilteir防火墙过滤功能的实现

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

摘要:Netfilter防火墙是基于Linux操作系统下的具有强大的包过滤功能的防火墙,同时具有很好的扩充性。本文在Netfilter的框架内提出了对1P数据包内容过滤的实现,同时给出了字符串的多模式匹配算法、包内容过滤在核心层的实现过程和包过滤功能的使用。这种过滤是基于多模式匹配的内容过滤,具有较强的实用性。

关键词:包过滤;防火墙;多模式匹配

1 引言

防火墙为网络之间或网络对主机的访问控制、lP地址隐藏等提供了安全技术手段,使计算机网络资源免受非法侵害和入侵。Linux操作系统下的NetfiIter防火墙是一个强大的包过滤防火墙,由Rusty Russell完成Netfilter框架实现和主要功能,NetfiIter项目组成员和世界上的其他志愿者扩充了Netfilter的许多其他功能,使它的功能超过了Linux系统下的其他版本的防火墙,并且在功能上已经不输于许多商用防火墙,成为中小企业用防火墙的优先考虑对象。

Netfilter防火墙提供了数据包过滤、NAT转换、数据包的应用层处理等功能,其中包过滤的常见的匹配条件有ip头匹配条件、tcp头匹配条件等。但是随着网络攻击手段的多样化,只有这些匹配条件还远远不能满足网络访问控制和用户的需求,如出现的某些代码病毒它将恶意代码嵌入正常的HTTP请求语句中导致缓冲区溢出,又如网管对特定WEB页的内容过滤的需求等,这些都需要有新的过滤功能的实现,这就是基于数据包内容的过滤。

2 NetfiIter框架描述

本文认为Netfilter的最大贡献不在于它的功能强大而是它提供了一个通用的框架,在这种框架下Netfilter的功能很易于得到扩充。下面是对它的框架描述:

当Linux系统被设置为路由工作方式时,网络代码在以下五个检测点调用NF_HOOK,调用防火墙代码来进行防火墙处理。如图一:

这五个点分别表示为:

ONF_IP_PRE_ROUTING

1 N[_IP_LOCAL_IN

2 NF_IP_FORWARD

3 NFulP POST_ROUTING

4 NF_IP_LOCAL_OUT

数据包从左边进入系统,进行lP校验以后,数据包经过第一个检测点NF_IP_PRE_ROUTING[O]进行处理;然后就进入路由代码,决定该数据包是需要转发还是发给本机;若该数据包是发向本机的,则该数据经过检测点NF_IP_LOCAL_IN[1]处理然后传递给上层协议;若该数据包应该被转发则它被NF_IP_FORWARD[2]处理;经过转发的数据报经过NF_IP_POST_ROUTING[3]处理以后,再传输到网络上。本地产生的数据NF_IP_LOCAL_OUT[4]处理完毕后,进行路由选择处理,然后经过NF_IP_POST_ROUTING[3]处理发送到网络上。

网络代码通过函数nf_hook_slow()进行防火墙处理,该函数的输入参数包括检测点、数据包、进入接口、外出接口和该数据包被接收后的进一步处理的函数。该函数的过程很简单,就是迭代调用该检测点的防火墙注册函数,如在NF_IP_FORWARD点调用函数ipt_hook()和fw_in()(如果用户选择netfilter与ipchains和ipfwadm共存),函数的调用顺序与该检测点注册函数的优先级有关,优先级高的函数先调用。

3包过滤功能的实现及相关数据结构

包过滤功能是Netfilter框架内实现的主要功能之一,它最终调用的函数是ipt_do_table(pskb,hook,in,out,&packet_filter,NULL)。ipt_do_table的算法比较简单,描述如下:

①数据初始化,取ip头、协议头、数据长度、进入、外出接口;

②取packet_jilter表的相应的hook位置的第一条过滤规则,取用户定义链返回后的第一条规则备用;

③匹配ip头;

④如果ip头与规则匹配,迭代匹配它的扩展项(因为它的扩展项可能不止一项,如协议是tcp,可以进一步地设置tcp的连接状态为NEW,这就使得规则有了两个扩展匹配项),如果不匹配跳转到⑥;

⑤如果扩展项匹配,取得它的目标项,如果它是标准目标进行标准目标的处理,如直接返回它的目标值或进行返回目标的处理;如果它不是标准目标则迭代调用目标函数,然后返回目标;

⑥如果ip头不匹配,则取下一条规则,跳转到③。

相对于ipt_do_table()的算法而言,它的数据结构的组织略显复杂。iptabIes的标准表包括filter、mangle、nat表,用户也可以根据自己的需要添加表。表里包含了各个检测点的防火墙规则初始偏移量,然后紧接着这些偏移量是一条条的规则。具体如下:

struct ipt_table包含:表名;锁变量;表的有效检测点,如filter表的有效检测点只包含NF_IP_LOCAL_IN、NF_IP_FORWARD和NF_IP_LOCAL_OUT;提供给用户空间向核心空间传递数据时使用的数据结构struct ipt_re-place,这个数据结构的使用是在应用程序执行setsockopt()函数,要压入防火墙规则表时使用的和指向该表总体规则的一个结构指针struct ipt_table_info privateo

struct ipt_table_info包含:该规则的数目、大小;各个检测点规则的入口偏移量;用户自定义链的返回偏移量underflOW;规则入口,指明规则的基地址,entries。紧接着该结构是防火墙的规则,每条规则包括三个部分,或者说是三个structure:ipt_entry、ipt_entry_match和ipt_entry_target。ipt_entry包含了ip头的匹配信息和本条规则ipt_entry_target结构的偏移量以及下一条规则的偏移量。ipt_entry_match结构包含了扩展匹配的信息,它的使用在ipt_do_table的算法中看的很清楚,ip_entry_target结构包含了目标匹配的信息,它的使用常见ipt_do_table()。整个规则的组织形式见图二。(注:图中实线是指针,虚线是偏移量的指示。)

4 包内容过滤的实现

通过上面对Netfilter的框架的描述,我们不难看出Netfilter的框架提供了很好的扩充性。在该框架下,我们可以采用不同的方法实现包的内容过滤。

4.1 字符串的多模式匹配算法

内容过滤必将涉及到字符串匹配算法,在这些算法中B-M算法是单字符串匹配算法中效率较高的算法并且它是很多多模式匹配算法的基础,其中Sun Wu在agrep软件中所使用的mg rep多模式匹配算法是参照B-M算法思想,较其他多匹配算法效率更高的算法。但是由于它适用于文件搜索,并不完全适用于我们的防火墙过滤,所以本文对mgrep算法进行了进一步的修改使其符合我们的使用,我们称为m-fiIter-match算法。

它的算法思想借助了B-M的算法思想,那就是匹配模式和待匹配的字符串不匹配时,字符串匹配从预处理阶段提供的最大安全右移位置开始匹配。而在多模式匹配算法中有两个表:一个就是位移表等同于B-M的SHIFT表,另一个是多模式形成的HASH表,通过这两个表的结合来决定字符串的下一个匹配位置。

算法描述如下:

(1)预处理过程:包括了SHIFT表和HASH表的形成过程,在该算法中对多模式字符串先取齐,就是每个模式的预处理阶段它的长度都等于在这些模式中最小长度的那个模式的长度m。同时算法为了更有效,定义了比较单元B就是一次不是比较一个字符的长度而是比较一个比较单元B的长度,B的大小根据m的大小决定,当m等于1时比较单元为1,大多数情况下比较单元为2,当模式的数量超过400,m大于6时B为3。

因为有了比较单元,所以我们将各模式的每个比较单元通过运算映射为一个数字。模式与字符串的比较按照映射值进行比较,是这些映射值构成了SHITF表。SHITF表中的映射值x分为两种情况,一是X不在任何一个子模式中出现,此时字符串可以安全移动m-B+1个字符,SHITF表中的相应位置的值就是m-B+1:另一种情况是×在一些模式中出现了,这种情况下,我们计算出×在所有出现模式中最靠右的位置q,字符串可以安全地移动m-q的位置,SHIFT表中的相应位置的值就是m-q。这就是SHIFT表的形成过程。

另外子模式还组成了一个HASH表,这个HASH表的每一个链元素是各个子模式的m个元素进行HASH运算后构成的。举例如下:如第i个子模式,它进行HASH运算后的值为q,则在形成HASH表后子模式按下列方式加入HASH表。

如果有和第i个子模式相同的HASH值,第j个模式,则在q位置的链表头插入j的标识。

(2)匹配过程:它分为两种情况,第一种情况是比较单元B大于等于2。第二种情况是比较单元等于1。

第一种情况的处理过程:

①计算正文B个单元的hash值,查找shift表中该位置的值;

②如果该shift值等于O,说明可能存在匹配项,计算它的m个长度的hash值q,并得到与q相对应的链表元素,该元素指明了是否有子模式i与正文的m长度的hash值相等;

③如果存在这样的子模式,则判断该模式是否已经进行过匹配,如果没有进行过匹配则匹配该子模式,如果匹配成功则判断是否为“或”匹配,如果是则返回匹配成功,如果是“与”匹配则判断是否所有项匹配完毕,如果匹配完毕则返回匹配成功,否则将该子模式打上匹配成功标志,接着进行匹配;

④如果不存在这样的子模式,则移动正文指针进行下一字符的匹配;

⑤如果shift值不等于0,则移动该shift值的位置进行下一次匹配;

⑥如果正文匹配完毕,但未找到匹配项或在‘与’匹配条件的要求下,匹配项的数目小于子模式的数目则不成功返回。

4.2 包内容过滤在核心层的实现

iD包的内容过滤在核心层的实现如下:

(1)注册包过滤组件,在该组件中指明组件名称、匹配主函数、检查项函数等;

(2)匹配主函数的实现步骤:

①对ip包进行组包;

②取得包长、包头信息;

③对该包按m-filter-match算法进行匹配:

④返回匹配结果。

(3)检查项函数的内容就是检查从应用层传下来的参数的正确性。

(4)最后一项功能就是注销包过滤函数。

4.3 包内容过滤在应用层的实现

它在应用层的实现包括:注册包过滤组件,组件包括组件名、初始化函数名、帮助函数名、检查函数名、分离参数函数名、打印函数名等。

各个函数功能如函数名,它们的主要功能就是将包过滤功能的参数进行分解、打印、保存检查等等这些操作。

4.4 包过滤功能的使用

包过滤功能在Netfilter里属于扩展功能,它可以单独使用也可以和其他选项共同使用。举例如下:

iptables-A FORWARD-mstrinq string“暴力;”-jDROP

上述命令是对流经FORWARD点的ip的内容中出现“”或“暴力”的内容丢弃。

iptables-A FORWARD-mstring-string-jDROP

上述命令是对流经FORWARD点的ip的内容中出现“”并且出现“暴力”的内容丢弃。

-mstring选项还可以和其他选项配合使用,如下例所示:

iptables-AFORWARD-ptcp-dport80-mstring-string“暴力,”-jDROP

5 结论

本文分析了在Netfilter的框架内如何添加匹配模块,使防火墙有了多模式匹配内容过滤功能。在进行粗略试验的前提下,当配置一条这样的匹配规则,取6个子模式的“或”进行匹配时对包过滤的性能影响较小。但是它毕竟是对ip包的所有内容进行查找匹配,所以当配置达到20条命令,每个命令有6个子模式的“与”时包过滤防火墙的性能将大大下降。但是这种下降的频率要远远小于配置单模式匹配时相同匹配内容的下降频率。这是由Netfilter结构和匹配算法决定的。匹配扩展模块的实现不仅仅可以作为包过滤的一个组件使用,也可以作为入侵检测组件来使用,如匹配入侵特征字符,同时将目标设为审计可将审计的内容作为入侵检测的输入,来得出入侵检测结果。