IPSEC实现分析.docx

上传人:b****6 文档编号:7613395 上传时间:2023-01-25 格式:DOCX 页数:70 大小:2.58MB
下载 相关 举报
IPSEC实现分析.docx_第1页
第1页 / 共70页
IPSEC实现分析.docx_第2页
第2页 / 共70页
IPSEC实现分析.docx_第3页
第3页 / 共70页
IPSEC实现分析.docx_第4页
第4页 / 共70页
IPSEC实现分析.docx_第5页
第5页 / 共70页
点击查看更多>>
下载资源
资源描述

IPSEC实现分析.docx

《IPSEC实现分析.docx》由会员分享,可在线阅读,更多相关《IPSEC实现分析.docx(70页珍藏版)》请在冰豆网上搜索。

IPSEC实现分析.docx

IPSEC实现分析

IPSec实现分析

1

引言

1.1编写目的

编写该文档的目的是为了更好地理IPSec模块。

为了能更好地理解IPSec,本详细设计报告描述了IPSec介绍、数据结构、IPSec策略匹配、SA的查找&安全路由的安装、发包和收包过程和IPSecIKE。

1.2编写背景

1.3预期读者和阅读建议

本文档的预期读者包括网关安全模块开发人员。

开发人员应重点理解函数实现和数据结构之间的关系。

1.4文档约定

IPSecInternetProtocolSecurity

SASecurityAssociation(安全联盟)

SPISecurityparameterindex(安全参数索引)

AHAuthenticationHeader(认证头)

ESPEncapsulatingSecurityPayload(加密安全载荷)

IKEInternetKeyExchange

HMACKeyed-hashMessageAuthenticationCode

1.5参考资料

RFC2401《SecurityArchitecturefortheInternetProtocol》

RFC2402《IPAuthenticationHeader》

RFC2406《IPEncapsulatingSecurityPayload(ESP)》

RFC2407《TheInternetIPSecurityDomainofInterpretationforISAKMP》

RFC2408《InternetSecurityAssociationandKeyManagementProtocol(ISAKMP)》

RFC2409《TheInternetKeyExchange(IKE)》

RFC3947《NegotiationofNAT-TraversalintheIKE》

RFC3948《UDPEncapsulationofIPsecESPPackets》

2详细设计

2.1IPSec介绍

IPSEC(InternetProtocolSecurity)是IETF指定的一个IP层安全框架协议。

它提供了在未提供保护的网络环境中传输敏感数据的保护。

它定义了IP数据包格式和相关基础结构,以便为网络通信提供端对端、加强的身份验证、完整性、防重放和保密性等。

IPSec到底是如何起作用的呢?

为了更直观的理解IPSecVPN,图2-1到图2-3说明了:

当两个机构通信的重要内容不想被中间人截获到,可以采用的方法。

图2-1是最原始的方法,两个机构直接通过Internet进行通信,但是这样的话,很容易遭受中间黑客的截获和对内容的篡改,而两边都无法知道,很可能会造成重要损失。

图2-2,两边的机构通过架设自己的专用网络进行通信,这样的话,黑客不修改物理的连接是无法接触到两边的通信内容的,所以比较安全,但是这样的方式会耗费巨大的投资。

图2-3,通过架设虚拟的VPN通道就可以使得:

1.黑客能截获到报文,但也无法得知内容;2.即便是修改了内容,但两边机构是能检测到报文有无修改。

图2-1普通通信方式

图2-2架设专用网络

图2-3开辟虚拟通道

当然VPN有多种,本文着重从IPSecVPN的角度介绍IPSec的原理及实现。

IPSec通过两种协议来实现对IP数据包的保护,分别是AH和ESP(下文介绍)。

IPSec既可以保护一个完整的IP载荷,也可以保护某个IP载荷的上层协议(例如TCP)。

这两种方式的保护取决于两种不同的‘模式’来提供的,如图2-4。

图2-4两种模式

传输模式用来保护上层协议,而隧道模式则用来保护整个IP报文。

两种协议均能使用两种模式进行数据传输。

IPSec提供以下的安全特性:

●数据机密性(Confidentiality):

IPsec发送方在通过网络传输包前对包进行加密。

●数据完整性(DataIntegrity):

IPsec接收方对发送方发送来的包进行认证,以确保数据在传输过程中没有被篡改。

●数据来源认证(DataAuthentication):

IPsec在接收端可以认证发送IPsec报文的发送端是否合法。

●防重放(Anti-Replay):

IPsec接收方可检测并拒绝接收过时或重复的报文。

2.1.1封装协议ESP

ESP(EncapsulatingSecurityPayload)属于IPSec的一种协议,可用于确保IP数据包的机密性(未被别人看过)、数据的完整性以及对数据源的身份验证。

ESP的协议号是50,ESP的协议头的格式如图2-5所示。

图2-5ESP头

SPI是用于唯一标识SA的一个32比特数值,它在AH和ESP头中传输。

在手工配置SA时,需要手工指定SPI的取值。

使用IKE协商产生SA时,SPI将随机生成。

SequenceNumber是单调递增的数值,用来防止重放攻击。

PayloadData可变长度,实际要传输的数据。

Padding填充数据,以字节为单位,为了保证数据的对齐。

Padlength填充长度

NextHeader下一个头的协议号

AuthenticationData可变长度,认证数据

ESP同时提供了机密性以及完整性,所以在其SA中必须同时定义两套算法—用来确保机密性的算法叫作一个cipher(加密器),而负责完整性的算法叫作authenticator(验证器)。

ESP作用的方式,如图2-6。

通过加密算法(对称加密DES/3DES/AES)对数据进行加密,然后使用散列函数MD5/SHA-1对报文进行摘要计算,最后把摘要放入ESP校验的部分。

图2-6ESP头的使用

通过加密来实现数据的机密性,保证传输过程中,即便是有人截获报文,也无法得知报文的内容;

通过ESP校验来实现数据的完整性,如果一旦在传输过程中对内容进行篡改,则校验不通过。

当接收方收到包以后,首先检查序列号(防止重放),其次校验数据完整性,最后解密数据成明文。

2.1.2封装协议AH

AH(AuthenticationHeader)协议,用来向IP通信提供数据完整性和身份验证,同时可以提供抗重播服务。

AH的协议号是51,AH的协议头的格式如图2-7所示。

图2-7AH认证头

NextHeader占8bit,下一个头的协议号;

PayloadLen占8bit,表示AH头的长度,单位是4字节,计算完要减2;

Reserved占16bit,保留

SPI占32bit,安全参数索引,用来定位SA

SequenceNumber占32bit,序列号,用来抗重播攻击

AuthenticationData可变长度,认证数据

AH提供了完整性校验、数据源认证及抗重播攻击的能力,但不提供机密性,传输过程中以明文方式进行。

AH头作用的方式如图2-8所示。

图2-8AH头的使用

跟ESP一样,通过对报文进行散列(MD5/SHA)计算来得到认证数据,有所不同的是加入了HMAC(Keyed-hashedMessageAuthenticationCode,密钥化散列认证代码)的方式。

图2-9所示是普通散列认证方式,第①步是对明文进行散列计算得到一个散列值,并把散列值和明文一起传送给用户B;第②步,当用户B收到信息后,也对明文进行散列计算;第③步,用计算得到的散列值2与散列值1进行比较,如果发现不一样,则丢弃数据包(说明传输过程中,有人改动数据包),如果发现一致,则数据包未被改动。

但这样的方式,中间人可以篡改信息,并同样计算散列值来实现‘改动数据包’的目的。

图2-10所示是HMAC的方式,和图2-9不一样的是,通过加入共享密钥来计算散列值,这样的话,中间人是没有办法改动数据包的。

同时HMAC的方式实现了完整性校验和源认证。

图2-9普通散列认证

图2-10HMAC方式认证

2.1.3IPSec应用场景

IPSecVPN的应用场景分为3种:

1.Site-to-Site(站点到站点或者网关到网关):

企业内网(若干PC)之间的数据通过这些网关建立的IPSec隧道实现安全互联。

这种方式只能使用隧道模式。

2.End-to-End(端到端或者PC到PC):

两个PC之间的通信由两个PC之间的IPSec会话保护,而不是网关。

这种方式既可使用传输模式也可使用隧道模式。

3.End-to-Site(端到站点或者PC到网关):

两个PC之间的通信由网关和异地PC之间的IPSec进行保护。

这种方式只能使用隧道模式。

图2-11应用场景

从上图可以看出来,隧道模式可应用于任何场景,传输模式只适用于端到端的模式;但是隧道模式会多一层IP头的开销,所以当使用端到端的情况,建议使用传输模式。

2.2IPSec实现

2.2.1IPSec大体实现思想

SA(SecurityAssociation):

安全联盟。

SA是构成IPSec的基础,是两个通信实体协商建立起来的一种协定。

它决定了用来保护IPSec协议的加密算法、认证算法、密钥以及密钥存活时间等内容。

SA由三个元素定义:

安全协议、唯一安全参数索引(securityparameterindex,SPI)和IP目标。

SA是单向的,发送需要一个SA,接收也需要一个SA;SA由手工或者通过IKE自动协商两种方式创建。

IPSec的主要处理流程,如图2-12所示。

图2-12处理流程图(左:

发包右:

收包)

安全策略是用来匹配看哪些流需要进行IPSec的处理,如果匹配上安全策略则进行IPSec处理。

策略的意义在于,可以把想通过IPSec处理的流(感兴趣流)区分出来,其余的不处理。

安全路由,如图2-13所示,以隧道模式(ESP+AH)为例来说明安全路由,其实就是用路由结构体存放一些处理函数(SA),然后每走一层处理一层,这样的话,扩展性会很好。

被称之为安全路由,后面会详细介绍这方面,所以到这里为止,先有个大体概念。

图2-13安全路由示意图

图2-14所示为IPSEC对于数据包的处理所经过的钩子点,本例中均为隧道模式,由于传输模式只支持点对点,网关上启用IPSEC的情况,基本上用不到传输模式。

数据流经过FORWARDING的时候,会匹配IPSEC安全策略,然后会经过ESP/AH头的处理以及封装外层IP头,封装完后,属于本地发包(正常发包),然后经过LOCAL_OUT->POST_ROUTING发出

当收到IPSEC包的时候,首先收到本地进行处理,验证->解密->除去封装头,然后再放入到收包队列中进行再次收包

这个时候,就是正常的转发包了

图2-14IPSEC处理流程

2.2.2IPSec策略

IPSec策略主要是用来匹配兴趣流(哪些数据包需要进行IPSec的处理)的,当匹配上IPSec策略以后,才会进一步操作,所以IPSec策略是IPSEC处理的基础。

2.2.3数据描述

2.2.2.1安全策略SP

图2-15所示为IPSec策略结构体(安全策略SP)。

其实策略就是用来定义一些条件和操作,当匹配上这些条件的时候,做些什么操作。

有一个元素叫做“选择子”(元素selector),这个选择子就是用来匹配兴趣流(那些流该做IPSEC封装)的东西,所以叫做选择子;

有一个元素叫做“状态模板”(元素xfrm_vec[]),是用来匹配SA(就是当使用IPSEC的时候,如何加密,如何封装等内容)的;

还有一个元素是bundles,这个元素是用来安装安全路由的,这样的话,每次匹配上这个策略后,就不必再去查找bundle,不必再去查找SA了,是为了加速的作用。

图2-15IPSec策略

这个时候,我们可以对着结构体来看IPSEC大体的流程:

图2-16流程(策略角度)

状态选择子(selector):

从数据流的角度定义‘选择的数据流’,被叫做感兴趣流,其中匹配项有对端地址、本段地址、子网掩码、协议簇等信息;

bundles:

被用来安装安全路由(参考图2-11);当查找不到绑定的安全路由的时候,就会先用来查找SA,因为如果要创建一个安全路由,需要使用SA作为材料。

SA为其提供一些参数,比如一些处理函数、genid等。

xfrm_vec[]:

这个模板数组用来匹配SA

策略的机构体structxfrm_policy,如下:

structxfrm_policy

{

#ifdefCONFIG_NET_NS

structnet*xp_net;

#endif

structxfrm_policy*next;/*下一个策略addbylxhforipseckernel,201112.13

structhlist_nodebydst;/*按目的地址HASH的链表,加入到全局链表中init_net->xfrm->policy_bydst相关*/

structhlist_nodebyidx;/*按索引号HASH的链表,加入全局链表中init_net->xfrm->policy_byidx*/

structxfrm_policy*child;//addbylxhforipseckernel,201104.13

/*Thislockonlyaffectselementsexceptforentry.*/

rwlock_tlock;

atomic_trefcnt;/*引用次数*/

structtimer_listtimer;/*策略定时器*/

u32priority;/*策略优先级,如果多个匹配,则使用最高优先级的*/

u32index;/*存放policy_byidx的下标*/

structxfrm_selectorselector;/*选择子*/

structxfrm_lifetime_cfglft;/*策略生命期*/

structxfrm_lifetime_curcurlft;//当前的生命期数据

structdst_entry*bundles;/*安全路由链表*/

structxfrm_policy_walk_entrywalk;/*加入init_net->xfrm->policy_all中*/

u8type;

u8action;/*接受/加密/阻塞等*/

u8flags;/*标记*/

u8xfrm_nr;/*有几个模板,对应本结构体中的数组xfrm_vec[]*/

u16family;/*协议簇*/

//addbylxhforipseckernel,201104.13

u32inbound;/*入方向*/

u32outbound;/*出方向*/

u32pol_type;/*策略类型*/

u32pol_id;/*策略id*/

u32isdynamic;/*是否是动态?

*/

chartunnel_name[32];/*隧道名字*/

u32outbound_sa_spi;/*出方向的spi*/

//endaddbylxhforipseckernel,201104.13

structxfrm_sec_ctx*security;/*安全上下文*/

structxfrm_tmplxfrm_vec[XFRM_MAX_DEPTH];/*状态模板*/

structpolicy_entry*policy_entry;//addbylxhforipseckernel,201104.13

//addedbyliangxiaformatchpeergwip,2012.4.11

//隧道模式,保护子网不变,但对端地址改变

//删除原隧道SA引起新隧道不可用

u32peer_ip;

//addedbyliangxia,2012.12.14

s32dev_index;//接口ifindex

};

2.2.2.2安全联盟SA

上文中多次提到的SA,究竟是以什么组织的,现在来揭开神秘的面纱。

SA的结构体图如下图2-17。

图2-17SA的结构体

内核中SA(SecurityAssociation)是用结构体structxfrm_state来定义,各个字段的含义如下:

/*Fulldescriptionofstateoftransformer.*/

structxfrm_state

{

#ifdefCONFIG_NET_NS

structnet*xs_net;

#endif

union{

structhlist_nodegclist;

structhlist_nodebydst;//按照目的地址HASH,与回收重用

};

structhlist_nodebysrc;//按照源地址HASH

structhlist_nodebyspi;//按照SPI值HASH

atomic_trefcnt;//引用计数

spinlock_tlock;//锁

structxfrm_idid;//SA索引,即目的地址,spi和协议号

structxfrm_selectorsel;//状态选择子

u32genid;//生成id

/*Keymanagerbits*/

structxfrm_state_walkkm;//KEY回调管理处理结构参数

/*Parametersofthisstate.*/

struct{

u32reqid;//请求ID

u8mode;//模式:

传输/通道

u8replay_window;//回放窗口

u8aalgo,ealgo,calgo;//认证,加密,压缩算法ID值

u8flags;//标记

u16family;//协议族

xfrm_address_tsaddr;//源地址(出口地址)

intheader_len;//添加的协议头长度,ESP/AH头(+IP头,隧道模式时)

inttrailer_len;//添加的协议尾长度,ESP才有

}props;//SA相关参数结构

structxfrm_lifetime_cfglft;//生命周期

/*Datafortransformer*/

structxfrm_algo*aalg;//hash算法

structxfrm_algo*ealg;//加密算法

structxfrm_algo*calg;//压缩算法

structxfrm_algo_aead*aead;

/*Dataforencapsulator*/

structxfrm_encap_tmpl*encap;//NAT穿越相关信息

/*Dataforcare-ofaddress*/

xfrm_address_t*coaddr;

/*IPCompneedsanIPIPtunnelforhandlinguncompressedpackets*/

structxfrm_state*tunnel;//通道,实际上是另一个SA

/*Ifatunnel,numberofusers+1*/

atomic_ttunnel_users;//通道的使用数

/*Stateforreplaydetection*/

structxfrm_replay_statereplay;//回放检测结构,包含各种序列号掩码等信息

/*Replaydetectionstateatthetimewesentthelastnotification*/

structxfrm_replay_statepreplay;//上次的回放记录值

/*internalflagthatonlyholdsstatefordelayedaeventatthe

*moment

*/

u32xflags;//标志

/*Replaydetectionnotificationsettings*/

u32replay_maxage;//回放最大时间间隔

u32replay_maxdiff;//回放最大差值

/*Replaydetectionnotificationtimer*/

structtimer_listrtimer;//回放检测定时器

/*Statistics*/

structxfrm_statsstats;//统计值

structxfrm_lifetime_curcurlft;//当前生存周期计数器

structtimer_listtimer;//SA定时器

/*Lastusedtime*/

unsignedlonglastused;

/*Referencetodatacommontoalltheinstancesofthis

*transformer.*/

conststructxfrm_type*type;//类型,ESP/AH,处理指针

structxfrm_mode*inner_mode;//函数处理指针

structxfrm_mode*inner_mode_iaf;//

structxfrm_mode*outer_mode;//函数处理指针

/*Securitycontext*/

structxfrm_sec_ctx*security;//安全上下文,加密时使用

/*Privatedataofthistransformer,formatisopaque,

*interpretedbyxfrm_typemethods.*/

void*data;//内部私有数据,将在esp_init_state/ah_init_state中被赋值

};

2.2.2.3安全路由链表

安全路由链表是用来处理IPSEC包,以及发送的时候用的,最大的好处是灵活。

如图2-18和2-19所示。

对于策略的匹配,SA的匹配,都是为了给数据包skb上添加处理指针,以便在发出的时候进行处理。

当是隧道的模式的时候,最后一个dst_entry是通过查找普通路由得到的;而传输模式,则是直接从skb上拷贝就可以得到,因为当经过FORWARDING的时候

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1