一、什么是netfilter?
        Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。
netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理。
       
       通俗的说,netfilter就是在tcp/ip协议栈中放置HOOK(俗称钩子函数),数据包被协议栈处理时,遇到HOOK函数,就执行HOOK函数中的操作:数据包过滤、NAT、连接跟踪。 

       Netfilter在内核中位置如下图所示:


        从上图可以看到:netfilter主要是对数据包在网络层(ip层)的处理。

二、netfilter的架构
        IP层的五个HOOK点的位置如下图所示
     
       (1):NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点(刚刚进行完版本号,校验 和等检测), 目的地址转换在此点进行;
       
(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目前支持IPv4IPv6以及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  ;
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐