openswan在嵌入式平臺的集成手記

2020-12-18

關鍵字:ipsec、l2tp


 

1、openswan是什麼?

 

openswan是Linux平臺開源的ipsec與l2tp協議的實現方案。

 

ipsec與l2tp都是網絡通信加密的協議,openswan的作用就是對建立在互聯網上的通信進行加密。

 

關於這三者的關係,可以簡單理解成ipsec與l2tp是網絡通信安全的理論基礎,而openswan則是落地的具體方案。

 

2、如何獲取openswan?

 

openswan是開源的,可以直接在Github上找到它的代碼倉庫。這裏貼出它的各版本源碼下載地址:

  https://github.com/xelerance/Openswan/tags

 

這裏以 2.6.38 版本爲例演示openswan在嵌入式平臺的集成過程。

 

將下載下來的源碼壓縮包 Openswan-2.6.38.tar.gz 在合適的地方解壓,解壓後的目錄結構如下圖所示:

 

 

在集成過程中我們可能會關注到的源碼目錄有以下兩個:

  1、lib/libopenswan

  2、programs

 

當然,這裏說的“可能會關注到”不是說庫代碼有問題需要改動,這種版本號很高且很流行的開源庫對於我們這種初次集成的情況來說可以認爲是沒有Bug的。這裏所說的“關注”是因爲可能會因具體的編譯平臺而異要修改部分Makefile語句或配置信息。

 

programs目錄下是ipsec協議與xl2tp協議的實現代碼,裏面會有好幾個默認的文件路徑,如果我們對這些路徑有要求,就需要去具體的源碼裏修改,這點在後文會有提到。

 

其它目錄我們基本不用關心了,畢竟本文的目的是“集成”而不是“剖析”。

 

另外,openswan的編譯產物會統一放到一個名爲 "OBJ.**.**" 的目錄中去。不同平臺會有不一樣的中後綴,這個在Makefile中有配置。

 

3、如何集成?

 

openswan源碼已經有完善的Makefile的了,無須通過configure生成。

 

在其根目錄下有個很重要的文件:Makefile.inc

 

這個文件是用於記載通用配置信息的,如編譯選項、庫等。openswan每一個關鍵的Makefile都會都會引入這個文件,因此,如果我們要自定義編譯方式修改Makefile.inc即可。

 

事實上,openswan建議的是不要動Makefile.inc,如果要定製編譯內容,應該去修改Makefile.vendor。但,我們不接受官方的建議。

 

打開Makefile.inc,在第58行~第132行是配置文件等外部存儲的路徑定義。因爲openswan的編譯產物有很多個可執行程序和腳本,且相互之間存在調用依賴的關係,爲了這些調用能順利完成,程序只能去這些預定的目錄嘗試調用。說白了就是這些目錄定義了不同類型的編譯產物的存放位置。默認情況下是以PC端linux環境來配置的,可能會不適用於嵌入式平臺,解決的辦法要麼修改Makefile.inc中的配置路徑,要麼修改系統文件系統,使其滿足openswan的運行需求。

 

Makefile.inc內容再往下就是定義系統內核代碼目錄的。這個目錄的目的是因爲openswan中攜帶了有不同版本linux系統的內核補丁,庫在編譯過程中可以將補丁打進內核源碼中去。一般不用理會。

 

再往下拉到第519行,這裏是對編譯產物目錄名稱的定義。

 

然後拉到文檔末尾,在合適的位置添加上編譯鏈的定義。當然我們完全可以在敲擊make命令時動態傳入,但是考慮到編譯鏈工具幾乎不會變更,爲了方便編譯,直接在這裏寫死更好。添加的內容如下:

 

這裏必須強調的是,不同平臺編譯鏈名稱不一樣,不可直接照搬筆者的內容。並且你要確保你的編譯鏈工具能被shell認出來才能直接寫工具名稱,否則最好寫絕對路徑。

 

另外,openswan依賴libgmp庫,因此還要在這裏添加上libgmp庫的依賴路徑,同樣,不同平臺libgmp的環境不一樣,需要根據自己的實際情況來填寫路徑信息,筆者這裏只是給出一個模式參考而已:

 

 

可能有些同學的平臺裏沒有集成libgmp開源庫,那就必須先集成好它才能來編譯openswan。libgmp的集成過程不在本文討論範圍,有需要的同學可自行尋找集成辦法。

 

接下來打開 programs/pluto 目錄下的 Makefile 與 Makefile.options 兩個文件,在Makefile中按如下圖所示添加libgmp的依賴路徑,這裏再次提醒,要以各自系統中libgmp具體的路徑爲準,不能照抄筆者的內容。

 

在Makefile.options中按下圖所示刪除 -lgmp 字樣:

 

 

接着再打開 programs/rsakey/Makefile,按下圖所示刪掉 -lgmp 參數:

 

如此,便完成了所有的配置修改,此時再到 openswan 源碼根目錄下開始編譯即可,openswan的編譯命令不是直接make,需要加一個 programs 參數:

make programs

 

此時稍等片刻,不出意外便能正常退出編譯過程,表示編譯完成。編譯產物如下圖所示:

 

 

我們可以直接以 make install 來將產物轉移到合適的位置,當然,前提是你已經正確配置了install輸出目錄。

 

不過,嵌入式平臺通常各種資源都比較緊張,不太可能完整打包編譯產物,更合適的做法是隻將你需要的產物轉移到合適位置即可。這塊具體的做法就不贅述了。

 

 

4、尾記

 

本文記述的步驟是以筆者的嵌入式平臺環境在集成過程中遇到的問題點,不保證絕對適用於任何嵌入式平臺環境。如果很不幸在你的環境下按照本文步驟仍然無法正常編譯,就需要自行費心排錯了。總而言之,openswan的代碼是沒問題的,能出問題的只可能是某些依賴庫沒有正確配置路徑。

 

另外,openswan的運行需要用到衆多busybox中的工具,如果某些需要的工具沒有打開,那麼openswan的運行會直接結束並很可能沒有任何錯誤信息反饋。筆者這邊沒有詳細的busybox依賴列表,只能貼出能正常運行的平臺上busybox已經打開的功能,希望能給有需要的同學一些參考作用,如下圖所示:

 

 

最後,因爲openswan的代碼肯定是改動非常少的模塊,因此,不太建議每次編譯系統鏡像時都編譯openswan的代碼。一種更節省編譯時間的方式是手動編譯成功後將要用到的產物文件額外打包出來,每次編譯系統鏡像時直接拷貝已準備好的產物即可。

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章