本来是不打算写这种基础性的东西的,但是有很多同志经常问我(有同事也有网友)。所以就写一下吧,这个是理解LINUX内核网络子系统的基础,ip conntrack等都是依赖这些基础的。好的,闲话不多说了。来正文。
其实netfilter就是依靠一个全局的二维数组nf_hooks[][].可以把这个玩意看成一个8*32的矩阵。矩阵的每个成员就是一个双向链表节点。看看,又是双向链表,内核中双向链表的地位真的太重要了。以双向链表做骨架串起nf_hook_ops这个结构体。然后在运行时在挂HOOK的地方调用nf_iterate这个函数(叫的高深一点就叫迭代器,面试的时候我喜欢叫迭代器装B吓唬人^_^)依次从链表上取下nf_hook_ops中注册的函数并执行。下面先给出一个图。

然后HOOKS分别挂在五个地方,这五个地方分别对应着nf_hooks[NPROTO][NF_MAX_HOOKS]中NF_MAX_HOOKS的成员。
在内核中用宏来实现的(其实用一个枚举来实现会更优雅一些):
/* IP Hooks */
/* After promisc drops, checksum checks. */
#define NF_IP_PRE_ROUTING0
/* If the packet is destined for this box. */
#define NF_IP_LOCAL_IN1
/* If the packet is destined for another interface. */
#define NF_IP_FORWARD2
/* Packets coming from a local process. */
#define NF_IP_LOCAL_OUT3
/* Packets about to hit the wire. */
#define NF_IP_POST_ROUTING4
#define NF_IP_NUMHOOKS5
这就是整个netfilter的基础骨架,所有IP包都是经过这五个钩子来处理的。
下面给出整体的框图:

接下来最后一个细节了:
那就是nf_hook_ops函数返回值的潜规则:
#define NF_DROP 0
#define NF_ACCEPT 1
#define NF_STOLEN 2
#define NF_QUEUE 3
#define NF_REPEAT 4
#define NF_STOP 5
#define NF_MAX_VERDICT NF_STOP
netfilter框架就认这几个返回值了。如果不按照规矩来的话,出了问题就别怪人家了。就像你去商店买东西一样,你如果拿人民币出来,人家愿意接受,你拿美元,如果老板是个行家也会接受,你如果拿冥钞的话,老板会发火的,所以你首先要摸清楚老板的脾气,不要拿冥钞,这个道理是很浅显的,所以同样,按照人家的规矩来给返回值也是很浅显的,照做就行了。
下面介绍一下这几个返回值的意思:
NF_DROP 就是把这个包扔掉,不要了,对应的SKB也会被释放。
NF_ACCEPT 这个包是我想要的,留下,继续往下跑。
NF_STOLEN 不做任何处理,SKB也不会释放,所以同志们要注意了,如果自已要玩高级点的一定要摸清楚再玩,半生不熟的就玩的话很容易出问题的。
NF_QUEUE 扔进SKB的队列里面,接下来就是往用户空间扔啦。
NF_STOP 这个和NF_ACCEPT的意义是一致的,但有一点区别,NF_ACCEPT接收到包后会继续往后面扔,就是会往下一个HOOK点扔,但NF_STOP就不会继续跑后面的HOOK点了。
就这么多了。很简单吧。
分享到:
相关推荐
iptables/netfilter框架分析的图片说明,详细的解释iptables/netfilter的工作原理,用于学习iptables/netfilter十分有用。
Linux协议栈,Netfilter框架分析文档,Linux内核中进行数据包过滤、连接跟踪、地址转换等的主要实现框架。
### Linux Netfilter框架详解 #### 一、Netfilter框架概览 Netfilter是Linux内核中的一个核心组件,主要用于实现数据包过滤、网络地址转换(NAT)以及数据包处理等功能。它为开发者提供了一个高度灵活和可扩展的...
很好的Netfilter分析,适合初学者...
_Linux网络安全架构Netfilter的分析和探讨 _Linux网络安全架构Netfilter的分析和探讨
Netfilter源代码分析详解 一、Netfilter/IPTables 框架简介 Netfilter/IPTables 是 Linux 防火墙机制的新一代解决方案,继承了 IPfwadm 和 IPchains 的优点,并具有良好的可扩充性。Netfilter 采用模块化设计,...
【基于Linux内核Netfilter框架的P2P管理】 P2P(Peer-to-Peer)技术是一种分布式网络架构,允许网络中的每个节点既是客户端也是服务器,直接与其他节点交互,共享资源和服务。这种技术广泛应用于文件共享、流媒体、...
主要对netfilter框架的原理和源码进行讲解,对于netfilter、iptables、conntrack、nat直接如何配合,进行了详细的图标绘制,源码分析,对于个人理解netfilter框架有很好的提高
通过netfilter框架,开发人员能够轻松地扩展网络服务而无需重启内核,这极大地提高了系统的灵活性和安全性。 #### 二、netfilter框架详解 ##### 1.1 netfilter框架结构 netfilter提供了一个高度抽象且通用化的...
要将自定义的钩子函数注册到Netfilter框架中,开发者需要定义一个`nf_hook_ops`结构体,该结构体包含了钩子函数的指针、协议族类型、钩子点标识以及优先级。然后,调用`nf_register_hook()`函数将这个结构体添加到`...
【描述】:本文探讨了在Linux操作系统中,利用Netfilter框架进行内核态网络流量分析的技术。通过内核级的流量采集和分析,实现了对局域网内所有数据包的监控,并对TCP连接进行了状态检测。 【标签】:Linux操作系统、...
`NF_HOOK`宏定义于`include/linux/netfilter.h`文件中,它是Netfilter框架中的关键组成部分之一。这个宏的主要作用是在特定的点上触发Netfilter的hook函数。 在配置`CONFIG_NETFILTER_DEBUG`开启的情况下,`NF_HOOK...
介绍了Linux内核防火墙的发展,对2.4.x内核中的Netfilter框架的流程和IPv4协议栈中Netfilter的实现进行了分析,通过一个内核防火墙模块实例介绍了基于Netfilter框架下的内核防火墙设计方法,对Netfilter框架下的防火墙...
这个插件集成了对Netfilter框架的支持,Netfilter是Linux内核中的一个模块,用于处理网络数据包,它允许用户在数据包经过网络栈的不同阶段进行操作,包括防火墙规则、NAT转换等。 首先,Ja-Netfilter-All提供了一套...
ja-netfilter-all是一个针对Java应用程序的网络过滤框架,它提供了对网络数据包的全面控制和解码能力。在深入探讨ja-netfilter-all之前,我们首先需要理解什么是网络过滤和解码器。 网络过滤通常指的是在网络通信中...
1. **理解Netfilter架构**:在编写任何Netfilter模块之前,首先需要了解整个Netfilter框架的工作原理,包括数据包的流向、不同钩子点的作用以及如何注册模块等。 2. **模块初始化与卸载**:每个模块都需要实现初始化...
对Linux防火墙的Netfilter框架作了简单分析
当前,网络攻击技术和攻击工具表现出...netfilter是Linux内核中用于扩展各种网络服务的结构化底层框架,新的响应特性加入到内核中并不需要重新启动内核。netfilter模块的易扩性,为实现动态安全策略提供了很好的基础。