子标题:ipsec rekey是否会导致丢包

author: classic_tong

前言

什么叫rekey。

rekey是指ipsec的通信两端定期更换加密信道秘钥的机制。

为了安全性考虑,随着秘钥使用时间的延迟,对称秘钥被破解的可能性会逐渐增大。所以,定期更换

对称秘钥,是保证ipsec安全性的必要手段。

我们知道key有两个key,IKE sa的key和child sa(ipsec sa)的key。所以rekey也有两个,ike rekey

和child rekey。

这里只讨论child sa的rekey。

所有内容,都来自这里:https://tools.ietf.org/html/rfc7296#section-2.8

一 概念

rekey是指,一旦满足rekey条件(soft条件)时,会向另一端发送一个CREATE_CHILD_SA请求消息,另一个端回复

一个CREATE_CHILD_SA响应消息。从而协商出一个新的sa的过程。

这个时候,旧的SA并没有被删除,一旦瞒住删除条件(hard条件)时,旧的SA会被满足条件的一段,通过INFORMATION条件触发删除。

rekey的触发条件分三种,时间触发,报数触发,字节数触发。其中各又被分为soft和hard两种条件。用来分别触发上边的描述。

例如:设置了时间触发为100秒。就是指child sa在协商建立之后的100秒,会启动rekey流程。

在这个例子里,已strongswan的实现为例,hard = 100秒 + random秒。soft = hard × 90%

也就是在soft秒的时候,一端会建立新的sa。到hard秒的时候会删掉旧的sa。

报数与字节数同理,soft永远会先于hard条件到达。

这里。请注意这个时间差(hard - soft),这是rekey机制的一个潜在的条件。在这个时间段内,必须做好两件事情,才能保证

rekey过程的平滑,也就是ESP包不丢失。

第一件事情是完成两端的新SA的建立。

第二件事情是两端都完成流量从旧SA到新SA的切换。

在ikev2中,以上触发条件是在ipsec的两端本地设置的。彼此不协商。谁先到底条件,谁就会发起rekey。

在ikev1中,以上条件是协商处理的。我们只讨论ikev2.

二 流程

rekey的常规流程逻辑是不会导致丢包的,利用下图,做详情讲解:

该图的左边是首先发生rekey的一方,右边是ipsec链接的另一方。

1. 左边到达rekey的soft触发条件。

2. 左边发送新建sa的请求消息。

3. 右边收到消息后,开始在本地创建新的SA。

4. 右边发送新建sa的响应消息。但是这里有一个条件就是在发送这个包之前,必须保证本地的新SA已经完全就绪,并且随时可用。

  在这之后,右边必须仍旧使用旧的SA发送ESP消息。

5. 左边收到响应消息后,在本地完成新SA的创建过程。

  新的SA建立好之后,右边将切换使用新的SA给对端发送ESP消息。

6. 右边收到的新SA发送过来的消息之后,并且解密成功。这个时候说明左边的新SA已经就绪了。

  于是右边将流量从旧的SA切换到新的SA上面去。

7. 右边可以使用新的SA发送ESP消息了。

至此,新的SA已经完成了建立和切换的过程,并且不会导致丢包。

8. 左边到达rekey的hard条件

9. 左边发送删除旧SA的请求。

10,右边回应删除旧SA的请求。

至此,rekey过程完成。

需要特别说明的是,又可以在rekey期间,左边并没有需要发给对方的ESP报文时。它会发一个假的过去,触发对方切换SA。

或者,当右边没有收到任何新SA的ESP报文,但是却收到了旧SA的删除请求时,它也会进行SA的切换。(也就是说没有收到图中的5,直接收到了9)

总结一下,这里边两个关键的逻辑在4和6上面。

只要是正确的ipsec实现,4上面都不会有问题。所以在6的一些特殊情况下,会导致rekey期间的丢包。

比如,hard减去soft的时间过短,短到左边的sa创建流程没有及时完成,便触发了右边的流量切换。

三 多出来的SA

第一小节中random的作用是为了防止两端同时rekey的出现。

例如我们一般在配置两边的ipsec隧道时,通常会采用相同的配置,如rekey time=3600秒。

这个时候如果没有random时间,两边会同时发起rekey。

同时发起rekey的情况下,两侧的新建sa都会成功,这个时候会出现三个SA。

每一端都会各自独立检测这个场景,然后发现同时rekey的出现。然后会由发起的人来删除nonce比较小的那个一个SA。

以此到达删除重复sa的目的。

四 其他

RFC里,读到一句话,也不知道什么情况下会出现TS和算法会和就的SA不同。

Note that, when rekeying, the new Child SA SHOULD NOT have different Traffic Selectors and algorithms than the old one.

[ike][ipsec] child sa rekey机制的细节分析的更多相关文章

  1. [ipsec] 特别硬核的ike/ipsec NAT穿越机制分析

    〇 前言 这怕是最后一篇关于IKE,IPSEC的文字了,因为不能没完没了. 所以,我一直在想这个标题该叫什么.总的来说可以将其概括为:IKE NAT穿越机制的分析. 但是,同时它也回答了以下问题: ( ...

  2. [ipsec][crypto] ike/ipsec与tls的认证机制比较

    前言 接上篇:[ipsec][crypto] 有点不同的数字证书到底是什么 本篇内容主要是上一篇内容的延伸.抽象的从概念上理解了证书是什么之后,我们接下来 从实践的角度出发,以IKEv2和TLS两个协 ...

  3. ssl & ike/ipsec

    SSL/TLS

  4. Redis数据持久化机制AOF原理分析一---转

    http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...

  5. Ext.create细节分析

    var win1 = Ext.create('Ext.window.Window', { //实例化方法四 : 使用 完整的 Extjs 类名 width: 800, title: 'define t ...

  6. Android事件分发机制源码分析

    Android事件分发机制源码分析 Android事件分发机制源码分析 Part1事件来源以及传递顺序 Activity分发事件源码 PhoneWindow分发事件源码 小结 Part2ViewGro ...

  7. Linux内核OOM机制的详细分析(转)

    Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典 ...

  8. rip路由协议 细节分析及实例配置【完整版】

    rip路由协议 细节分析及实例配置[完整版] RIP呢,这是一个比较重要的知识点,所以它的知识覆盖面很广泛:但是呢,我将会对碰到的问题进行一些分析解刨(主要是为了帮助自己理清思维):也希望能够从中发现 ...

  9. Springboot学习04-默认错误页面加载机制源码分析

    Springboot学习04-默认错误页面加载机制源码分析 前沿 希望通过本文的学习,对错误页面的加载机制有这更神的理解 正文 1-Springboot错误页面展示 2-Springboot默认错误处 ...

随机推荐

  1. 初识Neo4j

    Neo4j是一个世界领先的开源图形数据库. 它是由Neo技术使用Java语言完全开发的. Neo4j的优点 它很容易表示连接的数据 检索/遍历/导航更多的连接数据是非常容易和快速的 它非常容易地表示半 ...

  2. 讲解JavaScript中对闭包的理解

    1.JS中变量的作用域 在理解闭包之前,我们得弄清楚JS中变量的作用域原理,它分为全局作用域和局部作用域,它有一个特点就是局部可以获取全局的声明变量,而全局却不能得到局部声明的变量,我们先来看一个小例 ...

  3. 自己实现简单版的注解Mybatis

    Mybatis属于ORM(Object Relational Mapping)框架,将java对象和关系型数据库建立映射关系,方便对数据库进行操作,其底层还是对jdbc的封装. 实现的思路是: 1 定 ...

  4. JAVAWEB实现增删查改(图书信息管理)之添加功能实现

    addBooks.jsp页面代码:↓ <%-- Created by IntelliJ IDEA. User: NFS Date: 2019-7-12 Time: 14:30 To change ...

  5. CF991E Bus Number

    题意翻译 给你一个数字序列A(长度不超过18位),问有多少个序列B满足①A中所有数字都一定要在B中出现过:②B中所有数字也一定要在A中出现过:③序列B不能以0开头 输入 #1 97 输出 #1 2 解 ...

  6. 电路板工艺中的NPTH和PTH

    今天收到PCB生产公司发来的工程咨询单 Q1:请问贵司资料中的沉头孔是做PTH沉头还是做NPTH沉头? 好吧,鄙人见识少,第一次听说PTH和NPTH,查资料吧,一张图看一下就明白了. 另一种比较小的P ...

  7. array_walk、array_map、array_filter 的用法

    array_walk.array_map.array_filter  和 foreach 都有循环对数组元素进行处理的功能. 一.array_walk 用法 1.循环数组,回调处理(并不修改数组元素的 ...

  8. JSP页面验证码实现

    首先在JSP页面加上生成图片的链接 <img type="image" src="auth/authCode" id="codeImage&qu ...

  9. 3.01定义常量之define

    [注:本程序验证是使用vs2013版] #include <stdio.h> #include <stdlib.h> #include <string.h> #pr ...

  10. angularjs 动态加载指令------编译服务$compile

    场景: 我们写了一个自定义的指令,这条指令需要一些数据,而这些数据需要在某些操作之后才能就绪,这时候,我们就需要在数据就绪之后,动态加载指令. 示例: js: $scope.$watch('repor ...