返回

揭示快速模式下交换第一个报文组的行为机制

后端

1. 快速模式介绍

快速模式是一种简化的IKE协商方式,它只交换一个报文组就完成IKE协商和安全通道建立。快速模式通常用于建立短期的安全连接,例如,在IPsec隧道中,快速模式可以用来建立IPsec隧道两端之间的安全连接。

2. 快速模式下交换第一个报文组的行为机制

在快速模式下,交换第一个报文组的行为机制如下:

  1. 发送方发送一个IKE_SA_INIT请求报文给接收方。
  2. 接收方收到IKE_SA_INIT请求报文后,会检查报文中的信息,包括发送方的身份、提案等。
  3. 如果接收方同意发送方的提案,则会发送一个IKE_SA_INIT响应报文给发送方。
  4. 发送方收到IKE_SA_INIT响应报文后,会检查报文中的信息,包括接收方的身份、提案等。
  5. 如果发送方同意接收方的提案,则会发送一个IKE_SA_CONFIRM请求报文给接收方。
  6. 接收方收到IKE_SA_CONFIRM请求报文后,会检查报文中的信息,包括发送方的身份、提案等。
  7. 如果接收方同意发送方的提案,则会发送一个IKE_SA_CONFIRM响应报文给发送方。
  8. 发送方收到IKE_SA_CONFIRM响应报文后,IKE协商完成,安全通道建立成功。

3. 代码剖析

下面我们通过代码剖析来进一步了解快速模式下交换第一个报文组的行为机制。

在openswan的源码中,快速模式的协商过程主要在quick_outI1()函数中实现。该函数的功能是发送第一个IKE_SA_INIT请求报文。

static bool quick_outI1(struct state *st)
{
    /* send the IKE_SA_INIT */

    st->st_traffic_seen = TRUE;
    eroute_usage(st);

    ipsecdoi_try(st);

    /* ensure SA is unique for aggressive mode */
    if (!st->st_aggressive) {
	st->st_ike_sa = get_sa(st->st_ike_session, &st->st_sa_id, TRUE);
	if (st->st_ike_sa) {
	    log("warning: %s: reusing old SA", st->st_log_name);
	    return FALSE;
	}
    }
    if (st->st_state == STATE_MAIN_R0)
	return quick_outI1_r0(st);
    if (st->st_state == STATE_MAIN_L1)
	return quick_outI1_l1(st);
    if (st->st_state == STATE_MAIN_R1)
	return quick_outI1_r1(st);

    bad_state(st, "quick_outI1()");
    return FALSE;
}

在quick_outI1()函数中,首先会设置st->st_traffic_seen为TRUE,表示该状态已经收到过流量。然后调用eroute_usage()函数来更新路由表。接着调用ipsecdoi_try()函数来尝试建立IPsec DOI。

接下来,会根据st->st_aggressive的值来判断是否需要为快速模式协商生成一个新的SA。如果st->st_aggressive为TRUE,则表示使用激进模式,此时不需要生成新的SA。如果st->st_aggressive为FALSE,则表示使用主模式,此时需要生成新的SA。

最后,根据st->st_state的值来调用不同的函数来发送第一个IKE_SA_INIT请求报文。

4. 示例演示

下面我们通过一个示例来演示快速模式下交换第一个报文组的过程。

# 发送方配置

ikev1 {
    left=192.168.1.1
    right=192.168.1.2
    ike=aes-sha1-modp1536
    esp=aes-sha1
    lifetime=86400
}

# 接收方配置

ikev1 {
    left=192.168.1.2
    right=192.168.1.1
    ike=aes-sha1-modp1536
    esp=aes-sha1
    lifetime=86400
}

首先,在发送方和接收方分别配置IKEv1策略。

然后,启动openswan服务。

# 发送方

/usr/local/sbin/openswan --listen --natt --ikeport 500 --ipsecport 4500

# 接收方

/usr/local/sbin/openswan --listen --natt --ikeport 500 --ipsecport 4500

最后,在发送方发送一个ping包给接收方。

# 发送方

ping 192.168.1.2

在接收方,可以看到收到了ping包。

# 接收方

PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.415 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.391 ms

这表明快速模式协商已经成功,并且已经建立了IPsec安全通道。

5. 总结

快速模式是一种简化的IKE协商方式,它只交换一个报文组就完成IKE协商和安全通道建立。快速模式通常用于建立短期的安全连接,例如,在IPsec隧道中,快速模式可以用来建立IPsec隧道两端之间的安全连接。