2.4. 状态同步与连接超时
2.4. 状态同步与连接超时
IKE 端点可以在任何时候忘记与一个 IKE SA 及相应 Child SA 集合相关联的所有状态。这是端点在崩溃并重启时所预期发生的行为。重要的是,当一个端点失败或重新初始化其状态时,另一端应检测到这些情况,并且不要继续通过在已丢弃的 SA 上发送数据包、使它们落入黑洞而浪费网络带宽。
INITIAL_CONTACT 通知断言此 IKE SA 是经过认证的身份之间当前唯一活跃的 IKE SA。它可以在崩溃后建立 IKE SA 时发送,接收方可以使用此信息删除其与相同认证身份之间的任何其他 IKE SA,而无需等待超时。此通知不得由可能被复制的实体发送(例如,允许用户同时从两个远程系统连接到公司防火墙的漫游用户凭据)。INITIAL_CONTACT 通知如果发送,则必须位于第一个 IKE_AUTH 请求或响应中,而不是事后作为单独的交换发送;接收方可以在其他消息中忽略它。
由于 IKE 被设计为即使在来自网络的 DoS 攻击下也能运行,端点不得仅基于任何路由信息(例如 ICMP 消息)或未经密码学保护而到达的 IKE 消息(例如抱怨未知 SPI 的 Notify 消息)就断定另一端已失败。端点必须仅在以下情况下断定另一端已失败:重复尝试联系它都在一个超时时段内没有得到回应,或者在与相同认证身份之间的不同 IKE SA 上收到了一个受到密码学保护的 INITIAL_CONTACT 通知。端点应基于路由信息怀疑另一端已失败,并发起一个请求以查看另一端是否存活。为检查另一端是否存活,IKE 规定了一个空的 INFORMATIONAL 消息(与所有 IKE 请求一样)需要确认(请注意,在 IKE SA 的上下文中,"空"消息由一个 IKE 头后跟一个不包含任何载荷的 Encrypted 载荷组成)。如果最近从另一端收到了一条受到密码学保护的(新鲜的,即未被重传的)消息,则可以忽略未受保护的 Notify 消息。实现必须限制其基于未受保护消息采取行动的速率。
重试次数和超时时长不在本规范中规定,因为它们不影响互操作性。建议在放弃一个 SA 之前,在一段至少几分钟的时间内至少重传消息十几次,但不同的环境可能需要不同的规则。为了成为良好的网络公民,重传时间必须呈指数增长,以避免使网络泛滥并加剧现有的拥塞状况。如果与某个 IKE SA 相关联的所有 SA 上只有出站流量,则必须确认另一端存活以避免黑洞。如果最近没有在某个 IKE SA 或其任何 Child SA 上收到受到密码学保护的消息,系统需要进行存活检查,以防止向一个已死的对端发送消息。(这有时被称为"死对端检测"或"DPD",尽管它实际上检测的是存活的对端,而不是死的对端。)在某个 IKE SA 或其任何 Child SA 上收到一条新鲜的、受到密码学保护的消息,可确保该 IKE SA 及其所有 Child SA 的存活。请注意,这对 IKE 端点的故障模式提出了要求。如果某些故障导致实现无法在所有的关联 SA 上接收,它就需要停止在任何 SA 上发送。如果一个系统创建了能够彼此独立失败的 Child SA,而关联的 IKE SA 却无法发送删除消息,那么该系统必须使用单独的 IKE SA 来协商这些 Child SA。
对 IKE SA 发起者存在一种 DoS 攻击,如果发起者采取适当的谨慎措施则可以避免。由于 SA 建立的前两条消息不受密码学保护,攻击者可能在真实响应者之前响应该发起者的消息,从而破坏连接建立尝试。为防止这种情况,发起者可以愿意接受对其第一条消息的多个响应,将每个响应视为潜在的合法响应,并对此作出回应,然后在收到对其中任何一个请求的有效且受密码学保护的响应时,丢弃所有无效的半开连接。一旦收到密码学上有效的响应,所有后续响应都应被忽略,无论它们是否在密码学上有效。
请注意,根据这些规则,没有理由协商并约定一个 SA 生存期。如果 IKE 基于对 IKE 消息的重复缺乏确认而假定对端已死,那么该 IKE SA 以及通过该 IKE SA 建立的所有 Child SA 都会被删除。
IKE 端点可以随时删除不活跃的 Child SA,以回收用于保存其状态的资源。如果 IKE 端点选择删除 Child SA,它必须向另一端发送 Delete 载荷以通知其删除。它同样可以使 IKE SA 超时。关闭 IKE SA 会隐式关闭所有关联的 Child SA。在这种情况下,IKE 端点应该发送一个指示其已关闭该 IKE SA 的 Delete 载荷,除非另一端已不再响应。