跳到主要内容

2.4. State Synchronization and Connection Timeouts (状态同步与连接超时)

2.4. State Synchronization and Connection Timeouts (状态同步与连接超时)

允许 IKE 端点在任意时刻忘记与某个 IKE SA 及其对应 Child SA 集合相关的全部状态. 这是端点崩溃并重启时的预期行为. 当某端点故障或重新初始化其状态时, 另一端的检测十分重要, 以免继续在已丢弃的 SA 上发送分组导致带宽浪费并落入黑洞.

INITIAL_CONTACT 通知断言: 在已认证身份之间, 当前仅有此 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 上未收到受密码学保护的消息, 系统需要执行存活检查, 以免向已死对等方发送消息. (有时称为 "dead peer detection" 或 "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 以及通过它建立的全部 Child SA.

IKE 端点可随时删除不活动的 Child SA 以回收保存其状态所用的资源. 若选择删除 Child SA, 必须向对端发送 Delete 载荷通知删除. 亦可类似地对 IKE SA 做超时. 关闭 IKE SA 隐式关闭所有关联的 Child SA. 此时, IKE 端点应该发送 Delete 载荷表明已关闭 IKE SA, 除非对端已不再响应.