linux的netfilter(netfilter框架)

这篇文章给大家聊聊关于linux的netfilter,以及netfilter框架对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

关于netfilter的使用

Netfilter是 Linux内核的数据包处理框架,设计初衷是为了改进之前的 ipchains和 ipfwadm数据包处理框架。本文将详细介绍 Netfilter的构成、iptables/ebtables的工作原理、以及如何使用这些工具进行网络策略的配置。

Netfilter框架包含三个主要部分:Netfilter hook API、内核防火墙子模块、用户态配置工具/应用程序。其设计遵循高内聚、低耦合的原则,使得各个组件独立且易于管理。

数据包在 Netfilter框架中经过了详细的处理路径。当数据包进入协议栈,会触发一系列的 hook点,由注册在这些 hook点上的处理函数执行相应的操作。这些操作包括过滤、网络地址转换、修改 IP头、以及与连接状态相关的操作。

iptables是用于配置 Netfilter的工具,它通过 table、chains、rules三个部分组织规则。每种 table服务于特定的网络策略,例如 filter table用于过滤数据包,nat table实现网络地址转换,mangle table修改 IP头等。

在 iptables中,rules被组织成 chain,chain决定了规则的执行顺序。例如,filter table中的 INPUT、FORWARD、OUTPUT链分别处理到达、通过、离开主机的数据包。每个 chain内的规则按照优先级顺序执行,直到数据包被匹配或处理完毕。

Netfilter与 ebtables的区别在于作用层次不同:Netfilter主要处理网络层(L3)的数据包,而 ebtables则专注于链路层(L2)的数据包过滤。ebtables提供了更底层的控制,用于实现 VLAN ID的过滤等链路层特性。

ebtables的配置同样由表、链、规则组成,但其主要目标是针对二层以太网帧进行过滤,无法直接处理 IP数据包。为了解决这一问题,Linux内核引入了 bridge-netfilter(br-nf),使得 ebtables能够在链路层 Bridge中与 iptables集成,实现 IP数据包的过滤,这在 OpenStack中用于实现安全组功能。

总的来说,Netfilter和其工具(如 iptables和 ebtables)为网络管理员提供了强大的能力,用于定制和控制数据包的流向。通过合理配置,可以实现复杂的网络策略,增强系统的安全性与灵活性。

洞悉linux下的Netfilter&iptables:什么是Netfilter

Netfilter是什么?Netfilter是Linux 2.4.x版本内核引入的一个子系统,它作为一个通用的、抽象的框架,提供了一整套的hook函数管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为可能。

Netfilter在内核中的位置如图所示,直观地展示了用户空间的iptables和内核空间基于Netfilter的ip_tables模块之间的关系及其通信方式,以及Netfilter在其中所扮演的角色。Netfilter通过将协议栈的五个关键点A、B、C、D和E重新命名,使得数据包的处理过程更为明确。

在每个关键点上,预先注册了按照优先级排列的回调函数,形成了一条链。对于每个到来的数据包,会依次经过这些回调函数的“处理”,决定是放行、丢弃还是其他操作。无论如何,每个回调函数最后必须向Netfilter报告数据包的状态。

Netfilter通过NF_HOOK宏在协议栈内部切入到Netfilter框架中,允许开发者在关键点上注册回调函数,实现对数据包的定制化处理。在2.6版本的内核中,NF_HOOK宏的定义更为灵活。

Netfilter使用一个二维的结构体数组nf_hooks来存储不同协议栈钩子点的回调处理函数,该数组的行数为32,表示目前内核支持的最大协议簇,列数为8,表示挂载点的数量。通过这个数组,可以为特定的协议族注册钩子函数。

例如,对于TCP/IP协议族,其钩子函数挂载点为nf_hooks[2][0]。根据内核流程,IP报文会首先传到Netfilter的NF_IP_PRE_ROUTING过滤点,检查该点是否已注册有用于处理数据包的钩子函数。如果有,则逐个遍历该过滤点下的钩子函数,根据返回值决定数据包的后续处理方式。

经过路由抉择后,需要本机转发的报文会交由ip_forward函数处理,该函数从NF_IP_FOWARD过滤点切入到Netfilter框架。对于发给本机的数据包,会先检测nf_hooks[2][1]过滤点,判断是否有相关回调处理函数。对于从本机发出的报文,则会先过滤nf_hooks[2][3]过滤点。

Netfilter框架的HOOK机制可以总结为:在数据包流经内核协议栈的整个过程中,在已预定义的关键点上(如PRE_ROUTING、LOCAL_IN、FORWARD、LOCAL_OUT和POST_ROUTING)检查是否注册有钩子函数。如果没有,则继续走协议栈;如果有,则调用nf_hook_slow函数,进一步调用注册在该过滤点下的钩子函数,并根据其返回值决定后续操作。

深入理解 netfilter 和 iptables

深入理解 netfilter和 iptables

netfilter与 iptables是 Linux内核中用于网络数据包处理的框架与工具。netfilter使用户空间应用程序能够注册内核网络栈在数据包处理过程中的规则,实现高效的网络转发和过滤。许多常见的主机防火墙和 Kubernetes的 Service转发都是通过 iptables实现的。

netfilter的定义是 Linux内核中的一个网络数据包处理框架。理解其工作方式需要对数据包在内核中的处理路径有基本的认识。数据包的内核之旅主要分为多个层级,以接收一个 IPv4的 tcp数据包为例,数据包会在内核网络栈的特定位置触发对应的 hook。

netfilter的关键组成部分是 netfilter hooks,这些 hooks在不同协议(如 IPv4、IPv6或 ARP)的数据包处理路径上的预设位置触发。每个 hook在内核网络栈中对应特定的触发点位置,且有固定的代码调用方式。

netfilter的另一组成部分是 hook的回调函数。内核网络栈通过 hook调用回调函数来处理数据包,同一 hook可以注册多个回调函数,并通过注册时指定的优先级参数来确定回调函数的执行顺序。

iptables基于内核的 netfilter提供的 hook回调函数机制,由 Rusty Russell开发,用于在用户空间管理应用于数据包的自定义规则。iptables分为两部分:内核空间模块 xt_table的初始化和 ipt_do_table函数的执行。

在 iptables中,不同的规则表(如 raw、filter、nat和 mangle)在特定的 hook触发点注册回调函数,并以固定的相对顺序执行。ipt_do_table函数接收 skb、hook和 xt_table参数,对 skb执行规则集,并返回 netfilter向量作为回调函数的返回值。

每个 iptables规则由三部分组成,包括 ipt_entry结构体,用于表示规则集并执行检查。在 ipt_do_table函数中,规则集在内存中的表示方式是全量替换,允许用户空间以原子操作添加/删除规则,但存在更新时延问题,尤其是当规则数量较大时。

用户空间的 iptables命令行提供了读取指定表的数据、添加新规则等功能。此外,netfilter还包括内置的 conntrack模块,用于连接跟踪、提供更进阶的网络过滤功能,如基于连接状态过滤和地址转换等。

阅读剩余
THE END