




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、IPSec实现分析目 录1引言11.1编写目的11.2编写背景11.3预期读者和阅读建议11.4文档约定11.5参考资料12详细设计12.1IPSec介绍12.2IPSec实现62.3IPSec发包和收包212.4内核与IKE进程通信253IKE协商介绍273.1主模式(第一阶段)283.2野蛮模式(第一阶段)343.3快速模式(第二阶段)353.4IKE进程状态转换及调用关系384哈希的计算414.1哈希计算414.2DH计算434.3加密材料(RFC2409 Appendix B)485IPSEC穿NAT505.1穿NAT讨论505.2NAT穿越原理535.3NAT穿越实现575.4两种模
2、式对比59版本: 1 封页 21 引言1.1 编写目的编写该文档的目的是为了更好地理IPSec模块。为了能更好地理解IPSec,本详细设计报告描述了IPSec介绍、数据结构、IPSec策略匹配、SA的查找&安全路由的安装、发包和收包过程和IPSec IKE。1.2 编写背景无1.3 预期读者和阅读建议本文档的预期读者包括网关安全模块开发人员。开发人员应重点理解函数实现和数据结构之间的关系。1.4 文档约定IPSec Internet Protocol Security SASecurity Association (安全联盟)SPISecurity parameter index(安全参数索引
3、)AHAuthentication Header (认证头)ESPEncapsulating Security Payload (加密安全载荷)IKEInternet Key Exchange HMAC Keyed-hash Message Authentication Code1.5 参考资料RFC 2401 Security Architecture for the Internet ProtocolRFC 2402 IP Authentication HeaderRFC 2406IP Encapsulating Security Payload (ESP)RFC 2407 The Int
4、ernet IP Security Domain of Interpretation for ISAKMPRFC 2408 Internet Security Association and Key Management Protocol (ISAKMP) RFC 2409 The Internet Key Exchange (IKE) RFC 3947 Negotiation of NAT-Traversal in the IKERFC 3948 UDP Encapsulation of IPsec ESP Packets2 详细设计2.1 IPSec介绍IPSEC(Internet Pro
5、tocol Security)是IETF指定的一个IP层安全框架协议。它提供了在未提供保护的网络环境中传输敏感数据的保护。它定义了IP数据包格式和相关基础结构,以便为网络通信提供端对端、加强的身份验证、完整性、防重放和保密性等。IPSec到底是如何起作用的呢?为了更直观的理解IPSec VPN,图2-1到图2-3说明了:当两个机构通信的重要内容不想被中间人截获到,可以采用的方法。图2-1是最原始的方法,两个机构直接通过Internet进行通信,但是这样的话,很容易遭受中间黑客的截获和对内容的篡改,而两边都无法知道,很可能会造成重要损失。图2-2,两边的机构通过架设自己的专用网络进行通信,这样的
6、话,黑客不修改物理的连接是无法接触到两边的通信内容的,所以比较安全,但是这样的方式会耗费巨大的投资。图2-3,通过架设虚拟的VPN通道就可以使得:1.黑客能截获到报文,但也无法得知内容;2.即便是修改了内容,但两边机构是能检测到报文有无修改。图2-1 普通通信方式图2-2 架设专用网络图2-3 开辟虚拟通道当然VPN有多种,本文着重从IPSec VPN的角度介绍IPSec的原理及实现。IPSec通过两种协议来实现对IP数据包的保护,分别是AH和ESP(下文介绍)。IPSec既可以保护一个完整的IP载荷,也可以保护某个IP载荷的上层协议(例如TCP)。这两种方式的保护取决于两种不同的模式来提供的
7、,如图2-4。图2-4 两种模式传输模式用来保护上层协议,而隧道模式则用来保护整个IP报文。两种协议均能使用两种模式进行数据传输。IPSec提供以下的安全特性: 数据机密性(Confidentiality):IPsec发送方在通过网络传输包前对包进行加密。 数据完整性(Data Integrity):IPsec接收方对发送方发送来的包进行认证,以确保数据在传输过程中没有被篡改。 数据来源认证(Data Authentication):IPsec在接收端可以认证发送IPsec报文的发送端是否合法。 防重放(Anti-Replay):IPsec接收方可检测并拒绝接收过时或重复的报文。2.1.1 封
8、装协议ESPESP(Encapsulating Security Payload)属于IPSec的一种协议,可用于确保IP数据包的机密性(未被别人看过)、数据的完整性以及对数据源的身份验证。ESP的协议号是50,ESP的协议头的格式如图2-5所示。图2-5 ESP头SPI是用于唯一标识SA的一个32比特数值,它在AH和ESP头中传输。在手工配置SA时,需要手工指定SPI的取值。使用IKE协商产生SA时,SPI将随机生成。Sequence Number是单调递增的数值,用来防止重放攻击。Payload Data可变长度,实际要传输的数据。Padding 填充数据,以字节为单位,为了保证数据的对齐
9、。Pad length 填充长度Next Header 下一个头的协议号Authentication Data 可变长度,认证数据ESP同时提供了机密性以及完整性,所以在其SA中必须同时定义两套算法用来确保机密性的算法叫作一个cipher(加密器),而负责完整性的算法叫作authenticator(验证器)。ESP作用的方式,如图2-6。通过加密算法(对称加密DES/3DES/AES)对数据进行加密,然后使用散列函数MD5/SHA-1对报文进行摘要计算,最后把摘要放入ESP校验的部分。图2-6 ESP头的使用通过加密来实现数据的机密性,保证传输过程中,即便是有人截获报文,也无法得知报文的内容;
10、通过ESP校验来实现数据的完整性,如果一旦在传输过程中对内容进行篡改,则校验不通过。当接收方收到包以后,首先检查序列号(防止重放),其次校验数据完整性,最后解密数据成明文。2.1.2 封装协议AHAH(AuthenticationHeader) 协议,用来向 IP通信提供数据完整性和身份验证,同时可以提供抗重播服务。AH的协议号是51,AH的协议头的格式如图2-7所示。图2-7 AH认证头Next Header 占8bit,下一个头的协议号;Payload Len 占8bit,表示AH头的长度,单位是4字节,计算完要减2为什么?;Reserved 占16bit,保留SPI 占32bit,安全参
11、数索引,用来定位SASequence Number 占32bit,序列号,用来抗重播攻击Authentication Data 可变长度,认证数据AH提供了完整性校验、数据源认证及抗重播攻击的能力,但不提供机密性,传输过程中以明文方式进行。AH头作用的方式如图2-8所示。图2-8 AH头的使用跟ESP一样,通过对报文进行散列(MD5/SHA)计算来得到认证数据,有所不同的是加入了HMAC(Keyed-hashed Message Authentication Code,密钥化散列认证代码)的方式。图2-9所示是普通散列认证方式,第步是对明文进行散列计算得到一个散列值,并把散列值和明文一起传送给
12、用户B;第步,当用户B收到信息后,也对明文进行散列计算;第步,用计算得到的散列值2与散列值1进行比较,如果发现不一样,则丢弃数据包(说明传输过程中,有人改动数据包),如果发现一致,则数据包未被改动。但这样的方式,中间人可以篡改信息,并同样计算散列值来实现改动数据包的目的。图2-10所示是HMAC的方式,和图2-9不一样的是,通过加入共享密钥来计算散列值,这样的话,中间人是没有办法改动数据包的。同时HMAC的方式实现了完整性校验和源认证。图2-9 普通散列认证图2-10 HMAC方式认证2.1.3 IPSec应用场景IPSec VPN的应用场景分为3种:1. Site-to-Site(站点到站点
13、或者网关到网关):企业内网(若干PC)之间的数据通过这些网关建立的IPSec隧道实现安全互联。这种方式只能使用隧道模式。2. End-to-End(端到端或者PC到PC): 两个PC之间的通信由两个PC之间的IPSec会话保护,而不是网关。这种方式既可使用传输模式也可使用隧道模式。3. End-to-Site(端到站点或者PC到网关):两个PC之间的通信由网关和异地PC之间的IPSec进行保护。这种方式只能使用隧道模式。图2-11 应用场景从上图可以看出来,隧道模式可应用于任何场景,传输模式只适用于端到端的模式;但是 隧道模式会多一层IP头的开销,所以当使用端到端的情况,建议使用传输模式。2.
14、2 IPSec实现2.2.1 IPSec大体实现思想SA(Security Association):安全联盟。SA是构成IPSec的基础,是两个通信实体协商建立起来的一种协定。它决定了用来保护IPSec协议的加密算法、认证算法、密钥以及密钥存活时间等内容。SA 由三个元素定义:安全协议、唯一安全参数索引 (security parameter index, SPI) 和 IP 目标。SA是单向的,发送需要一个SA,接收也需要一个SA;SA由手工或者通过IKE自动协商两种方式创建。IPSec的主要处理流程,如图2-12所示。图2-12 处理流程图(左:发包 右:收包)安全策略是用来匹配看哪些流
15、需要进行IPSec的处理,如果匹配上安全策略则进行IPSec处理。策略的意义在于,可以把想通过IPSec处理的流(感兴趣流)区分出来,其余的不处理。安全路由,如图2-13所示,以隧道模式(ESP+AH)为例来说明安全路由,其实就是用路由结构体存放一些处理函数(SA),然后每走一层处理一层,这样的话,扩展性会很好。被称之为安全路由,后面会详细介绍这方面,所以到这里为止,先有个大体概念。图2-13 安全路由示意图图2-14 所示为IPSEC对于数据包的处理所经过的钩子点,本例中均为隧道模式,由于传输模式只支持点对点,网关上启用IPSEC的情况,基本上用不到传输模式。数据流经过FORWARDING的
16、时候,会匹配IPSEC安全策略,然后会经过ESP/AH头的处理以及封装外层IP头,封装完后,属于本地发包(正常发包),然后经过LOCAL_OUT-POST_ROUTING发出当收到IPSEC包的时候,首先收到本地进行处理,验证-解密-除去封装头,然后再放入到收包队列中进行再次收包这个时候,就是正常的转发包了图2-14 IPSEC处理流程2.2.2 IPSec策略IPSec策略主要是用来匹配兴趣流(哪些数据包需要进行IPSec的处理)的,当匹配上IPSec策略以后,才会进一步操作,所以IPSec策略是IPSEC处理的基础。2.2.3 数据描述 安全策略SP图2-15所示为IPSec
17、策略结构体(安全策略SP)。其实策略就是用来定义一些条件和操作,当匹配上这些条件的时候,做些什么操作。有一个元素叫做“选择子”(元素selector),这个选择子就是用来匹配兴趣流(那些流该做IPSEC封装)的东西,所以叫做选择子;有一个元素叫做“状态模板”(元素xfrm_vec),是用来匹配SA(就是当使用IPSEC的时候,如何加密,如何封装等内容)的;还有一个元素是bundles,这个元素是用来安装安全路由的,这样的话,每次匹配上这个策略后,就不必再去查找bundle,不必再去查找SA了,是为了加速的作用。图2-15 IPSec策略这个时候,我们可以对着结构体来看IPSEC大体的流程:图2
18、-16 流程(策略角度)状态选择子(selector):从数据流的角度定义选择的数据流,被叫做感兴趣流,其中匹配项有对端地址、本段地址、子网掩码、协议簇等信息;bundles:被用来安装安全路由(参考图2-11);当查找不到绑定的安全路由的时候,就会先用来查找SA,因为如果要创建一个安全路由,需要使用SA作为材料。SA为其提供一些参数,比如一些处理函数、genid等。xfrm_vec:这个模板数组用来匹配SA策略的机构体struct xfrm_policy,如下:struct xfrm_policy#ifdef CONFIG_NET_NSstruct net*xp_net;#endif str
19、uct xfrm_policy*next; /* 下一个策略add by lxh for ipsec kernel, 2011 12.13struct hlist_nodebydst;/*按目的地址HASH的链表,加入到全局链表中init_net-xfrm-policy_bydst相关*/struct hlist_nodebyidx;/*按索引号HASH的链表,加入全局链表中init_net-xfrm-policy_byidx*/struct xfrm_policy*child; /add by lxh for ipsec kernel, 2011 04.13/* This lock only
20、 affects elements except for entry. */rwlock_tlock;atomic_trefcnt;/*引用次数*/struct timer_listtimer;/*策略定时器*/u32priority;/*策略优先级,如果多个匹配,则使用最高优先级的*/u32index;/*存放policy_byidx的下标*/struct xfrm_selectorselector;/*选择子*/struct xfrm_lifetime_cfg lft;/*策略生命期*/struct xfrm_lifetime_cur curlft;/ 当前的生命期数据 struct ds
21、t_entry *bundles;/*安全路由链表*/struct xfrm_policy_walk_entry walk;/*加入init_net-xfrm-policy_all中*/u8type;u8action;/*接受/加密/阻塞等*/u8flags;/*标记*/u8xfrm_nr;/*有几个模板,对应本结构体中的数组xfrm_vec*/u16family;/*协议簇*/add by lxh for ipsec kernel, 2011 04.13u32 inbound;/*入方向*/u32 outbound;/*出方向*/u32 pol_type;/*策略类型*/u32 pol_id
22、;/*策略id*/u32 isdynamic;/*是否是动态?*/char tunnel_name32;/*隧道名字*/u32 outbound_sa_spi;/*出方向的spi*/end add by lxh for ipsec kernel, 2011 04.13struct xfrm_sec_ctx*security;/*安全上下文 */struct xfrm_tmpl xfrm_vecXFRM_MAX_DEPTH;/*状态模板*/struct policy_entry *policy_entry;/add by lxh for ipsec kernel, 2011 04.13/ add
23、ed by liangxia for match peer gw ip, 2012.4.11/ 隧道模式,保护子网不变,但对端地址改变/ 删除原隧道SA 引起新隧道不可用u32peer_ip;/ added by liangxia, 2012.12.14s32dev_index;/接口ifindex ; 安全联盟SA上文中多次提到的SA,究竟是以什么组织的,现在来揭开神秘的面纱。SA的结构体图如下图2-17。图2-17 SA的结构体内核中SA(Security Association)是用结构体struct xfrm_state 来定义,各个字段的含义如下:/* Full des
24、cription of state of transformer. */struct xfrm_state#ifdef CONFIG_NET_NSstruct net*xs_net;#endifunion struct hlist_nodegclist;struct hlist_nodebydst;/按照目的地址HASH,与回收重用;struct hlist_nodebysrc;/按照源地址HASHstruct hlist_nodebyspi;/按照SPI值HASHatomic_trefcnt;/ 引用计数spinlock_tlock;/ 锁struct xfrm_idid;/ SA 索引,即
25、目的地址,spi和协议号struct xfrm_selectorsel;/ 状态选择子u32genid;/生成id/* Key manager bits */struct xfrm_state_walkkm;/ KEY回调管理处理结构参数/* Parameters of this state. */struct u32reqid;/请求IDu8mode;/ 模式: 传输/通道u8replay_window;/ 回放窗口u8aalgo, ealgo, calgo;/ 认证,加密,压缩算法ID值u8flags;/标记u16family;/ 协议族xfrm_address_tsaddr;/ 源地址(
26、出口地址)intheader_len;/ 添加的协议头长度, ESP/AH 头(+IP头,隧道模式时)inttrailer_len;/ 添加的协议尾长度, ESP 才有 props;/ SA相关参数结构struct xfrm_lifetime_cfg lft;/生命周期/* Data for transformer */struct xfrm_algo*aalg;/ hash算法 struct xfrm_algo*ealg;/ 加密算法 struct xfrm_algo*calg;/ 压缩算法 struct xfrm_algo_aead*aead;/* Data for encapsulato
27、r */struct xfrm_encap_tmpl*encap;/NAT穿越相关信息/* Data for care-of address */xfrm_address_t*coaddr;/* IPComp needs an IPIP tunnel for handling uncompressed packets */struct xfrm_state*tunnel;/通道,实际上是另一个SA/* If a tunnel, number of users + 1 */atomic_ttunnel_users;/通道的使用数/* State for replay detection */st
28、ruct xfrm_replay_state replay;/回放检测结构,包含各种序列号掩码等信息 /* Replay detection state at the time we sent the last notification */struct xfrm_replay_state preplay;/ 上次的回放记录值 /* internal flag that only holds state for delayed aevent at the * moment*/u32xflags;/ 标志/* Replay detection notification settings */u3
29、2replay_maxage;/ 回放最大时间间隔u32replay_maxdiff;/ 回放最大差值/* Replay detection notification timer */struct timer_listrtimer;/ 回放检测定时器/* Statistics */struct xfrm_statsstats; / 统计值 struct xfrm_lifetime_cur curlft;/ 当前生存周期计数器struct timer_listtimer;/ SA 定时器/* Last used time */unsigned longlastused;/* Reference
30、to data common to all the instances of this * transformer. */const struct xfrm_type*type;/ 类型, ESP / AH,处理指针struct xfrm_mode*inner_mode;/函数处理指针struct xfrm_mode*inner_mode_iaf;/struct xfrm_mode*outer_mode;/函数处理指针/* Security context */struct xfrm_sec_ctx*security;/ 安全上下文, 加密时使用/* Private data of this
31、transformer, format is opaque, * interpreted by xfrm_type methods. */void*data;/ 内部私有数据, 将在esp_init_state/ ah_init_state 中被赋值; 安全路由链表安全路由链表是用来处理IPSEC包,以及发送的时候用的,最大的好处是灵活。如图2-18和2-19所示。对于策略的匹配,SA的匹配,都是为了给数据包skb上添加处理指针,以便在发出的时候进行处理。当是隧道的模式的时候,最后一个dst_entry是通过查找普通路由得到的;而传输模式,则是直接从skb上拷贝就可以得到,因为当
32、经过FORWARDING的时候,数据包已经是经过路由查找过的(PRE_ROUTING-路由-FORWARDING)。图2-18 安全路由(隧道模式)图2-19 安全路由(传输模式)结构体如下,忽略不关心的部分:struct dst_entrystruct dst_entry *next;struct dst_entry*child; /关联需要处理的下一个安全路由 struct dst_entry*path;struct xfrm_state*xfrm; /关联SA; 策略的相关协议处理结构图2-20 策略相关协议处理结构其中xfrm_policy_afinfo是一个数组,只需要
33、调用封装好的函数,就可以找到对应的处理指针xfrm4_policy_afinfo和xfrm4_dst_ops。这些结构体定义了一些函数例如find_bundle就是用来查找安全路由的。 状态的相关协议处理结构图2-21 状态相关协议处理结构同上,通过调用封装好的函数来获取需要的指针处理,同样是一些回调处理函数,提前初始化好的,例如封装或者解封装的函数。2.2.4 策略匹配策略匹配,如图2-22所示,当一个数据包来的时候,经过FORWARDING,经过访问控制后,就会去匹配安全策略,图2-22 安全策略匹配xfrm_decode_session _xfrm_decode_sessi
34、on(skb, fl, family, 0)afinfo-decode_session(skb, fl, 0)实际上是_decode_session4security_xfrm_decode_session(skb, &fl-secid)_decode_session4中,主要是从skb中解析IP头、四层协议头,并将其放入flowi结构体fl中。具体包括以下一些:如果是UDP协议、TCP协议、SCTP协议或者DCCP协议的话,填充源端口和目的端口(fl-fl_ip_sport 和 fl-fl_ip_dport);如果是ICMP协议的话,填充icmp的类型和码(fl-fl_icmp_type和f
35、l-fl_icmp_code);如果是ESP的话,填充IPSEC的SPI:fl-fl_ipsec_spi如果是AH的话,填充IPSEC的SPI:fl-fl_ipsec_spi如果是COMP的话,也是填充IPSEC的SPI:fl-fl_ipsec_spi其他协议的话,fl-fl_ipsec_spi=0fl-proto存放ip头的协议号fl-fl4_dst存放目的地址fl-fl4_src存放源地址fl-fl4_tos存放ip头中的tos字段值security_xfrm_decode_session是不是空的,取决于宏定义CONFIG_SECURITY_NETWORK_XFRM存不存在,通过查看内核
36、的配置文件.config 并未发现,暂且当做是空的处理吧。xfrm_lookup_fw _xfrm_lookup_by_pol_id(net,&dst,&fl,NULL,0,pol_id)/函数原型是int _xfrm_lookup_by_pol_id(struct net *net, struct dst_entry *dst_p, struct flowi *fl,struct sock *sk, int flags,int pol_id) 。函数_xfrm_lookup_by_pol_id比较关键,涉及到安全策略的匹配,绑定查找,SA的查找,发送SA的协商请求通知IKE,生成安全路由等,
37、都在这个函数中有所体现。如图2-23所示流程图。_xfrm_lookup_by_pol_id这个函数所做的一切工作都是围绕绑定来进行的,主要功能是对于给定的流fl,查找/创建一个bundle(所谓的安全路由)。图2-23 函数_xfrm_lookup_by_pol_id流程图下面一一介绍这几个函数(安全策略匹配xfrm_policy_lookup、查找绑定xfrm_find_bundle、SA的匹配xfrm_tmpl_resolve、创建绑定xfrm_bundle_create)。安全策略的匹配(函数xfrm_policy_lookup),如图2-24所示:图2-24 函数xfrm_polic
38、y_lookup流程绑定查找函数xfrm_find_bundle流程,如图2-25所示。图2-25 绑定查找流程xfrm_find_bundlexfrm_policy_get_afinfo获取处理指针afinfo-find_bundle这个回调实际上是用的全局变量xfrm4_policy_afinfo的find_bundle指针指向的_xfrm4_find_bundle函数。_xfrm4_find_bundle这个函数就是遍历policy中挂载的bundle链表,每个元素与当前流进行匹配(出接口、目的地址、源地址、tos等),如果查找到了,则返回dst的指针,否则返回NULL。暂时还不知道宏C
39、ONFIG_IPSEC_SUPPORT_PNAT相对应的功能是做什么,后面再进一步讨论。xfrm_tmpl_resolve函数比较简单,对每一个策略执行一遍xfrm_tmpl_resolve_one。1. 请求ID,reqid是怎么被赋值的?2. 为什么选择子匹配那么多次?3.图2-26 xfrm_tmpl_resolve流程xfrm_tmpl_resolve 解析模板(策略上的模板是个数组) xfrm_tmpl_resolve_one解析一个模板 xfrm_state_findSA查找 km_query发送SA请求给IKE km-acquire (回调函数发送消息给IKE,需要协商SA,实际
40、上的回调函数是xfrm_send_acquire)xfrm_tmpl_resolve_one通过循环每一个策略上的xfrm_vecXFRM_MAX_DEPTH,然后为调用state查找设置本地地址local,与对端网关的地址remote。注意到的是,首先使用struct xfrm_tmpl结构体中的id.daddr和saddr;然后如果存在接口ifindex,则用其获取地址,来更新本地地址local;如果本地地址仍然没有,则直接查找路由(根据下一跳的网关地址)来获取源地址并赋值给local。然后调用函数xfrm_state_find函数。也需要注意的是,当第一条数据流来的时候,由于没有SA,x
41、frm_state_find函数设置的状态(struct xfrm_state_walk中的state)是XFRM_STATE_ACQ,所以,这里只执行到这里,循环就返回了,返回值是EAGAIN。xfrm_state_find主要是查找现有的xfrm_state,如果没有就新建一个,如果是新建的话,说明SA还没有协商起来,则需要通过函数km_query通知IKE进行SA的协商。SA的状态:XFRM_STATE_ACQ:正在协商XFRM_STATE_VALID:SA有效,可以使用XFRM_STATE_ERROR:错误状态XFRM_STATE_EXPIRED:SA过期XFRM_STATE_DEAD
42、:准备回收资源xfrm_tmpl_resolve的返回值可以是匹配的SA个数,并通过传入的参数返回SA;xfrm_tmpl_resolve的返回值还可以是错误信息,比如-EAGAIN,则_xfrm_lookup_by_pol_id函数也会返回- EREMOTE,当函数xfrm_lookup_fw收到返回值是-EREMOTE的时候,会将dst_p释放掉。当第一个包执行到这里的时候,数据包上的dst已经有值了,是转发包,但是IPSEC这个时候的处理是将其释放掉了,然后再返回给策略-EAGAIN。然后xfrm4_route_forward 返回非0,ipsec_policy_entry_ok会将这个
43、数据包丢弃掉。2.3 IPSec发包和收包2.3.1 转发包的IPSec封装处理流程图2-27 转发流程数据包经过FORWARDING这个HOOK点后,匹配过安全策略,此时已经更新过skb-_skb_dst,所以在ip_forward_finish会调用xfrm4_output。xfrm4_output会首先过POST_ROUTING的钩子函数,最后调用xfrm4_output_finish函数,调用关系如上图所示,这些函数都是为了对于IPSEC头的处理,以及加密认证等功能,最后会转入LOCAL_OUT重新发包(隧道模式)。xfrm4_output函数,如图2-28,比较简单,带条件进行POS
44、T_ROUTING上的钩子函数调用,如果!(IPCB(skb)-flags & IPSKB_REROUTED)为0,则不过该HOOK上的钩子函数;为1则调用钩子函数。换句话说,就是当skb的flags存在IPSKB_REROUTED标记的时候,不过钩子函数;当flags不存在IPSKB_REROUTED标记的时候,过钩子函数。图2-28 xfrm4_output代码在xfrm4_output_finish函数中,当发现是普通包的时候(没有SA),就设置标记IPSKB_REROUTED;在ip_finish_output函数中,当发现是IPSec包的时候(路由上有SA),就设置标记IPSKB_R
45、EROUTED。目前并未发现什么情况下会这样走?xfrm4_output_finish函数,设置标记IPSKB_XFRM_TRANSFORMED,然后更新skb-protocol为ETH_P_IP,然后调用函数xfrm_output。xfrm_output函数,处理传输模式下的分片重组,和校验检查处理,最后调用函数xfrm_output2。xfrm_output2没做别的操作,直接调用函数xfrm_output_resume。xfrm_output_resume函数,是最关键的函数之一,该函数按照安全路由链表对数据包skb进行处理,并重新过LOCAL_OUT这个hook上的钩子函数,最后调用按
46、照普通包过POST_ROUTING,并最终将包发出去。图2-29 xfrm_output与xfrm_output_one流程图从安全路由的角度,以AH+ESP头为例看下封包流程:图2-30 封包流程图介绍完了转发包,我们回过头来看下本地发包的情况。这里把本地发包和转发包放在一个图中,如图所示。说明是转发包的路径;是本地发包的路径;是公共路径部分。本地发包的时候,会调用查找路由的函数ip_route_output_flow,在这个函数中,会调用_xfrm_lookup_by_pol_id(匹配安全策略,安装安全路由相关,上文已经介绍过),所以当过完LOCAL_OUT这个HOOK点后,挂载skb上
47、的函数是xfrm4_output,然后过POST_ROUTING点上挂载的钩子函数,过完钩子函数,然后调用xfrm4_output_finish函数处理IPSEC包,最后调用_ip_local_out函数将本数据包从本地发出:_ip_local_out LOCAL_OUT钩子函数ip_outputPOST_ROUTING钩子函数ip_finish_output 。图2-31 本地发包示意图另外,icmp_send和ip_xfrm_me_harder(nf_nat_out)待查也有对于IPSEC查找策略的调用,有待查明使用情况。2.3.2 IPSec收包解封装处理转发路径:ip_rcv()ip_
48、rcv_finish()ip_local_deliver()ip_local_deliver_finish。图2-32 收包流程在函数ip_local_deliver_finish中,会取出IP头中的传输协议,然后根据数组inet_protos协议号得到处理指针,然后调用回调handlerip_local_deliver_finishipprot-handler(对于AH或者ESP来说,是xfrm4_rcv)图2-33 AH和ESP协议处理指针调用关系:xfrm4_rcv xfrm4_rcv_spi xfrm4_rcv_encap xfrm_inputxfrm_input函数是街封包的核心函数
49、。见流程图2-32所示。图2-34 解封装流程2.4 内核与IKE进程通信2.4.1 策略的增删改策略的获取、添加、更新或者删除用户态通过类型XFRM_MSG_NEWPOLICY、XFRM_MSG_UPDPOLICY或者XFRM_MSG_DELPOLICY通知内核添加Policy:netlink_raw_eroute (根据操作码区分是增、改还是删除) netlink_policy对于获取来说,调用的地方有三个,这三个函数中,存在代码冗余:netlink_get_policy 、find_matched_policy、netlink_policy_expire2.4.2 请求建立SA内核通过类
50、型XFRM_MSG_ACQUIRE发送Netlink消息给用户态的IKE进程,来告诉IKE进程,需要协商SA。build_acquire (内核态函数)netlink_acquire (用户态函数)2.4.3 SA的添加IKE进程通过Netlink消息把协商好的SA告诉内核,消息类型是XFRM_MSG_UPDSA或者XFRM_MSG_NEWSA,见以下调用关系:install_inbound_ipsec_sa或者install_ipsec_sa setup_half_ipsec_sa kernel_ops-add_sa (netlink_add_sa 消息XFRM_MSG_UPDSA或者XFR
51、M_MSG_NEWSA)2.4.4 SA的删除SA超时,内核会通过Netlink发送消息(消息类型是XFRM_MSG_EXPIRE)给IKE进程,IKE进程收到后删除SA:build_expire (内核态)netlink_expire delete_stateIKE接收到删除载荷,对方发过来删除SA的消息:accept_delete () delete_state delete_ipsec_sa teardown_half_ipsec_sa del_spi kernel_ops-del_sa (netlink_del_sa 消息XFRM_MSG_DELSA)扩展认证失败,则删除SA:xaut
52、h_inI0 或者 xauth_inI1 delete_state 扩展认证响应,错误状态,删除SA:xauth_inR1或者xauth_inR2 delete_state如果开启同步功能,用户态通过监听netlink的socket进行SA同步syn_sa_states_funcdel_established_state (消息SYN_ESTABLISHED_STATE_DEL) clear_syn_sates_by_synid delete_state命令的方式清除SA (进程间通信IKE_CLEAR_SA):ike_clear_sa_cmd clear_states_by_id () fi
53、nd_same_conn_states_to_clearike_clear_sa_cmdclear_states_by_id_only () delete_stateclear_all_states清除所有的SAdelete_stateclear_sates_by_phase根据阶段去删除delete_stateclear_sates_by_phase2delete_stateclear_sates_by_phase3delete_statedelete_states_by_connection 根据连接删除SAdelete_statefind_phase2_state_to_cleardelete_state2.4.5 从内核读取SA检查在idle_max这段时间内,是否有流量。如果有流量,则不需要发送DPD(Dead Peer Detection RFC 3706)检测包,如果没有流量,则发送DPD检测包。dpd_init event_schedule (事件EVENT_DPD) dpd_outI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年上半年合肥市肥西县事业单位公开招聘工作人员笔试总笔试历年典型考题及考点剖析附带答案详解
- 医学科普教学课件
- 仓储设施设备教学课件
- 第三章酸碱反应和沉淀反应3.4沉淀反应55课件
- 第六章食品的物理特性分析第一节相对密度法第二节折光法第三节
- Brand KPIs for milk:Müller in the United Kingdom-英文培训课件2025
- 2025年农业物联网精准种植中的智能农业物联网设备研发报告
- 医疗器械临床试验质量管理与规范化操作手册应用指南解读报告
- 人才补助经费管理办法
- 数字艺术作品版权保护法律风险防范:2025年市场案例分析报告
- 党建能力测试题及答案
- DB11T 2442-2025 学校食堂异物管控规范
- 企业防汛培训课件模板
- 2025年武汉市汉阳区社区干事岗位招聘考试笔试试题(含答案)
- 接警调度培训课件
- GB/T 24610.1-2019滚动轴承振动测量方法第1部分:基础
- GA/T 1469-2018光纤振动入侵探测系统工程技术规范
- 未闻花名钢琴谱乐谱
- DL∕T 5622-2021 太阳能热发电厂储热系统设计规范
- 领军人才选拔试题答案
- CNC数控车床操作指导书
评论
0/150
提交评论