Linux 2.4中netfilter框架实现

论坛 期权论坛 脚本     
niminba   2021-5-23 04:23   1047   0

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_LOCAL_OUT

数据报从左边进入系统,进行IP校验以后,数据报经过第一个钩子函数NF_IP_PRE_ROUTING[1]进行处理;然后就进入路由代码,其决定该数据包是需要转发还是发给本机的;若该数据包是发被本机的,则该数据经过钩子函数NF_IP_LOCAL_IN[2]处理以后然后传递给上层协议;若该数据包应该被转发则它被NF_IP_FORWARD[3]处理;经过转发的数据报经过最后一个钩子函数NF_IP_POST_ROUTING[4]处理以后,再传输到网络上。

本地产生的数据经过钩子函数NF_IP_LOCAL_OUT [5]处理可以后,进行路由选择处理,然后经过NF_IP_POST_ROUTING[4]处理以后发送到网络上。

五、Netfilter基础

从上面关于IPv4的netfilter的例子讨论,可以看到钩子函数是如何被激活的。

内核模块可以对一个或多个这样的钩子函数进行注册挂接,并且在数据报经过这些钩子函数时被调用,从而模块可以修改这些数据报,并向netfilter返回如下值:

NF_ACCEPT 继续正常传输数据报
NF_DROP 丢弃该数据报,不再传输
NF_STOLEN 模块接管该数据报,不要继续传输该数据报
NF_QUEUE 对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)
NF_REPEAT 再次调用~yIhhRiXXJhtNDNzNX#Nh[^XXJiXXZ{n{Njh^yNi[hh^Xn8.h[^XXXfFX{i[hkX[iyJ8"#D^XX[^yJiXXZnhKyNi[hhRyKy{;{>ZnhNxnhXh#dBKXK#D$4TB[K[{.{yN;^yNi[hhR#r[zyNi[hhR#DTBY([{.{yNiKZX[>yNi[hh^Zh.KK4Ihi[h#>XX[^yJiXXZKNyED~jNX "##8F&>yNi[hh^y~XKh[R##r[nXXNi[hh^K .{76r#nXXNi[h.yJyJh~z{NyF~#T5BK^K^K.[i[hh^{n{X^KKX{yNIh#%$.hkY(NYYK^YkKhhR##:XbXyJF&>Y(WFfW.##K^XNXh^j K^K^iJyDX*z{KK8^8$fW.XiJKKzxN8.KNXXnKkY(D8"##Yi[hh^{${nKi[hh^yNkYY8.K8^ixjE48"##DYi[hh^{4dDi{nKi[hh^yNYY8.z>yn;N8"##8F&>yDy~XKh[R##B#hi[hXyNkYY8"####F&24FW&6R2###5TU$DR#K~iXhYYyNhXhE4KKNniijiyNyhK.[yJxkK^YDYYK8^8"####F&25TU$DR#B#i[hh^yNyNYYiU$*Z;HNynyNhh^XXi{n8.YjNZHNyn[yN;NyNYY8"####F&2$U$DF7F2F7GWF###D$T5B# i[hh^KyNKiY[nyNYYKKhi[hh^yNhYh8^Xk^ZZKj ~8"##'##F&2$U$$TD$T5BF'B3#WFF7G##:XbXyJF&>Y(WFfW.i[hh^ZHNyb6WB##^hKnKi[hh^YNKZjNX Nikk9^8"##8(ZhXZHNynyNy~h[R##$#&ZjNX .hKK&ZjNX &&K^K^iyJh~ZyNi[hh^yNj~XinXi[Ni[YNXh^yNKKX 8. JKKnyZ^yNzΘ yBYyJh~z{NyNnhYZN[nhh^hKY:KzK8"##F&2R$U$$6WB&F7##2#hh^yDZKNyED~j .^[.yJYDNi[hh^>[nXyKKXiyJZHNyN8"##F&2R$U$DWBF7G76##N:Xbh^XyJh~z{B##[{.{Ki{nX YKKW.xNX;i[hh^;*hXyJh~z{NX.Z^yNhXh^j jYiZyBVR8"##hhRXh[hh^yNXF[hZh&&Y(>YY 6N*X{yJh~z{N^;hh^KKZHNyn8.ZHNyn{>iK^YJh~X[nhh^xkk:XZ^Xh^j hn^KKZhh^yNy~XKZh.K.[z8"##ifW.yNKKX[>Ji~XZHyNi[hh^i88.KxnXh^j z{NyNZH[n8.yJh~z{NyNi[hh^i8;>yN.yJW.hyNz{K&yN[>i[X##.>ih~x'##f2F&fW"#Gr6rV6R6vW2##RfW"g&v"#GrVrW'2fW"#6VFF##"6WBfW&#GFfW"&W2rV&VFW2WBW&W##"#GFfW"&W2rV&VFW2W##FfW"6#GFfW"&W2rV&VFW2fW"6W##X{ZHN
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP