高祥斌
[摘要]防火墙技术在保护网络安全方面的作用越来越明显。相比较window,Linux有更好的网络性能,因此基于Linux的Netfilter技术的使用越来越广泛。先分析Netfilter技术的特点,然后从两个方面对其进行详细分析:Netfilter的工作原理和Netfilter对数据包的处理过程,最后简要分析Netfilter应用开发及其优越性。
[关键词]Netfilter数据包钩子函数
中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0710041-01
网络在经济和生活的各个领域正在迅速普及,众多的企业、组织、政府部门与机构都在组建和发展自己的网络,并连接到Internet上。为了保护组织资源不泄露,不受到病毒侵袭,黑客攻击,网络安全越来越受到人们的重视。Linux良好的网络性能和开放源代码的特点,使越来越多的用户选择了Linux作为其防火墙的操作平台,本文正是针对当前流行的Linux中采用的Netfilter技术进行相关分析。
一、Netfilter的技术特点
Netfilter技术对ipchains进行了改进:它摒弃了ipchains不区分数据包是单纯的进入包、外出包或中转包的做法,同时为每种网络协议(IPv4、IPv6等)定义一套钩子函数,这些钩子函数在数据包流过协议栈的几个关键点被调用;Netfilter内核中,任何模块可以对每种协议的一个或多个钩子进行注册,实现挂载,这样当某个数据包被传递给Netfilter框架时,内核能检测是否有任何模块对某种协议和钩子函数进行了注册[1]。如果是注册了,这些模块就调用注册时使用的回调函数对数据包进行检查或修改,然后决定是丢弃还是接受数据包;Netfilter位于Linux的IP层,它的防火墙的代码与实现IP层的代码完全分离,从而构成不同的模块,使网络层和防火墙在结构上很清晰,防火墙代码修改和功能扩充更加容易。
二、Netfilter技术分析
Netfilter是Linux内核实现数据包过滤、网络地址转换(NAT)、数据包处理等的功能框架。相对于原来的ipchains防火墙,Netfilter防火墙以更好的结构重新构造,并实现了许多新功能。
(一)Netfilter的工作原理。Netfilter的设计为Linux内核中其它模块动态参与IP层中的数据包处理提供了途径。其实现方法是:
1. 在内核中建立了一个函数指针链表,即钩子函数链表,加入到链表中的函数指针所指的函数称为钩子函数(Hook Function)。当内核模块需要参与IP层中对数据包的处理时,通过调用Netfilter中钩子函数的注册函数,注册内核模块的数据包处理函数,Netfilter将在钩子函数链表中记录下此模块中的数据包处理函数指针。
2. IP层在数据包处理过程中,会检查相应的钩子函数链表中是否有钩子函数被注册:如果存在注册的钩子函数,便会调用此函数,并且根据该函数的处理结果,决定是继续完成IP层中的后续处理过程,还是丢弃此数据包,中断数据包的传输;如果不存在注册的钩子函数,则继续完成IP层中的后续处理。
3. 当内核模块不需要参与IP层的数据包处理时,调用Netfilter钩
子注销函数,Netfilter从钩子函数链表中去掉此钩子函数指针,这样IP层检测不到钩子函数的存在,会继续其后续操作。
钩子和挂载函数是Netfilter架构中的核心部分。Linux内核的Netfil
Ter框架为IPv4协议实现了五个钩子函数挂载点,分别为:NF_IP_PRE_ROUT
ING,NF_IP_LOCAL_IN,NF_IP_FORWARD,NF_IP_POST_ROUTING,NF_IP_LOC
AL_OUT。当数据包流经IPv4协议栈的五个挂载点时,内核就会调用在挂载点注册的回调函数对数据包进行处理。Netfilter挂载点回调函数的调用代码是通过NF_HOOK宏嵌入在网络协议栈的代码之中的,其定义在include/li
nux/netfilter.h中。
(二)Netfilter对数据包的处理过程。基于Linux的Netfilter防火墙设计中,其对数据包的处理过程如图1所示:
图1Netfilter中数据包的处理过程
图1中共有5个钩子函数(即HOOK),数据包从左边进入系统,进行IP校验以后,数据包经过第一个钩子函数链表NF_IP_PRE_ROUTING进行处理;然后就进入路由代码,决定该数据包是需要转发还是发给本机;若该数据包是发给本机的,则经过钩子函数链表NF_IP_LOCAL_IN处理后传递给上层协议;若该数据包应该被转发,则它被NF_IP_FORWARD处理;转发的数据包经过最后一个钩子函数链表NF_IP_POST_ROUTING处理以后,再传输到网络上。本地产生的数据包经过钩子函数链表NF_IP_LOCAL_OUT处理后,进行路由选择处理,然后经过NF_IP_POST_ROUTING处理并发送到网络上。另外,还可以使用内核模块在Netfilter的五个钩子函数链表上挂载一个或者多个这样的钩子函数。这样当有数据包进入钩子点处理时,将查找被挂载的函数,然后调用这些函数对数据包进行处理。
(三)Netfilter应用和开发。一般而言基于Netfilter的应用开发有两种[2]:从用户空间的角度进行开发,这种开发主要是如何充分发挥内核所提供的防火墙功能,它不能为防火墙增加基本功能模块;另外就是从内核空间的角度进行开发。这种方法不仅能充分发挥现有功能,而且还能添加新的功能模块。
Netfilter具有良好的框架和拓展性,这使得开发人员无需过多涉及内核协议栈的改动。开发基于Netfilter框架的内核模块一般有一下几个步骤:分析功能需求,确定要在哪几个钩子挂载点处注册钩子函数;按照钩子函数的接口规范编写钩子函数;在挂载点处注册钩子函数。
参考文献:
[1]邹思轶,嵌入式Linux设计与应用[M].北京:清华大学出版社,2002.
[2]姚晓宇、赵晨,Linux内核防火墙Netfilter实现与应用研究[J].计算机工程,2003(5).