Linux系统中防火墙的框架分析
Netfilter提供了一个抽象、通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统。Netfilter框架包含以下五部分:
1.为每种网络协议(IPv4、IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数),这些钩子函数在数据报流过协议栈的几个关键点被调用。在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架。
2.内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何模块对该协议和钩子函数进行了注册。若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查(可能还会修改)该数据包、丢弃该数据包及指示netfilter将该数据包传入用户空间的队列。
3.那些排队的数据包是被传递给用户空间的异步地进行处理。一个用户进程能检查数据包,修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数中注入到内核中。
4.任何在ip层要被抛弃的ip数据包在真正抛弃之前都要进行检查。例如允许模块检查ip-spoofed包(被路由抛弃)。
5.IP层的五个HOOK点的位置如下所示:
1.NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点(刚刚进行完版本号,校验和等检测),源地址转换在此点进行;ip_input.c中IP_rcv调用。
2.NF_IP_LOCAL_IN:经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行;ip_local_deliver中调用
3.NF_IP_FORWARD:要转发的包通过此检测点,FORWORD包过滤在此点进行;
4.NF_IP_POST_ROUTING:所有马上便要通过网络设备出去的包通过此检测点,内置的目的地址转换功能(包括地址伪装)在此点进行;
5.NF_IP_LOCAL_OUT:本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。
这些点是已经在内核中定义好的,内核模块能够注册在这些HOOK点进行的处理,可使用nf_register_hook函数指定。在数据报经过这些钩子函数时被调用,从而模块可以修改这些数据报,并向netfilter返回如下值:
NF_ACCEPT继续正常传输数据报
NF_DROP丢弃该数据报,不再传输
NF_STOLEN模块接管该数据报,不要继续传输该数据报
NF_QUEUE对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)
NF_REPEAT再次调用该钩子函数
一个基于Netfilter框架的、称为iptables的数据报选择系统在Linux2.4内核中被应用,其实它就是ipchains的后继工具,但却有更强的可扩展性。内核模块可以注册一个新的规则表(table),并要求数据报流经指定的规则表。这种数据报选择用于实现数据报过滤(filter表),网络地址转换(Nat表)及数据报处理(mangle表)。Linux2.4内核提供的这三种数据报处理功能都基于netfilter的钩子函数和IP表。它们是独立的模块,相互之间是独立的。它们都完美的集成到由Netfileter提供的框架中。
包过滤
filter表格不会对数据报进行修改,而只对数据报进行过滤。iptables优于ipchains的一个方面就是它更为小巧和快速。它是通过钩子函数NF_IP_LOCAL_IN,NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架的。因此对于任何一个数据报只有一个地方对其进行过滤。这相对ipchains来说是一个巨大的改进,因为在ipchains中一个被转发的数据报会遍历三条链。
NAT
NAT表格监听三个Netfilter钩子函数:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。NF_IP_PRE_ROUTING实现对需要转发的数据报的源地址进行地址转换而NF_IP_POST_ROUTING则对需要转发的数据包的目的地址进行地址转换。对于本地数据报的目的地址的转换则由NF_IP_LOCAL_OUT来实现。NAT表格不同于filter表格,因为只有新连接的第一个数据报将遍历表格,而随后的数据报将根据第一个数据报的结果进行同样的转换处理。NAT表格被用在源NAT,目的NAT,伪装(其是源NAT的一个特例)及透明代理(其是目的NAT的一个特例)。
数据报处理(Packetmangling)
mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT钩子中进行注册。使用mangle表,可以实现对数据报的修改或给数据报附上一些带外数据。当前mangle表支持修改TOS位及设置skb的nfmard字段。
源码分析
如果我们想加入自己的代码,便要用nf_register_hook函数,其函数原型为:
intnf_register_hook(structnf_hook_ops*reg)
structnf_hook_ops
{
structlist_headlist;
/*Userfillsinfromheredown.*/
nf_hookfn*hook;
intpf;
inthooknum;
/*Hooksareorderedinascendingpriority.*/
intpriority;
};
我们的工作便是生成一个structnf_hook_ops结构的实例,并用nf_register_hook将其HOOK上。其中list项我们总要初始化为{NULL,NULL};由于一般在IP层工作,pf总是PF_INET;hooknum就是我们选择的HOOK点;一个HOOK点可能挂多个处理函数,谁先谁后,便要看优先级,即priority的指定了。netfilter_ipv4.h中用一个枚举类型指定了内置的处理函数的优先级:
enumnf_ip_hook_priorities{
NF_IP_PRI_FIRST=INT_MIN,
NF_IP_PRI_CONNTRACK=-200,
NF_IP_PRI_MANGLE=-150,
NF_IP_PRI_NAT_DST=-100,
NF_IP_PRI_FILTER=0,
NF_IP_PRI_NAT_SRC=100,
NF_IP_PRI_LAST=INT_MAX,
};
hook是提供的处理函数,也就是我们的主要工作,其原型为:
unsignedintnf_hookfn(unsignedinthooknum,
structsk_buff**skb,
conststructnet_device*in,
conststructnet_device*out,
int(*okfn)(structsk_buff*));
它的五个参数将由NFHOOK宏传进去。
nf_register_hook根据reg中注册的协议簇类型和优先级在nf_hooks中找到相应的位置并插入到此表中。structlist_headnf_hooks[NPROTO][NF_MAX_HOOKS]在netfilter初始化时(netfilter_init/netfilter.c,而它在sock_init时调用)已经初始为一个空表。
例如iptable在初始化时(init/iptable_filter.c)调用nf_register_hook注册他的hook函数。
staticstructnf_hook_opsipt_ops[]
={{{NULL,NULL},ipt_hook,PF_INET,NF_IP_LOCAL_IN,NF_IP_PRI_FILTER},
{{NULL,NULL},ipt_hook,PF_INET,NF_IP_FORWARD,NF_IP_PRI_FILTER},
{{NULL,NULL},ipt_local_out_hook,PF_INET,NF_IP_LOCAL_OUT,
NF_IP_PRI_FILTER}
};
mangle在init/iptable_mangle.c中注册它自己的hook函数。
staticstructnf_hook_opsipt_ops[]
={{{NULL,NULL},ipt_hook,PF_INET,NF_IP_PRE_ROUTING,NF_IP_PRI_MANGLE},
{{NULL,NULL},ipt_local_out_hook,PF_INET,NF_IP_LOCAL_OUT,
NF_IP_PRI_MANGLE}
};
NAT在init/ip_nat_standalone.c中注册它自己的hook函数
/*包过滤前,更改目的地址*/
staticstructnf_hook_opsip_nat_in_ops
相关文章
- 使用Linux系统:探索图形界面的魅力(linux系统图形界面)
- 1000 万指令Linux秒杀1000万指令,极速超载!(linux每秒执行)
- Linux终端中的命令输入方式(linux在哪里输入命令)
- Linux服务器安全性:从审计到保护(linux服务器安全报告)
- 努力攻克Linux之路:踏上努力学习的征程(学习linux需要)
- 探讨Linux系统下线程状态变化(linux线程状态)
- Linux 中压缩等级的选择(linux压缩等级)
- Linux硬件管理实践:高效率发挥你的系统能力(linux硬件管理)
- 里Linux回收站: 寻找隐藏的宝藏(linux回收站在哪)
- 信息探索Linux系统: 面对信息更精准(查看linux的系统)
- 苏州:培养Linux高手的地方(苏州linux培训)
- 安全红帽Linux桌面:强力安全保障(红帽linux桌面)
- 操作指南:如何关闭Linux防火墙(关闭linux的防火墙)
- Linux系统分支探秘(linux的分支)
- Linux的大家庭:探索分支上的奥秘(linux的分支)
- Linux U盘启动:无缝衔接系统扩展(linux的u盘启动)
- 系统Linux分支系统: 拓展开发无限可能(linux的分支)
- Linux分支:为开发者们带来更多可能(linux的分支)
- Linux系统数据备份与恢复之道(linux数据备份恢复)
- Linux系统中关闭防火墙技巧(关闭linux的防火墙)
- 如何在Linux系统中进行环境变量的重置?(重置环境变量linux)
- 系统通往Linux系统的旅程(访问linux)
- 利用Linux ps命令轻松管理进程,提高系统性能(linuxps进程)
- 轻松操作:Linux系统中如何卸载Lua?(linux卸载lua)
- Linux 命令安装:和轻松打开系统大门(linux 命令 安装)
- 探索大疆无人机系统的新纪元:Linux(大疆 linux)
- Linux系统:发现与克服缺陷(linux系统的缺点)