FreeSWAN 结构框架

本文介绍如何通过改造Linux IP协议栈使IPSec功能完全整合到Linux内核中。利用Netfilter的HOOK机制,在接收和发送IP包过程中调用IPSec处理模块,确保数据包的安全处理。

目录

1 实现总体思想... 2

1.1 Netfilter的HOOK机制的介绍... 2

1.2 处理模块之间的关系... 3

1.3 功能模块之间的关系... 5

2 各个模块的实现... 6

2.1 处理模块的实现... 6

2.1.1 Netfilter钩子函数... 6

2.1.1.1 实现思想... 6

2.1.1.2 实现细节... 6

2.1.2 进入IP包预处理... 7

2.1.2.1 实现思想... 7

2.1.2.2 实现细节... 7

2.1.3 IPSec进入策略处理... 7

2.1.3.1 实现思想... 7

2.1.3.2 实现细节... 7

2.1.4 路由... 8

2.1.4.1 实现思想... 8

2.1.4.2 实现细节... 8

2.1.5 本机对IP包处理... 8

2.1.5.1 实现思想... 8

2.1.5.2 实现细节... 8

2.1.6 IPSec进入处理... 9

2.1.6.1 实现思想... 9

2.1.6.2 实现细节... 9

2.1.7 转发处理... 10

2.1.7.1 实现思想... 10

2.1.7.2 实现细节... 10

2.1.8 本地IP包处理... 11

2.1.8.1 实现思想... 11

2.1.8.2 实现细节... 11

2.1.9 IPSec外出处理... 11

2.1.9.1 实现思想... 11

2.1.9.2 实现细节... 11

2.1.10 发送处理... 12

2.1.10.1 实现思想... 12

2.1.10.2 实现细节... 12

2.2 功能模块的实现... 13

2.2.1 策略库(SPD)的实现:... 13

2.2.1.1 实现思想:... 13

2.2.1.2 实现细节... 14

2.2.1.3 基本操作... 14

2.2.2 安全关联库(SAD)的实现... 14

2.2.2.1 实现思想... 14

2.2.2.2 实现细节... 15

2.2.2.3 基本操作... 15

2.2.3 AH协议处理模块实现... 15

2.2.3.1 AH格式:... 16

2.2.3.2 实现功能:... 16

2.2.3.3 实现模式:... 16

2.2.4 ESP协议处理模块实现... 17

2.2.4.1 ESP格式... 17

2.2.4.2 实现功能:... 17

2.2.4.3 实现模式... 17

2.2.5 算法实现... 18

2.2.5.1 实现思想... 18

2.2.5.2 实现细节... 18

2.2.6 日志、统计、配置与审计实现... 18

2.2.6.1 日志与审计... 18

2.2.6.2 统计... 18

2.2.6.3 配置... 18

2.2.7 应用程序与内核的通讯接口实现... 19

2.2.7.1 实现思想... 19

2.2.7.2 实现细节... 20

1 实现总体思想

通过改造LinuxIP协议栈源代码,使得IP实现与IPSec实现完全整合。该实现按功能分,可以分为以下几个功能模块模块:安全策略库,安全关联库,AH协议处理,ESP协议处理,算法(加密卡的实现),日志、统计、配置与审计,面向应用的接口。按处理过程分,还可以分为以下几个处理模块:进入IP层预处理、IPSec进入策略处理、路由、本机对IP包处理、IPSec进入处理、转发处理、本地IP包处理、IPSec外出处理、发送处理。

Ipsec协议实现与IP实现的整合思想:利用NetfilterHOOK机制,在接受IP包和发送IP包的过程中,在适当的处理位置调用相关的ipsec处理模块。

1.1 NetfilterHOOK机制的介绍

<shapetype id="_x0000_t75" path=" m@4@5 l@4@11@9@11@9@5 xe" stroked="f" filled="f" o:spt="75" o:preferrelative="t" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0 "></f><f eqn="sum @0 1 0 "></f><f eqn="sum 0 0 @1 "></f><f eqn="prod @2 1 2 "></f><f eqn="prod @3 21600 pixelWidth "></f><f eqn="prod @3 21600 pixelHeight "></f><f eqn="sum @0 0 1 "></f><f eqn="prod @6 1 2 "></f><f eqn="prod @7 21600 pixelWidth "></f><f eqn="sum @8 21600 0 "></f><f eqn="prod @7 21600 pixelHeight "></f><f eqn="sum @10 21600 0 "></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.6pt; HEIGHT: 273pt" coordsize="21600,21600" type="#_x0000_t75"><imagedata o:title="netfilter" src="image001.png"></imagedata></shape>

1

Netfilterlinux2.4内核实现数据包过滤/数据包处理/NAT等功能的抽象、通用化的框架。Netfilter框架包含以下三部分:

1、 为每种网络协议(IPv4IPv6)定义一套钩子函数(IPv4定义了5个钩子函数),这些钩子函数在数据报流过协议栈的几个关键点被调用。在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架。

2、 内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何模块对该协议和钩子函数进行了注册。若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查(可能还会修改)该数据包、丢弃该数据包及指示netfilter将该数据包传入用户空间的队列。

3、 那些排队的数据包是被传递给用户空间的异步地进行处理。一个用户进程能检查数据包,修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数中注入到内核中。

IP层的五个HOOK点的位置如图1所示:(ipv4)

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报文的接收、转发和发送处理的整个过程如图2。当安全网关的网卡接收的数据报时,通过中断触发内核的中断处理程序,将网卡接收的数据报传送到内核空间,然后再通过IP层预处理程序将数据报转换为IP包。此时,我们将利用内核的Netfilter机制提供的HOOKPRE_ROUTING,将IP包传送到IPSec进入策略处理模块。该模块将决定哪些包可以进入安全网关,哪些包需要丢弃。对于允许进入网关的IP包,将送回到路由处理模块。路由处理根据IP头决定IP包是发送到本机还是继续转发。

对于发送到本机的IP包,首先经过内核对IP包的处理,如:分片重组、选项处理等等。然后利用HOOKLOCAL_IN,将重组的IP包传送到IPSec进入处理模块。IPSec进入处理模块将对IPSec包和非IPSec包进行区分,对于发往本机的非IPSec包将直接传送到传输层处理模块;对于IPSec包将进行认证或解密等IPSec处理,并剥去IPSec头。处理完后,将重新组装成IP包发回到IP层预处理模块。这样该IP包将重新通过路由来决定发往何处。

对于转发的IP包,首先进行转发处理,如:决定下一跳、减少TTL、对某些特殊情况发送ICMP包。然后,利用HOOKIP_FORWARD,将IP包传送到外出IPSec外出处理模块。IPSec处理将根据策略区分IPSec包、非IPSec包以及包发往何处。对于IPSec包将丢弃。对于发往内部网的非IPSec包,直接将包传送给发送处理模块,发往内部网。对于发往外部网的IP包,将根据策略进行认证或加密等IPSec处理,最后将处理过的IP包传送到发送处理模块。

对于从安全网关传输层发送的报文,首先进行本地的IP包处理,构建IP包。然后对IP包进行路由,决定IP包的出口。路由之后将利用HOOKLOCAL_OUTPUT,将IP包传送到IPSec外出处理模块。IPSec外出处理将根据策略决定那些包需要进行IPSec处理。对于不需要处理的IP包,直接传送到发送处理模块。对于需要进行IPSec处理的IP包,将根据策略进行认证或加密等IPSec处理,然后将IPSec包重新发回到路由处理模块,决定IPSec包将发往何处。当再次经过HOOK点时,IPSec外出处理将通过策略将处理过的IP包直接传送到发送处理模块。发送处理模块将进行分片等处理,最后将包发送到网卡。

<shape id="_x0000_i1026" style="WIDTH: 415.2pt; HEIGHT: 261.6pt" coordsize="21600,21600" type="#_x0000_t75" o:ole=""><imagedata o:title="" src="image003.wmz"><font size="3"></font></imagedata></shape>

2

1.3 功能模块之间的关系

各功能模块之间的关系如图3所示。安全策略库存放了由用户或系统管理员所制定的策略,策略将决定通讯的双方是否采用IPSec处理,以及决定采用何种IPSec协议、模式、算法和嵌套需求。安全关联库由一系列安全关联项组成。安全关联是两个通讯实体经过协商建立起来的一种协定。它们决定了用来保护数据包安全所需的各种参数:序号计数器;抗重播窗口;AH验证算法及其密钥;ESP加密、认证算法、密钥;安全关联的生存期;IPsec协议模式。算法库存放了多种可选的认证和加密算法,在处理时将通过安全关联中的算法项来指明所需要使用的算法。面向应用的接口提供了管理安全策略库,以及配置网关,处理日志、统计、审计信息的接口。用户或系统管理员可通过配置服务器关联全策略库,还可以进行手工注入安全关联或者启动IKE动态协商安全关联,以及对日志、统计、配置、审计信息的提取和处理。

<shape id="_x0000_i1027" style="WIDTH: 414.6pt; HEIGHT: 403.2pt" coordsize="21600,21600" type="#_x0000_t75" o:ole=""><imagedata o:title="" src="image005.wmz"><font size="3"></font></imagedata></shape>

3

2 各个模块的实现

2.1 处理模块的实现

2.1.1 Netfilter钩子函数

2.1.1.1 实现思想

利用Linux提供的Netfilter框架,并在Netfilter框架提供的HOOK点上注册并实现IPSec相关处理函数,使得IPSec处理能加入到IP包接收或发送处理过程的适当位置。

2.1.1.2 实现细节

Linux内核的Netfilter框架在ipv4中提供了5HOOK点(图1),在每个HOOK点上都可以通过一个注册函数nf_register_hook(struct nf_hook_ops *reg)将自己实现的处理函数挂接到HOOK点上。这样在每一次HOOK点被激活时,都将查询并执行该HOOK点所注册的处理函数。然后在处理结束时返回相关的信息来决定被处理的包是丢弃、拒绝,还是继续进行HOOK点后面的处理。

因此我们的工作便是生成一个struct nf_hook_ops结构的实例(结构如下):

struct nf_hook_ops

{

struct list_head list;

nf_hookfn *hook;

int pf;

int hooknum;

int priority;

};

并将该结构中的一个相关处理函数nf_hookfn(定义如下)实现为我们所需的相关IPSec处理函数:

unsigned int nf_hookfn(unsigned int hooknum,

struct sk_buff **skb,

const struct net_device *in,

const struct net_device *out,

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值