1. 程式人生 > 實用技巧 >openswan在嵌入式平臺的整合手記

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的程式碼。一種更節省編譯時間的方式是手動編譯成功後將要用到的產物檔案額外打包出來,每次編譯系統映象時直接拷貝已準備好的產物即可。