什么是Linux系统防火墙框架Linux教程

下面是小编辑器精心为您提供的Linux系统防火墙框架。欢迎阅读。


在Linux的Netfilter提供了一个抽象的、普遍的框架。由框架定义的子功能的实现是包过滤子系统。框架包含五个部分。


1、为每个网络协议定义一组钩子函数(IPv4、IPv6等)。(IPv4定义了5个钩子函数)。这些钩子函数调用时的几个关键点数据通过协议栈,在这些点上,协议栈将调用Netfilter框架采用数据报和钩子函数标记作为参数。


2的任何模块。内核可以注册每个协议的一个或多个钩子,并实现连接。当一个数据包被传递到内核的Netfilter框架,可以检测任何模块登记协议和钩子函数。如果注册,注册时使用的模块调用回调函数,使这些模块有机会检查(修改)的数据包,丢弃该数据包并指导Netfilter进入包到用户空间的队列。


三.排队的数据包的处理异步发送到用户空间,用户进程可以检查数据包,修改数据包,甚至把数据包通过该钩子函数从内核到内核。


4。这是任何IP数据包被丢弃在IP层之前,他们是真的放弃了检查。例如,一个模块可以检查IP欺骗包(找出)。


对5.ip层勾五点的位置如下:


(1)nf_ip_pre_routing:刚进入网络层的数据包是通过这一点(刚刚完成的版本号,校验和等),和源地址转换是在这一点上进行;在ip_input。C的ip_rcv电话。


(2)nf_ip_local_in:在路由查找,通过这个检查点发送到本机,在这一点上的输入数据包过滤,ip_local_deliver呼叫;


(3)nf_ip_forward:分组通过此检测点转发,在这一点上了包过滤;


(4)nf_ip_post_routing:所有的数据包将通过网络设备立即公布将通过这个关卡,和内置的目的地址转换功能,包括地址伪装,将在这一点上进行。


(5)nf_ip_local_out:由本地进程发送数据包通过该检测点,并输出数据包过滤,在这一点上。


这一点已经在内核中定义的,内核模块可以在这些钩子点注册,可以使用nf_register_hook函数指定。数据称为数据报通过这些钩子函数的时候,这样的模块可以修改数据并返回下列值的Netfilter:


nf_accept继续数据的正常传输


nf_drop丢弃该数据报,不再传输


的nf_stolen模块进行数据报不继续发送数据报


nf_queue队列的数据包(通常是用来处理数据到用户空间)。


nf_repeat调用钩子函数了


数据报选择系统基于Netfilter框架,称为防火墙,应用在Linux2.4内核。事实上,这是一个简单的继承人的工具,但它具有更好的可扩展性。内核模块可以登记一个新的规则表(表)和需要的数据流通过指定的规则表。这个数据包选择用来实现数据过滤(filter表),网络地址转换(NAT表)和数据报处理(mangle表)。三数据处理功能的设置是基于Linux2.4内核的Netfilter钩子函数和IP表。他们是独立的模块,相互独立的。他们完全融入了netfileter框架。


包过滤


过滤器表不修改数据,但只有滤波器的数据报。一方面iptables的优于ipchains是更小、更快。它是通过钩子函数nf_ip_local_in,nf_ip_forward连接到Netfilter框架,并nf_ip_local_out.so只有一个地方的任何数量的报纸进行过滤,这是在利用巨大的改进,因为转发数据报在IPchains穿越三链。


NAT


表三Netfilter钩子函数:NAT监控nf_ip_pre_routing,nf_ip_post_routing和nf_ip_local_out。nf_ip_pre_routing实现源地址转发数据报的地址转换和nf_ip_post_routing要转发的数据包的目的地址到地址翻译。对局部数据的目的地址转换NAT的nf_ip_local_out.the形式实现不同的过滤表,因为只有第一个数据报,新连接将导线的形式,和随后的数据报将根据第一数据结果做同样的变换处理。NAT表中使用源地址NAT,目的地址NAT,伪装(这是源地址NAT的一种特殊情况)和透明剂(它的目的地址NAT的一个特例)。


数据处理(数据处理)


mangle表是在nf_ip_pre_routing和nf_ip_local_out钩注册。使用mangle表,您可以修改数据或附加了一些波段数据报文。当前mangle表支持TOS位的修饰和skb的nfmard字段的设置。


源代码分析


如果我们要添加自己的代码,我们使用nf_register_hook函数,其函数原型:


Int nf_register_hook (struct nf_hook_ops *reg)


结构nf_hook_ops


{


结构list_head列表;


用户从这里填写。


Nf_hookfn *hook;


Int pf;


Int hooknum;


挂钩按升序排序。


中断优先级;


};