#strongswan與xfrm之間的trap機制 [TOC]網絡
你必須同時知道,strongswan,xfrm,strongswan connect trap三個概念。 纔有繼續讀下去的意義。 入門請轉到:【TODO...】數據結構
strongswan的vici配置文件中,child_conn配置項下,有一個配置start_action。裏邊有三個可選的值。 分別爲start,none,trap。none爲默認。 其中start表明在load好配置以後就up該條conn。 而後,有關none與trap將作爲本文的兩個重點討論場景,經過一下篇幅進行考察。 歡迎收看,@_@~~socket
基於前文。咱們如今來解釋一下none與trap的含義。ui
none,表明只加載配置,而不對鏈接進行任何操做。等於控制程序進行觸發conn的up操做。spa
trap,翻譯成中文是陷阱,捕獲的意思。就是說一旦它捕獲了一個包,就要觸發conn的up。 而捕獲這個操做,是經過policy進行的。咱們知道,在strongswan的配置信息一旦進行了加載以後, 它就會下發policy給xfrm,這個捕獲動做正是經過這個預下發的policy來完成的。翻譯
咱們分別用none與trap配置作了兩個實驗。code
[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。ip
很顯然,該實驗並無什麼好實驗的。咱們只觀察一件事情,就是在load的config以後。xfrm裏邊的policy狀況。 以下:ci
[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。
這裏,須要額外補充一條背景知識。 經過閱讀netlink plugin與xfrm接口部分的源碼。並無任何與start_action相關的信息交互。 主要的數據結構中,也都沒有start_action這樣一個概念存在。
注:有關什麼是netlink plugin,以及它在strongswan中的做用,之後補充。。。
經過第四小節中補充的知識,以及第三小節的實驗。咱們能夠推斷出。start_action這個事情是strongswan 在控制層面上的概念。它經過使用預下發不一樣的policy和xfrm的acquire機制,共同實現了這一律念。
acquire是xfrm經過API向上推送給應用程序的一種消息,它的類型是ACQUIRE。
當xfrm收到一個包的時候,這個包命中了某條policy。這條policy卻沒有對應的child sa的時候。 xfrm就會對全部註冊進了xfrm netlink的應用程序廣播這條消息。而後,你便看到了第三小節裏的實驗現象。 strongswan收到這個消息後,主動下發一個新的sa給xfrm。
完了。但願你已經懂了。