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


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實驗

  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。

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.

完了。希望你已經懂了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM