netfilter介绍
通俗的说,netfilter就是在tcp/ip协议栈中放置HOOK(俗称钩子函数),数据包被协议栈处理时,遇到HOOK函数,就执行HOOK函数中的操作:数据包过滤、NAT、连接跟踪。
Netfilter在内核中位置如下图所示:
从上图可以看到:netfilter主要是对数据包在网络层(ip层)的处理。
二、netfilter的架构IP层的五个HOOK点的位置如下图所示
(2):NF_IP_LOCAL_IN:经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行;
(3):NF_IP_FORWARD:要转发的包通过此检测点,FORWARD包过滤在此点进行;
(4):NF_IP_LOCAL_OUT:本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行; 对于本机发出的数据包,源地址转换在次点执行
(5):NF_IP_POST_ROUTING:所有马上便要通过 网络设备 出去的包通过此检测点,内置的源地址转换 功能(包括地址伪装)在此点进行。
在每个关键点上,有很多已经按照优先级预先注册了的回调函数埋伏在这些关键点,形成了一条链。对于每个到来的数据包会依次被那些回调函数安检一下再视情况是将其放行,丢弃还是怎么滴。但是无论如何,这些回调函数最后必须向Netfilter报告一下该数据包的处理结果。每个钩子函数最后必须向Netfilter框架返回下列几个值其中之一:
NF_ACCEPT 继续正常传输数据报。这个返回值告诉 Netfilter:到目前为止,该数据包还是被接受的并且该数据包应当被递交到网络协议栈的下一个阶段。
NF_DROP 丢弃该数据报,不再传输。
NF_STOLEN 模块接管该数据报,告诉Netfilter“忘掉”该数据报。该回调函数将从此开始对数据包的处理,并且Netfilter应当放弃对该数据包做任何的处理。但是,这并不意味着该数据包的资源已经被释放。这个数据包以及它独自的sk_buff数据结构仍然有效,只是回调函数从Netfilter 获取了该数据包的所有权。
NF_QUEUE 对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)
NF_REPEAT 再次调用该回调函数,应当谨慎使用这个值,以免造成死循环。
Linux 2.6版内核的Netfilter目前支持IPv4、IPv6以及DECnet等协议栈,这里我们主要研究IPv4协议。关于协议类型,hook点,hook函数,优先级,通过下面这个图给大家做个详细展示:
对于每种类型的协议,数据包都会依次按照hook点的方向进行传输,每个hook点上Netfilter又按照优先级挂了很多hook函数。这些hook函数就是用来处理数据包用的。
三、netfilter和iptables的关系
netfilter是linux内核tcp/ip协议栈处理数据包的一个框架,iptables是应用层的一个应用程序 ,netfilter和iptables一起组成了linux防火墙。
参考资料:
1、 http://blog.chinaunix.net/uid-23069658-id-3160506.html ;
更多推荐
所有评论(0)