详解LINUX 2.4.x 内核网络安全框架(1)


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对本机发出的包进行检查,此处的路由还没有确定,所以可以做目的地址转换。实现某个网络安全功能可能需要在多个检查点上注册相应的结构,在后面的分析中我们可以看到具体的例子。


相关内容