登录模块加载中...
会员投稿 投稿指南 今天是:
打印本页 | 关闭窗口 | 双击滚屏 您的位置首页>>网页制作学习园地>>服务器类>>防火墙和路由>>Linux2.4中netfilter框架实现
Linux2.4中netfilter框架实现
来源: ‖ 作者: ‖ 点击: ‖ 时间:08-03-03 09:54:06 ‖ 【 】‖ 我要投稿

Netfilter是linux2.4内核实现数据包过滤/数据包处理/NAT等的功能框架。该文讨论了linux 2.4内核的netfilter功能框架,还对基于netfilter框架上的包过滤,NAT和数据包处理(packet mangling)进行了讨论。阅读本文需要了解2.2内核中ipchains的原理和使用方法作为预备知识,若你没有这方面的知识,请阅读IPCHAINS-HOWTO。

第一部分:Netfilter基础和概念

一、什么是Netfilter

    Netfilter比以前任何一版Linux内核的防火墙子系统都要完善强大。Netfilter提供了一个抽象、通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统。因此不要在2.4中期望讨论诸如"如何在2.4中架设一个防火墙或者伪装网关"这样的话题,这些只是Netfilter功能的一部分。Netfilter框架包含以下三部分:

1 为每种网络协议(IPv4、IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数),这些钩子函数在数据报流过协议栈的几个关键点被调用。在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架。

2 内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何模块对该协议和钩子函数进行了注册。若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查(可能还会修改)该数据包、丢弃该数据包及指示netfilter将该数据包传入用户空间的队列。

3 那些排队的数据包是被传递给用户空间的异步地进行处理。一个用户进程能检查数据包,修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数中注入到内核中。

    所有的包过滤/NAT等等都基于该框架。内核网络代码中不再有到处都是的、混乱的修改数据包的代码了。当前netfilter框架在IPv4、IPv6及Decnet网络栈中被实现。

二、为什么需要Netfilter?

    其实这个问题也可以变为ipchains有什么缺点导致被抛弃?下面只是其中的几个原因:

    因为基于2.2内核的ipchains没有提供传递数据包到用户空间的框架,所以任何需要对数据包进行处理的代码都必须运行在内核空间,而内核编程却非常复杂,而且只能用C语言实现,并且容易出现错误并对内核稳定性造成威胁。


    透明代理实现非常复杂,必须查看每个数据包来判断是否有专门处理该地址的socket。网络栈代码中在11个文件中共出现了34个"#ifdef"条件编译。


    创建一个不依赖于接口地址的数据报过滤规则是不可能实现的。我们必须利用本地接口地址来判断数据报是本地发出、还是发给本地的或是转发的。转发链只有输出接口的信息,因此管理员必需考虑数据报的源。


    伪装和数据包过滤都在同一个模块内实现,导致防火墙代码过于复杂。


    IPchains代码即不模块化又不易于扩展(例如对mac地址的过滤)

三、Netfilter的作者

    Netfilter框架的概念的提出及主要实现是由Rusty Russell完成的,他是ipchains的合作完成者及当前linux内核IP防火墙的维护者。还有Marc Boucher、James Morris、Harald Welte等都参与了Netfilter项目。

四、Netfilter在IPv4中的结构

    一个数据包按照如下图所示的过程通过Netfilter系统:


--->[1]--->[ROUTE]--->[3]--->[4]--->
| ^
local| |
| [ROUTE]
v |
[2] [5]
| ^
| |
v |

从图中可以看到IPv4一共有5个钩子函数,分别为:

1 NF_IP_PRE_ROUTING
2 NF_IP_LOCAL_IN
3 NF_IP_FORWARD
4 NF_IP_POST_ROUTING
5 NF_IP

|<< << < 1 2 3 4 > >> >>|
加入收藏:  加入收藏夹  | 发送给好友:  发送给好友
责任编辑:admin
相关文章列表
无相关新闻
请文明参与讨论,禁止漫骂攻击。  
网友评论