1实现总体思想通过改造Linux的IP协议栈源代码,使得IP实现与IPSec实现完全整合。该实现按功能分,可以分为以下几个功能模块模块:安全策略库(SPD),安全关联库(SAD),AH协议处理,ESP协议处理,算法(加密卡的实现),日志、统计、配置与审计,面向应用的接口。按处理过程分,还可以分为以下几个处理模块:进入IP层预处理、IPSec进入策略处理、路由、本机对IP包处理、IPSec进入处理、转发处理、本地IP包处理、IPSec外出处理、发送处理。Ipsec协议实现与IP实现的整合思想:利用Netfilter的HOOK机制,在接受IP包和发送IP包的过程中,在适当的处理位置调用相关的ipsec处理模块。1.1Netfilter的HOOK机制的介绍Netfilter是linux2.4内核实现数据包过滤/数据包处理/NAT等功能的抽象、通用化的框架。Netfilter框架包含以下三部分:1、为每种网络协议(IPv4、IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数),这些钩子函数在数据报流过协议栈的几个关键点被调用。在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架。2、内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何模块对该协议和钩子函数进行了注册。若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查(可能还会修改)该数据包、丢弃该数据包及指示netfilter将该数据包传入用户空间的队列。3、那些排队的数据包是被传递给用户空间的异步地进行处理。一个用户进程能检查数据包,修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数中注入到内核中。IP层(ipv4)的五个HOOK点如下:1.NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点(刚刚进行完版本号,校验和等检测),源地址转换在此点进行;2.NF_IP_LOCAL_IN:经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行;3.NF_IP_FORWARD:要转发的包通过此检测点,FORWORD包过滤在此点进行;4.NF_IP_POST_ROUTING:所有马上便要通过网络设备出去的包通过此检测点,内置的目的地址转换功能(包括地址伪装)在此点进行;5.NF_IP_LOCAL_OUT:本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。1.2处理模块之间的关系IPSec安全网关对IP报文的接收、转发和发送处理的整个过程:当安全网关的网卡接收到数据报时,通过中断触发内核的中断处理程序,将网卡接收的数据报传送到内核空间,然后再通过IP层预处理程序将数据报转换为IP包。此时,我们将利用内核的Netfilter机制提供的HOOK点PRE_ROUTING,将IP包传送到IPSec进入策略处理模块。该模块将决定哪些包可以进入安全网关,哪些包需要丢弃。对于允许进入网关的IP包,将送回到路由处理模块。路由处理根据IP头决定IP包是发送到本机还是继续转发。对于发送到本机的IP包,首先经过内核对IP包的处理,如:分片重组、选项处理等等。然后利用HOOK点LOCAL_IN,将重组的IP包传送到IPSec进入处理模块。IPSec进入处理模块将对IPSec包和非IPSec包进行区分,对于发往本机的非IPSec包将直接传送到传输层处理模块;对于IPSec包将进行认证或解密等IPSec处理,并剥去IPSec头。处理完后,将重新组装成IP包发回到IP层预处理模块。这样该IP包将重新通过路由来决定发往何处。对于转发的IP包,首先进行转发处理,如:决定下一跳、减少TTL、对某些特殊情况发送ICMP包。然后,利用HOOK点IP_FORWARD,将IP包传送到外出IPSec外出处理模块。IPSec处理将根据策略区分IPSec包、非IPSec包以及包发往何处。对于IPSec包将直接丢弃。对于发往内部网的非IPSec包,直接将包传送给发送处理模块,发往内部网。对于发往外部网的IP包,将根据策略进行认证或加密等IPSec处理,最后将处理过的IP包传送到发送处理模块。对于从安全网关传输层发送的报文,首先进行本地的IP包处理,构建IP包。然后对IP包进行路由,决定IP包的出口。路由之后将利用HOOK点LOCAL_OUTPUT,将IP包传送到IPSec外出处理模块。IPSec外出处理将根据策略决定那些包需要进行IPSec处理。对于不需要处理的IP包,直接传送到发送处理模块。对于需要进行IPSec处理的IP包,将根据策略进行认证或加密等IPSec处理,然后将IPSec包重新发回到路由处理模块,决定IPSec包将发往何处。当再次经过HOOK点时,IPSec外出处理将通过策略将处理过的IP包直接传送到发送处理模块。发送处理模块将进行分片等处理,最后将包发送到网卡。1.3功能模块之间的关系各功能模块之间的关系:安全策略库存放了由用户或系统管理员所制定的策略,策略将决定通讯的双方是否采用IPSec处理,以及决定采用何种IPSec协议、模式、算法和嵌套需求。安全关联库由一系列安全关联项组成。安全关联是两个通讯实体经过协商建立起来的一种协定。它们决定了用来保护数据包安全所需的各种参数:序号计数器;抗重播窗口;AH验证算法及其密钥;ESP加密、认证算法、密钥;安全关联的生存期;IPsec协议模式。算法库存放了多种可选的认证和加密算法,在处理时将通过安全关联中的算法项来指明所需要使用的算法。面向应用的接口提供了管理安全策略库,以及配置网关,处理日志、统计、审计信息的接口。用户或系统管理员可通过配置服务器关联安全策略库,还可以进行手工注入安全关联或者启动IKE动态协商安全关联,以及对日志、统计、配置、审计信息的提取和处理。2各个模块的实现2.1处理模块的实现2.1.1Netfilter钩子函数2.1.1.1实现思想利用Linux提供的Netfilter框架,并在Netfilter框架提供的HOOK点上注册并实现IPSec相关处理函数,使得IPSec处理能加入到IP包接收或发送处理过程的适当位置。2.1.1.2实现细节Linux内核的Netfilter框架在ipv4中提供了5个HOOK点,在每个HOOK点上都可以通过一个注册函数nf_register_hook(structnf_hook_ops*reg)将自己实现的处理函数挂接到HOOK点上。这样在每一次HOOK点被激活时,都将查询并执行该HOOK点所注册的处理函数。然后在处理结束时返回相关的信息来决定被处理的包是丢弃、拒绝,还是继续进行HOOK点后面的处理。因此我们的工作便是生成一个structnf_hook_ops结构的实例(结构如下):structnf_hook_ops{structlist_headlist;nf_hookfn*hook;intpf;inthooknum;intpriority;};并将该结构中的一个相关处理函数nf_hookfn(定义如下)实现为我们所需的相关IPSec处理函数:unsignedintnf_hookfn(unsignedinthooknum,structsk_buff**skb,conststructnet_device*in,conststructnet_device*out,int(*okfn)(structsk_buff*));并用nf_register_hook将该实例注册到由hooknum所指定的HOOK点上。这样,当hooknum指定的HOOK点被激活时(如在ip_rcv中的:NF_HOOK(PF_INET,NF_IP_PRE_ROUTING,skb,dev,NULL,ip_rcv_finish)),将根据priority所指定的优先级,依次执行在该HOOK点注册的函数,因此我们所实现的相关IPSec处理函数将得到执行。Netfilter还提供了一系列返回信息(如下):NF_ACCEPT继续正常传输数据报NF_DROP丢弃该数据报,不再传输NF_STOLEN模块接管该数据报,不要继续传输该数据报NF_QUEUE对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)NF_REPEAT再次调用该钩子函数在处理结束后将通过返回信息来决定被处理的数据报在HOOK点之后应该怎样处理。2.1.2初始化IPSec的实现2.1.2.1注册HOOK点2.1.3进入IP包预处理2.1.3.1实现思想从网卡传来的数据报在进入IP层处理之前先进行一些检查,并在此时激活第一个HOOK点:NF_IP_PRE_ROUTING,对进入本机的包进行进入前预处理。我们实现的IPSec进入策略处理模块也在此时通过HOOK点被调用执行。2.1.3.2实现细节该模块首先对传入的IP包进行必要的检查:1、通过包类型标志pkt_type检查IP包是否是其他机器(PACKET_OTHERHOST)的,如果是就丢弃。2、检查IP包的长度是否合法。3、检查IP版本。4、检查校验和。最后激活HOOK点:returnNF_HOOK(PF_INET,NF_IP_PRE_ROUTING,skb,dev,NULL,ip_rcv_finish)然后将依次调用在该HOOK点上注册处理函数,其中包括我们实现的IPSec进入策略处理模块。2.1.4IPSec进入策略处理2.1.4.1实现思想该模块将根据IP报文的相关信息构造选择符。然后通过选择符查询进入安全策略库,找到第一个匹配项(策略)。再根据策略对IP包进行策略检查和处理:1、对于外部网的进入包drop:(增强型包过滤)不允许某些外部网的包进入;不允许某些外部网的不加密包进入;不允许某些网应该加密却未加密的包进入;不允许某些外部网的加密包进入。reject:类似于drop,不过要对ICMP包进行特殊处理。accept:对某些外部网的不加密包或加密包允许通过,对已经经过IPSec处理的包(用于IPSec嵌套的情况)允许通过。2、对于内部网的进入包drop:对某些内部网机器的IP包不允许通过accept:允许内部网的IP包通过最后对于通过的包,传回到ip_rcv_finish继续处理2.1.4.2实现细节1、从IP包中提取源/目的IP地址、源/目的端口、下一层协议等信息。2、根据这些提取的信息查询进入安全策略库,找到匹配的策略项。3、根据策略项所指定的策略进行处理:丢弃:返回NF_DROP,Netfilter机制将丢弃该数据包,不再传输。并将该事件记录到日志中。拒绝:返回NF_STOLEN,Netfilter机制将接管该数据包,不再继续传输。并将该事件记录到日志中。接收:返回NF_ACCEPT,Netfilter机制将正常传输该数据包:将该包传送给ip_rcv_finish。其中对于IPSec包需要作上标记(利用标记变量nmask),表明该包需要在以后进行IPSec处理。2.1.5路由2.1.5.1实现思想根据IP包的源地址、目的地址和服务类型(tos)等信息查找路由表,找到该IP包对应的路由项,并记录该项。在路由项中指出了IP包接下来该如何处理:对于本地IP包,将交给本机的IP处理模块ip_local_deliver;对于非本机接收包,适合转发的将交给转发处理模块ip_forward,其他情况将作特殊处理。2.1.5.2实现细节1、将从IP包中提取的源地址、目的地址和服务类型值,通过适当的散列算法产生散列值。2、根据散列值在路由缓存散列表中查找散列位置3、进一步根据源地址、目的地址、输入接口、服务类型在散列链中找到正确的路由项。4、根据路由项中指定的输入处理函数,调用适当的函数:对于本地IP包调用ip_local_deliver;对于其他IP包调用ip_forward2.1.6本机对IP包处理2.1.6.1实现思想对经过路由传送来的IP包,首先检查是否存在分片。如果存在分片,必须缓存IP分片包。等所有的分片到齐时,进行分片重组处理,将分片合成完整