strongswan 對等體封裝模式不一致的處理

2022-03-29 06:37:20 字數 2227 閱讀 8497

ipsec的封裝模式有兩種:transport模式和tunnel模式。當對等體的封裝模式不一致(即一方為transport模式,另一方為tunnel模式)時,雙方協商的結果是建立tunnel模式的ipsec會話。

duta(transport) -------dutb(tunnel)

以ikev2為例分析。在上圖中,假設duta是會話的發起方,duta配置的封裝模式為transport,在ike_auth的請求報文中會攜帶n(use_transp)載荷。dutb在解析到該載荷時會與自己配置的封裝模式比較,因為配置為tunnel模式,故保持自己的封裝模式不變,dutb傳送的ike_auth回應報文中不攜帶n(use_transp)載荷。duta建立的child sa的封裝模式為預設值tunnel模式,並將該模式下發協議棧。需要注意的是,child sa建立時,封裝模式沒有使用配置值,而是預設賦值為tunnel模式。

**如下:

duta構造ike_auth請求報文,呼叫child_create.cbuild_i函式:

其封裝模式是從配置中讀出來的:

然後構造ike_auth請求報文的載荷

注意區分兩個結構:private_child_create_tprivate_child_sa_t

dutb收到n(use_transp)載荷,先將mode設定為transport:

dutb在回覆ike_auth響應報文之前會先按照child_sa到核心:

此時發現自己配置的封裝模式不是transport,於是將封裝模式的值改為tunnel:

後續便不會傳送n(use_transp)載荷。

疑問???

為什麼duta傳送n(use_transp)載荷時,private_child_create_t中的mode是transport,後來沒收到dutb的n(use_transp)載荷,而mode值又變成tunnel了?

原因是,duta在處理dutb的ike_auth響應報文中的載荷時,將mode值改成了tunnel。**如下:

**處理上的細節太多,不多問自己幾個為什麼,真不敢說自己搞懂了

總結一下,private_child_create_t中的mode是由配置值和n(use_transp)載荷按照一定的邏輯共同決定的。而private_child_sa_t中的mode,是在child sa下發協議棧之前,先將private_child_create_t中的mode拷貝過去,然後下發的。而決定ipsec會話封裝模式的,是private_child_create_t中的mode。

自定義結構體封裝

使用nsvalue如下方法進行裝箱 nsvalue valuewithbytes const void value objctype const char type 呼叫下面的方法進行拆箱 void getvalue void value main.m foundationframework cre...

C語言結構體封裝函式指標

c語言結構體 struct 從本質上講是一種自定義的資料型別,只不過這種資料型別比較複雜,是由 int char float 等基本型別組成的。例如,在校學生有姓名 年齡 身高 成績等屬性,學了結構體後,我們就不需要再定義多個變數了,將它們都放到結構體中即可,如圖所示 那麼我們怎麼用c語言的結構體來...

自定義協議封裝包頭 包體

底層通訊訊息類,定義訊息id 訊息體,和初始化 1 using system 23 4 底層通訊訊息 5 6 public class tsocketmessage idisposable 7 2223 public void dispose 24 2829 protected virtual vo...