文章目录
1. IKEv2 协商总体框架
IKEv1协议建立一对IPSec SA,使用主动模式需要9个报文,使用野蛮模式需要使用6个报文方能协商成功。IKEv2对IKEv1协议进行了优化,IKEv2只需要进行两次交互,使用 4 条消息就可以完成一个 IKEv2 SA 和一对 IPsec SA 的协商建立。IKEv2 定义了三种交互:
-
初始交换、
-
创建子 SA 交换
-
通知交换。
下面简单介绍一下 IKEv2 协商过程中的初始交换过程:
初始化交换通过两次交换共4个报文便可以完成一对IKE SA和IPSec SA的协商。上图主要用来描述协商报文的内容和对应的处理函数入口。下图则是用来说明各接口对应的协商状态。协商过程中是根据该状态来确定当前的协商阶段。
RFC文档中的报文格式:
Initiator Responder
-------------------------------------------------------------------
HDR, SAi1, KEi, Ni -->
<-- HDR, SAr1, KEr, Nr, [CERTREQ]
HDR, SK {
IDi, [CERT,] [CERTREQ,]
[IDr,] AUTH, SAi2,
TSi, TSr} -->
<-- HDR, SK {
IDr, [CERT,] AUTH,
SAr2, TSi, TSr}
其中:
报文字段 | 说明 |
---|---|
HDR | 报文头部 |
SAi1、SAr1 | IKE SA建议 |
SAi2、SAr2 | IPSEC SA建议载荷 |
KEi、KEr | DH算法公共值 |
Ni、Nr | Nonce随机数 |
CERT、CERTREQ | 证书载荷、证书请求载荷 |
IDi、IDr | ID载荷 |
TSi、TSr | 流量选择器,使用此载荷完成保护子网的协商 |
AUTH | 认证数据载荷 |
这里面需要说明的是:报文中的SK并不是一个载荷。而是:SK {…}表示里面的内容被加密和认证保护。
2. 第一包流程图
3. openswan源码学习
3.1 ikev2parent_outI1()
此函数是IKEv2协议发起协商的入口函数。主要功能为:
- 新建一个协商状态结构:state
- 发起端随机成功Cookie值
- 将连接上的参数信息、配置信息初始化state结构上参数
- 隧道本端IP和端口
- 隧道对端IP和端口
- 隧道的出接口
- 配置策略
- … …
stf_status
ikev2parent_outI1(int whack_sock
, struct connection *c
, struct state *predecessor
, so_serial_t *newstateno
, lset_t policy
, unsigned long try
, enum crypto_importance importance
, struct xfrm_user_sec_ctx_ike * uctx UNUSED
)
{
struct state *st = new_state();
/*发起端随机生成cookie值*/
get_cookie(TRUE, st->st_icookie, COOKIE_SIZE, &c->spd.that.host_addr);
/*将连接上的信息初始化到状态上*/
initialize_new_state(st, c, policy, try, whack_sock, importance);
if(newstateno) *newstateno = st->st_serialno;
/*
* initialize the local end point address, so that NAT calculation will
* have something to work with.
*
*在set_state_ike_endpoints中将隧道两端的地址更新到了st_localaddr,st_port上
*这里再次修改为出接口的地址和端口,暂不清楚用意
*/
st->st_localaddr = st->st_interface->ip_addr;
st->st_localport = st->st_interface->port;
return
ikev2parent_outI1_withstate(st, whack_sock, c
, predecessor, policy
, try, importance
, uctx);
}
3.2 ikev2parent_outI1_withstate()
此函数的主要功能包括如下几个方面:
- 根据配置策略(认证方式: PSK or RSA etc.)选择使用的SADB模板
- 根据配置的算法信息(alg_info_ike)生成对应的SADB结构
- 将SADB由IK