XFRM¶
同步补丁工作基于 Krisztian <hidden@balabit.hu> 和其他人的初始补丁以及 Jamal <hadi@cyberus.ca> 的额外补丁。
同步的最终目标是能够插入属性 + 生成事件,以便 SA 可以安全地从一台机器移动到另一台机器,以实现 HA 目的。 这个想法是同步 SA,以便接管机器在可以访问 SA 的情况下尽可能准确地处理 SA。
我们已经能够生成 SA 添加/删除/更新事件。 这些补丁增加了同步能力,并具有准确的生命周期字节(以确保 SA 的适当衰减)和重放计数器,以避免在故障转移时尽可能减少损失的重放攻击。 这样,备份成员就可以像活动成员一样保持最新状态。
由于上述项目对于 SA 接收的每个数据包都会发生变化,因此可能会生成大量事件。 因此,我们还添加了一种类似 nagle 的算法来限制事件。 即,我们将设置阈值来说“如果达到重放序列阈值或已过去 10 秒,请通知我”。这些阈值通过 sysctl 在系统范围内设置,也可以按 SA 更新。
需要同步的已识别项目是:-生命周期字节计数器 注意:如果您假设故障转移机器是预先知道的,那么生命周期时间限制并不重要,因为时间倒计时的衰减不是由数据包到达驱动的。- 入站和出站的重放序列
1) 消息结构¶
nlmsghdr:aevent_id:optional-TLVs。
netlink 消息类型为
XFRM_MSG_NEWAE 和 XFRM_MSG_GETAE。
XFRM_MSG_GETAE 没有 TLV。
XFRM_MSG_NEWAE 将至少有两个 TLV(如下所述)。
aevent_id 结构如下所示
struct xfrm_aevent_id {
struct xfrm_usersa_id sa_id;
xfrm_address_t saddr;
__u32 flags;
__u32 reqid;
};
唯一 SA 由 xfrm_usersa_id、reqid 和 saddr 的组合标识。
标志用于指示不同的内容。 可能的标志是
XFRM_AE_RTHR=1, /* replay threshold*/
XFRM_AE_RVAL=2, /* replay value */
XFRM_AE_LVAL=4, /* lifetime value */
XFRM_AE_ETHR=8, /* expiry timer threshold */
XFRM_AE_CR=16, /* Event cause is replay update */
XFRM_AE_CE=32, /* Event cause is timer expiry */
XFRM_AE_CU=64, /* Event cause is policy update */
这些标志的使用方式取决于消息的方向(内核<->用户)以及原因(配置、查询或事件)。 这在以下不同消息中描述。
pid 将在 netlink 中进行适当设置,以识别方向(0 到内核,pid = 从内核到用户空间创建事件的进程 ID)
程序需要订阅多播组 XFRMNLGRP_AEVENTS 才能收到这些事件的通知。
2) TLV 反映不同的参数:¶
字节值 (XFRMA_LTIME_VAL)
此 TLV 携带自上次事件以来字节生命周期的运行/当前计数器。
b) 重放值 (XFRMA_REPLAY_VAL)
此 TLV 携带自上次事件以来重放序列的运行/当前计数器。
c) 重放阈值 (XFRMA_REPLAY_THRESH)
此 TLV 携带内核用于在超出重放序列时触发事件的阈值。
到期计时器 (XFRMA_ETIMER_THRESH)
这是一个以毫秒为单位的计时器值,用作 nagle 值来限制事件速率。
3) 参数的默认配置:¶
默认情况下,除非至少有一个侦听器注册以侦听多播组 XFRMNLGRP_AEVENTS,否则这些事件应该关闭。
安装 SA 的程序将需要指定两个阈值,但是,为了不更改诸如 racoon 之类的现有应用程序,如果未指定这些不同参数,我们还为这些不同参数提供默认阈值。
两个 sysctl/proc 条目是
a) /proc/sys/net/core/sysctl_xfrm_aevent_etime,用于以 100 毫秒的增量时间单位为 XFRMA_ETIMER_THRESH 提供默认值。 默认值为 10(1 秒)
b) /proc/sys/net/core/sysctl_xfrm_aevent_rseqth,用于以增量数据包计数为 XFRMA_REPLAY_THRESH 参数提供默认值。 默认值为两个数据包。
4) 消息类型¶
用户发出 --> 内核的 XFRM_MSG_GETAE。 XFRM_MSG_GETAE 不携带任何 TLV。
响应是 XFRM_MSG_NEWAE,其格式基于 XFRM_MSG_GETAE 查询的内容。
响应将始终具有 XFRMA_LTIME_VAL 和 XFRMA_REPLAY_VAL TLV。* 如果设置了 XFRM_AE_RTHR 标志,则还会检索 XFRMA_REPLAY_THRESH * 如果设置了 XFRM_AE_ETHR 标志,则还会检索 XFRMA_ETIMER_THRESH
XFRM_MSG_NEWAE 由用户空间发出以配置,或由内核发出以宣布事件或响应 XFRM_MSG_GETAE。
用户 --> 内核来配置特定的 SA。
可以通过传递适当的 TLV 来更新任何值或阈值参数。
响应会发回用户空间中的发送者,以指示成功或失败。
如果成功,还会向任何侦听器发出 XFRM_MSG_NEWAE 事件,如 iii) 中所述。
内核 -> 用户方向,作为对 XFRM_MSG_GETAE 的响应
响应将始终具有 XFRMA_LTIME_VAL 和 XFRMA_REPLAY_VAL TLV。
如果 XFRM_MSG_GETAE 消息中明确请求,则将包含阈值 TLV。
内核->用户报告事件,如果有人使用 XFRM_MSG_NEWAE 为 SA 设置任何值或阈值(如上面的 #i 中所述)。 在这种情况下,会设置 XFRM_AE_CU 标志,以通知用户更改是更新的结果。 该消息将始终具有 XFRMA_LTIME_VAL 和 XFRMA_REPLAY_VAL TLV。
内核 -> 用户,以便在超出重放阈值或超时时报告事件。
在这种情况下,会设置 XFRM_AE_CR(超出重放)或 XFRM_AE_CE(发生超时),以通知用户发生了什么。 请注意,这两个标志是互斥的。 该消息将始终具有 XFRMA_LTIME_VAL 和 XFRMA_REPLAY_VAL TLV。
阈值设置的例外情况¶
如果您的 SA 受到突发流量的影响,以至于在一段时间内,计时器阈值在没有看到任何数据包的情况下过期,则会看到如下奇怪的行为:计时器过期后到达的第一个数据包将触发超时事件; 即,我们不会等待超时时间或达到数据包阈值。 这样做是为了简单和效率。
-JHS