在分析LINUX2.4.x网络安全的实现之前先简单介绍一下它里面包含的几个重要概念:netfilter、iptables、match、target、nf_sockopt_ops、网络安全功能点的实现。详细解释会在后面的分析中讲到。

1.概述

详解LINUX 2.4.x 内核网络安全结构(linux内核网络架构)  LINUX 2.4.x内核 网络安全 LINUX开发 第1张

在分析LINUX2.4.x网络安全的完结之前先简略介绍一下它里边包括的几个重要概念:netfilter、iptables、match、target、nf_sockopt_ops、网络安全功用点的完结。详细解说会在后边的分析中讲到。

首要是netfilter,它界说了协议栈中的查看点和在查看点上引证的数据结构,以及在查看点上对这些结构引证的进程。iptables界说了完结网络安全功用的规矩的安排以及对规矩的操作。一个规矩中包括零个或多个match和一个target,规矩安排沿用了LINUX2.2.x中的chain,rule的概念,可是增加了table的概念,这三者的联系是:table是完结某项功用一切规矩的总和,chain是在某个查看点上所引证规矩的调集,rule是一个独自的规矩。match在规矩中用于匹配数据包中的各项参数,每个match匹配特定的参数,所以一个规矩中能够有多个match,这包括体系已界说的match,也包括经过内核模块别的增加的match。target在规矩中决议怎么处理匹配到的数据包,因此在target中完结了详细的网络安全功用。nf_sockopt_ops是在体系调用get/setssockopt中引证的数据结构,完结用户空间对规矩的增加、删去、修正、查询等动作。以上的结构在运用之前必须先注册到体系中才干被引证。

LINUX2.4.x网络安全完结了包过滤,地址转化(包括了LINUX2.2.x中的地址假装和通明署理功用并有其他扩展功用),衔接盯梢(这是完结地址转化的根底,在它里边完结了对衔接状况的记载和监控,与状况检测相似),Mangle(这是LINUX2.4.x新增的一个功用,它对数据包进行查看但不做制止、丢掉或答应的判别)。完结这些功用点需求别离注册netfilter,iptables,match,target,nf_sockopt_ops的数据结构。假如完结其他新的功用,只需界说相应的结构并将它注册到体系中,而且经过用户空间的装备东西(这个装备东西也须支撑新的结构)把它加入到规矩中就能够了。这些结构在规矩中主动被引证。

2.netfilter

netfilter界说了协议栈中的查看点和查看点上引证的数据结构以及对这些数据结构引证的进程。首要看看在查看点上引证的数据结构,如图所示:

图中ns_hook_ops便是在查看点上引证的结构。每个协议栈预先界说的8个链表数组用于保存这些结构,这些链表与协议栈中的查看点一一对应。在实践的运用中,这8个链表并不一定都被运用,比如在IPV4中,只界说了5个查看点,别离对应前5个链表。nf_hook_ops结构如下:

struct nf_hook_ops

{

struct list_head list;

nf_hookfn hook; /* 函数指针 */

int pf; /* 结构对应的协议栈号 */

int hooknum;  /* 结构对应的查看点号*/

int priority; /* 结构的优先值 */

};

nf_register_hook函数将ns_hook_ops结构注册到这些链表上,链表的索引由结构中hooknum指定。同一链表上的结构按优先值由小到大摆放。在查看点上引证这些结构时,以它们在链表上的先后顺序引证。

查看点由宏NF_HOOK界说。在查看点上,函数nf_hook_slow调用函数nf_iterate遍历对应链表并调用链表上的结构ns_hook_ops中界说的函数。假如结构中的函数回来NF_ACCEPT,则持续调用下一个结构中的函数;假如结构中的函数回来NF_DROP或NF_STOLEN或NF_QUEUE,则将这个值回来给nf_hook_slow;假如结构中的函数回来NF_REPEAT,则重复调用此结构上的函数;假如到了链表上的最终一个结构,则把这个结构中函数的回来值回来给ns_hook_slow。在ns_hook_slow中判别nf_iterate的回来值,假如是NF_ACCEPT,则答应数据包经过,并将数据包传递给协议栈中的下一个函数;假如是NF_DROP,则开释数据包,协议栈流程中止;假如是NF_STOLEN,相同中止协议栈的流程,可是没有开释这个数据包;假如是NF_QUEUE,则将这个包发送到用户空间处理,一起中止协议栈的流程。

查看点散布在协议栈的流程中,下图是IPV4中的查看点:

图中查看点的称号如下:

查看点编号 查看点称号 查看点地点文件名

1 NF_IP_PRE_ROUTING ip_input.c

2 NF_IP_LOCAL_IN ip_input.c

3 NF_IP_FORWARD ip_forward.c

4 NF_IP_POST_ROUTING ip_output.c

5 NF_IP_LOCAL_OUT ip_output.c

表2.1 IPV4中查看点的称号

图中,ROUTE(1)处对收到的包做路由查找并判别这个包是需求转发的包仍是发往本机上层的包,ROUTE(2)处查找宣布包的路由。NF_IP_PRE_ROUTING处对一切传入IP层的数据包进行查看,在这之前,有关数据包的版别、长度、校验和等正确性查看现已完结。NF_IP_LOCAL_IN对发往本机上层的数据包进行查看。请留意这两个查看点与LINUX2.2.x中查看点的差异,在LINUX2.2.x没有区别发往本机上层包和需求转发的包,所以在做完地址解假装之后又调用了一次路由查找函数,为解假装之后的包查找路由。NF_IP_FORWARD处查看需求转发的数据包。NF_IP_POST_ROUTING处对一切向链路层传递的数据包进行查看,留意在此处数据包的路由现已确认。NF_IP_LOCAL_OUT对本机宣布的包进行查看,此处的路由还没有确认,所以能够做意图地址转化。完结某个网络安全功用或许需求在多个查看点上注册相应的结构,在后边的分析中咱们能够看到详细的比如。

#p#

3. iptables

iptables完结对规矩的办理和拜访。它里边有几个重要的数据结构ipt_entry,ipt_match,ipt_target,ipt_table,用于结构规矩表。还有一个重要的函数ipt_do_table,用于遍历规矩表并处理规矩表上的结构。

ipt_entry是规矩的数据结构,如下:

struct ipt_entry

{

struct ipt_ip ip;

unsigned int nfcache;

u_int16_t target_offset;/* target在规矩中的偏移 */

u_int16_t next_offset; /* 下一条规矩的偏移 */

unsigned int comefrom;

struct ipt_counters counters;/* 匹配规矩的数据包的计算计数 */

unsigned char elems[0];

};

在ipt_entry中ipt_ip是一个根本的match,它是固定的,用于匹配数据包的源地址/源端口、意图地址/意图端口、协议等。其他的match按需求增加,个数并不固定,所以在ipt_entry有一个变长的字符数组保存规矩中match的指针,这些指针指向体系中注册的match。每个规矩有一个target,决议数据包彻底匹配规矩后怎样处理这个数据包,它也是一个指向体系注册的target的指针,而且也放在前面说到的变长字符数组中。ipt_entry中的target_offset是target在规矩中的偏移,偏移是从规矩的开始地址到target地点方位的长度,还有一个变量next_offset指示下一条规矩偏移,它其实便是本条规矩的长度。

前面说到在iptables中沿用了LINUX2.2.x中的chain和rule的概念,那么在ipt_entry中怎么区别chain和rule的哪?

咱们知道chain是某个查看点上查看的规矩的调集。除了默许的chain外,还能够创立新的chain。在iptables中,同一个chain里的规矩是接连寄存的。默许的chain的最终一条规矩的target是chain的policy。用户创立的chain的最终一条规矩的target的调用回来值是NF_RETURN,遍历进程将回来本来的chain。规矩中的target也能够指定跳转到某个用户创立的chain上,这时它的target是ipt_stardard_target,而且这个target的verdict值大于0。假如在用户创立的chain上没有找到匹配的规矩,遍历进程将回来到本来chain的下一条规矩上。

ipt_match用于匹配数据包的参数,如TCP数据包中的标志位,ICMP协议中的类型等,每个match所感兴趣的参数都不相同,所以一条规矩或许有多个match。ipt_target决议在数据包彻底匹配规矩后应做什么样的处理。这两个在运用之间都必须先注册到体系的链表中才干被规矩引证。对这两个数据结构不做过多分析,读者能够自行参阅源代码。

ipt_table是规矩表的数据结构,如下:

struct ipt_table

{

struct list_head list;

char name[IPT_TABLE_MAXNAMELEN];

struct ipt_replace table;/* 用户空间传递的规矩表 */

unsigned int valid_hooks; /* 有用的查看点置位*/

rwlock_t lock;

struct ipt_table_info private; /* 规矩表在内核中的存储结构 */

struct module *me;

};

在ipt_table中,ipt_replace是用户空间装备程序传递给内核的规矩表,这个规矩表不能直接运用,必须先依据它里边包括的match和target的称号将match和target转化成在内核注册的match和target的指针,还有一项重要的作业是查看规矩表中是否有循环,假如有循环,要给用户空间的装备程序陈述过错。转化之后的规矩表存储在ipt_table_info中。valid_hooks指示与这个表相关的查看点,并把相应的方位为1。一个table中能够有多个chain,chain分为体系默许的chain(与table注册的查看点对应)和用户创立的chain。一切的table都注册放在一个链表中,而chain和rule则用偏移值next_offset衔接成一个单向链表。

【修改引荐】

  1. 关于Linux操作体系的NTFS和内核分析
  2. Linux内核彻底分析---数学协处理器
  3. Linux内核彻底分析---math_emulate.c程序
转载请说明出处
知优网 » 详解LINUX 2.4.x 内核网络安全结构(linux内核网络架构)

发表评论

您需要后才能发表评论