[strongswan] strongswan是如何實現與xfrm之間的trap機制的

#strongswan與xfrm之間的trap機制 [TOC]網絡

0.

你必須同時知道,strongswan,xfrm,strongswan connect trap三個概念。 纔有繼續讀下去的意義。 入門請轉到:【TODO...】數據結構

1. 前言

strongswan的vici配置文件中,child_conn配置項下,有一個配置start_action。裏邊有三個可選的值。 分別爲start,none,trap。none爲默認。 其中start表明在load好配置以後就up該條conn。 而後,有關none與trap將作爲本文的兩個重點討論場景,經過一下篇幅進行考察。 歡迎收看,@_@~~socket

2. 描述

基於前文。咱們如今來解釋一下none與trap的含義。ui

2.1 none

none,表明只加載配置,而不對鏈接進行任何操做。等於控制程序進行觸發conn的up操做。spa

2.2 trap

trap,翻譯成中文是陷阱,捕獲的意思。就是說一旦它捕獲了一個包,就要觸發conn的up。 而捕獲這個操做,是經過policy進行的。咱們知道,在strongswan的配置信息一旦進行了加載以後, 它就會下發policy給xfrm,這個捕獲動做正是經過這個預下發的policy來完成的。翻譯

3. 實驗與過程

咱們分別用none與trap配置作了兩個實驗。code

3.1 trap實驗

  1. 首先經過swanctl --load-all命令,將設置爲trap的配置信息下發給strongswan。
  2. 這個時候,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
  1. 這個時候,做者在trap strongswan網關後面的子網裏發了一個ping包給對方網絡。 能夠觀察到網絡通了,是能夠ping通的。而後經過ip xfrm命令也能查看到sa已經在kernel 裏邊創建裏起來。接口

  2. 用GBD啓動charon進行,並重覆上邊的實驗。 咱們能觀察到,在發送第一個ping包以後,有以下現象: a。 xfrm發送了一條ACQUIRE event給strongswan。 b。strongswan發送了一個NEWSA消息給xfrm。 以後便創建了新的child sa。ip

3.2 none實驗

很顯然,該實驗並無什麼好實驗的。咱們只觀察一件事情,就是在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。

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.

完了。但願你已經懂了。

相關文章
相關標籤/搜索