三、Netfilter/iptables包过滤器
Linux2.4内核中的Netfilter是新的用来实现防火墙的过滤器,iptables是一个管理内核包过滤的工具,它为用户配置防火墙规则提供了方便,可以加入、插入或删除核心包过滤表(链)中的规则。虽然Netfilter/iptables IP信息过滤系统被称为单个实体,但它实际上由两个组件Netfilter和iptables组成。Netfilter组件也称内核空间(KernelSpace), iptalbes被称为用户空间(UserSpace)。Netfilter位于Linux网络层和防火墙内核功能模块之间,在内核中通过Netfilter结构将防火墙对数据包的处理引入IP层中实现。防火墙代码和实现IP层的代码完全分离,从而构成不同模块。这样有利于添加新的防火墙功能模块,并且不对其它防火墙功能和IP层功能造成影响。
1.Netfilter组件
Netfilter是Linux 2.4内核的一个子系统,使得诸如数据包过滤、NAT以及网络连接跟踪技术在Linux上的实现变得非常简单,仅需用Netfilter提供的各式各样的HOOK(钩子)即可完成。HOOK是Netfilter在数据流经的各种网络协议栈的几个关键点定义的一套数据包捕捉点(每种不同的协议栈有不同的HOOK)。对于IPv6协议栈,Netfilter定义了五个关键点HOOK,如图3所示:
图3 Netfilter 框架示意图
数据包从左端进入系统,经过IP校验之后,经过第一个钩子函数NF_IP6_PRE_ROUTING进行处理,然后进入路由代码,这里将决定数据包是要转发还是发给本机。对于无法路由的数据包,路由代码将其丢弃。若数据包是发给本机的,则数据包经过钩子函数NF_IP6_LOCAL_IN处理后传递给上层协议;若该数据包应该被转发,则钩子函数NF_IP6_FORWARD将被调用。经过转发的数据包经过最后一个钩子函数NF_IP6_POST_ROUTING处理后,再传输到网络上。本地产生的数据包经过钩子函数NF_IP6_LOCAL_OUT处理后,进行路由选择处理。然后,经过NF_IP6_POST_ROUTING处理,再发送到网络上。
在HOOK函数完成了对数据包的操作后,必须返回下列预定义的Netfilter返回值中的一个,告知Netfilter对数据包进行何种处理:
NF_ACCEPT 为正常状态,链表中下一个函数继续处理该数据包。
NF_DROP 将数据包丢弃,中断处理链表。
NF_STOLEN 数据包由本函数全权处理,中断链表。
NF_QUEUE 将数据包放入处理队列,通常交由用户进程来处理。
NF_REPEAT 再次调用该钩子函数。
Netfilter的设计为内核中其它模块动态参与IP层中的数据包处理提供了途径。它在内核中建立了一个函数指针链表,称为钩子函数链表,加入到链表中的函数指针所指的函数称为钩子函数。当内核模块需要参与IP层中对数据包的处理时,通过调用Netfilter中钩子函数的注册函数,注册内核模块的数据包处理函数。Netfilter将在钩子函数链表中记录下此模块中的数据包处理函数指针。IP层在数据包处理过程中,会检查相应的钩子函数链表中是否有钩子函数被注册,如果存在注册的钩子函数,便会调用它,并且根据该函数的处理结果,决定是继续完成IP层中的后续处理过程,还是丢弃此数据包,中断数据包的传输;如果不存在注册的钩子函数,则继续完成IP层中的后续处理。当内核模块不需要参与IP层的数据包处理时,调用Netfilter钩子函数的注销函数,Netfilter从钩子函数链表中去掉此钩子函数指针,这样IP层检测不到钩子函数的存在,会继续其后续操作。
(责任编辑:adminadmin2008)