|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由于在linux中,用户权限很大,做任何事情都很自由,所以,你往往需要知道你做的每一步在干什么。
Linux体系中的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中找到响应的地位并拔出到此表中。_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
</p>
无论图形界面发展到什么水平这个原理是不会变的,Linux命令有许多强大的功能:从简单的磁盘操作、文件存取、到进行复杂的多媒体图象和流媒体文件的制作。 |
|