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:可選-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 */

這些標誌的使用方式取決於訊息的方向(核心<->使用者)以及原因(配置、查詢或事件)。這將在下面的不同訊息中描述。

在 netlink 中將適當地設定 pid 以識別方向(傳送到核心時為 0,從核心到使用者空間時為 pid = 建立事件的程序 ID)

程式需要訂閱多播組 XFRMNLGRP_AEVENTS 才能收到這些事件的通知。

2) TLV 反映不同的引數:

  1. 位元組值 (XFRMA_LTIME_VAL)

此 TLV 包含自上次事件以來位元組生命週期的執行/當前計數器。

b) 重放值 (XFRMA_REPLAY_VAL)

此 TLV 包含自上次事件以來重放序列的執行/當前計數器。

c) 重放閾值 (XFRMA_REPLAY_THRESH)

此 TLV 包含核心用於在重放序列超出時觸發事件的閾值。

  1. 到期計時器 (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) 訊息型別

  1. 由使用者-->核心發出的 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

  1. XFRM_MSG_NEWAE 由使用者空間發出以配置,或由核心發出以宣佈事件或響應 XFRM_MSG_GETAE。

  1. 使用者 --> 核心以配置特定的 SA。

可以透過傳遞相應的 TLV 來更新任何值或閾值引數。

響應會返回給使用者空間的傳送者,以指示成功或失敗。

如果成功,還會向任何偵聽器發出帶有 XFRM_MSG_NEWAE 的事件,如 iii) 中所述。

  1. 核心->使用者方向,作為對 XFRM_MSG_GETAE 的響應

響應將始終包含 XFRMA_LTIME_VAL 和 XFRMA_REPLAY_VAL TLV。

如果 XFRM_MSG_GETAE 訊息中明確請求,則將包含閾值 TLV。

  1. 核心->使用者以事件形式報告,如果有人使用 XFRM_MSG_NEWAE(如上文 #i 所述)為 SA 設定了任何值或閾值。在這種情況下,會設定 XFRM_AE_CU 標誌,通知使用者此更改是更新的結果。訊息將始終包含 XFRMA_LTIME_VAL 和 XFRMA_REPLAY_VAL TLV。

  2. 核心->使用者以事件形式報告,當重放閾值或超時被超過時。

在這種情況下,會設定 XFRM_AE_CR(重放超出)或 XFRM_AE_CE(超時發生),以告知使用者發生了什麼。請注意,這兩個標誌是互斥的。訊息將始終包含 XFRMA_LTIME_VAL 和 XFRMA_REPLAY_VAL TLV。

閾值設定的例外

如果 SA 受到突發流量的衝擊,導致計時器閾值在未看到資料包的情況下到期,那麼會觀察到以下異常行為:計時器到期後的第一個資料包到達將觸發超時事件;也就是說,我們不等待超時期限或達到資料包閾值。這樣做是為了簡單性和效率。

-JHS