云服务器

系统防火墙认识之关于Netfilter和iptables工具的简介

2020-07-09 11:17:19 51

Netfilter概述

 

Netfilter 是Linux内核中进行数据包过滤、连接跟踪、地址转换等的主要实现框架。当我们希望过滤特定的数据包或者需要修改数据包的内容再发送出去,这些动作主要都在netfilter中完成。

 

iptables工具就是用户空间和内核的Netfilter模块通信的手段,iptables命令提供很多选项来实现过滤数据包的各种操作,所以,我们在定义数据包过滤规则时,并不需要去直接修改内核中的netfilter模块,后面会讲到iptables命令如何作用于内核中的netfilter。

 

其实iptables服务和firewalld服务都不是真正的防火墙,只是用来定义防火墙规则功能的管理工具,将定义好的规则交由内核中的netfilter(网络过滤器来读取)从而实现真正的防火墙功能。

 

Netfilter的实质就是定义一系列的hook点(挂钩),每个hook点上可以挂载多个hook函数,hook函数中就实现了我们要对数据包的内容做怎样的修改、以及要将数据包放行还是过滤掉。数据包进入netfilter框架后,实际上就是依次经过所有hook函数的处理,数据包的命运就掌握在这些hook函数的手里。

 

这里需要指出:因为Netfilter与IP协议栈是无缝契合的,所以如果你要是有协议栈方面的基础,在阅读本文时一定会感觉轻车熟路。

 

 

什么是Netfilter?

 

为了说明这个问题,首先看一个网络通信的基本模型:

 

在数据的发送过程中,从上至下依次是添加包头的过程,每到达一层数据就被会加上该层的头部;与此同时,接受数据方就是个去掉包头的过程,从网卡收上包来之后,在往协议栈的上层传递过程中依次剥去每层的头部,最终到达用户那儿的就是裸数据。
那么,“栈”模式底层机制基本就是像下面这个样子:

 

对于收到的每个数据包,都从“A”点进来,经过路由判决,如果是发送给本机的就经过“B”点,然后往协议栈的上层继续传递;否则,如果该数据包的目的地是不本机,那么就经过“C”点,然后顺着“E”点将该包转发出去。

 

对于发送的每个数据包,首先也有一个路由判决,以确定该包是从哪个接口出去,然后经过“D”点,最后也是顺着“E”点将该包发送出去。

 

协议栈那五个关键点A,B,C,D和E就是我们Netfilter大展拳脚的地方了。

 

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

 

这幅图,很直观的反应了用户空间的iptables和内核空间的基于Netfilter的ip_tables模块之间的关系和其通讯方式,以及Netfilter在这其中所扮演的角色。

 

回到前面讨论的关于协议栈那五个关键点“ABCDE”上来。Netfilter在netfilter_ipv4.h中将这个五个点重新命了个名,如下图所示:

 

在每个关键点上,有很多已经按照优先级预先注册了的回调函数(有人喜欢把这些函数称为“钩子函数”,说的是同一个东西)设置在这些关键点上,形成一条链。对于每个到来的数据包会依次被这些回调函数过一遍再视情况是将其放行,丢弃还是其他操作。但无论如何,这些回调函数最后必须向Netfilter报告一下该数据包的死活情况,因为毕竟每个数据包都是Netfilter从别的协议栈那儿借调过来给回调函数操作的,是将数据包放行,丢弃还是其他操作都是要有回复的。每个钩子函数最后必须向Netfilter框架返回下列几个值其中之一:

 

1、NF_ACCEPT 继续正常传输数据报。这个返回值告诉 Netfilter:到目前为止,该数据包还是被接受的并且该数据包应当被递交到网络协议栈的下一个阶段。

 

2、NF_DROP 丢弃该数据报,不再传输。

 

3、NF_STOLEN 模块接管该数据报,告诉Netfilter“忘掉”该数据报。该回调函数将从此开始对数据包的处理,并且Netfilter应当放弃对该数据包做任何的处理。但是,这并不意味着该数据包的资源已经被释放。这个数据包以及它独自的sk_buff数据结构仍然有效,只是回调函数从Netfilter 获取了该数据包的所有权。

 

4、NF_QUEUE 对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)

 

5、NF_REPEAT 再次调用该回调函数,应当谨慎使用这个值,以免造成死循环。

 

 

整个Linux内核中Netfilter框架的HOOK机制可以概括如下:

 

在数据包流经内核协议栈的整个过程中,在一些已预定义的关键点上PRE_ROUTING、LOCAL_IN、FORWARD、LOCAL_OUT和POST_ROUTING会根据数据包的协议簇PF_INET到这些关键点去查找是否注册有钩子函数。如果没有,则直接返回okfn函数指针所指向的函数继续走协议栈;如果有,则调用nf_hook_slow函数,从而进入到Netfilter框架中去进一步调用已注册在该过滤点下的钩子函数,再根据其返回值来确定是否继续执行由函数指针okfn所指向的函数。

 

睿江云官网链接:www.eflycloud.com

上一篇: 无

微信关注

获取更多技术咨询