下面是小
编辑器精心为您提供的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;
挂钩按升序
排序。
中断优先级;
};