strongswan與xfrm之間的trap機制
0.
你必須同時知道,strongswan,xfrm,strongswan connect trap三個概念。
才有繼續讀下去的意義。
入門請轉到:【TODO...】
1. 前言
strongswan的vici配置文件中,child_conn配置項下,有一個配置start_action。里邊有三個可選的值。
分別為start,none,trap。none為默認。
其中start代表在load好配置之后就up該條conn。
然后,有關none與trap將做為本文的兩個重點討論場景,通過一下篇幅進行考察。
歡迎收看,@_@~~
2. 描述
基於前文。我們現在來解釋一下none與trap的含義。
2.1 none
none,代表只加載配置,而不對連接進行任何操作。等於控制程序進行觸發conn的up操作。
2.2 trap
trap,翻譯成中文是陷阱,捕獲的意思。就是說一旦它捕獲了一個包,就要觸發conn的up。
而捕獲這個操作,是通過policy進行的。我們知道,在strongswan的配置信息一旦進行了加載之后,
它就會下發policy給xfrm,這個捕獲動作正是通過這個預下發的policy來完成的。
3. 實驗與過程
我們分別用none與trap配置做了兩個實驗。
3.1 trap實驗
- 首先通過swanctl --load-all命令,將設置為trap的配置信息下發給strongswan。
- 這個時候,storngswan已經預先加載了policy給xfrm,為trap做准備。
通過命令,我們在內核里可以查看到,類似如下的信息。
[root@T9 sbin]# ip xfrm po
src 10.9.0.0/16 dst 10.129.0.0/16
dir out priority 383615 ptype main
tmpl src 192.168.7.9 dst 192.168.7.129
proto esp spi 0xcbbb1290 reqid 1 mode tunnel
src 10.129.0.0/16 dst 10.9.0.0/16
dir fwd priority 383615 ptype main
tmpl src 192.168.7.129 dst 192.168.7.9
proto esp reqid 1 mode tunnel
src 10.129.0.0/16 dst 10.9.0.0/16
dir in priority 383615 ptype main
tmpl src 192.168.7.129 dst 192.168.7.9
proto esp reqid 1 mode tunnel
src 0.0.0.0/0 dst 0.0.0.0/0
socket in priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket out priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket in priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket out priority 0 ptype main
src ::/0 dst ::/0
socket in priority 0 ptype main
src ::/0 dst ::/0
socket out priority 0 ptype main
src ::/0 dst ::/0
socket in priority 0 ptype main
src ::/0 dst ::/0
socket out priority 0 ptype main
-
這個時候,作者在trap strongswan網關后面的子網里發了一個ping包給對方網絡。
可以觀察到網絡通了,是可以ping通的。然后通過ip xfrm命令也能查看到sa已經在kernel
里邊建立里起來。 -
用GBD啟動charon進行,並重復上邊的實驗。
我們能觀察到,在發送第一個ping包之后,有如下現象:
a。 xfrm發送了一條ACQUIRE event給strongswan。
b。strongswan發送了一個NEWSA消息給xfrm。
之后便建立了新的child sa。
3.2 none實驗
很顯然,該實驗並沒有什么好實驗的。我們只觀察一件事情,就是在load的config之后。xfrm里邊的policy情況。
如下:
[root@T9 sbin]# ip xfrm po
src 0.0.0.0/0 dst 0.0.0.0/0
socket in priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket out priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket in priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket out priority 0 ptype main
src ::/0 dst ::/0
socket in priority 0 ptype main
src ::/0 dst ::/0
socket out priority 0 ptype main
src ::/0 dst ::/0
socket in priority 0 ptype main
src ::/0 dst ::/0
socket out priority 0 ptype main
[root@T9 sbin]#
我們可以看到只有默認policy,而沒有任何connection相關的policy。
4 背景知識
這里,需要額外補充一條背景知識。
通過閱讀netlink plugin與xfrm接口部分的源碼。並沒有任何與start_action相關的信息交互。
主要的數據結構中,也都沒有start_action這樣一個概念存在。
注:有關什么是netlink plugin,以及它在strongswan中的作用,以后補充。。。
5. 機制分析
通過第四小節中補充的知識,以及第三小節的實驗。我們可以推斷出。start_action這個事情是strongswan
在控制層面上的概念。它通過使用預下發不同的policy和xfrm的acquire機制,共同實現了這一概念。
5.1 什么是acquire
acquire是xfrm通過API向上推送給應用程序的一種消息,它的類型是ACQUIRE。
5.2 那么,什么時候發送acquire消息呢
當xfrm收到一個包的時候,這個包命中了某條policy。這條policy卻沒有對應的child sa的時候。
xfrm就會對所有注冊進了xfrm netlink的應用程序廣播這條消息。然后,你便看到了第三小節里的實驗現象。
strongswan收到這個消息后,主動下發一個新的sa給xfrm。
6.
完了。希望你已經懂了。