發表文章

目前顯示的是 六月, 2009的文章

Openswan Porting to Pronghorn-Metro 實務經驗分享 06

最後一回精彩大結局~ # ipsec --help 理論上來說,這個指令會 show 出所有支援的指令,但...沒 show 出來...。看了一下,show 指令的方式也夠奇特,居然事先用 ls 讀 /usr/local/libexec/ipsec/ 下面的檔案,然後在用 egrep 進行過濾的動作... 好傢伙。因為我懶的去安裝 egrep 了,就把 ipsec 這隻 script 稍微改寫一下,達到相同的目的(不過好像沒完全濾完,管他的,反正我也只用那幾個指令) 正當我把一切都準備好了以後,鼓起勇氣執行: # ipsec setup start 產生了下面的 Log: ipsec_setup: Starting Openswan IPsec U2.4.5/K2.6.17-uc1-adi3... ipsec_setup: modprobe: module ah4 not found. ipsec_setup: modprobe: failed to load module ah4 ipsec_setup: modprobe: module esp4 not found. ipsec_setup: modprobe: failed to load module esp4 ipsec_setup: modprobe: module ipcomp not found. ipsec_setup: modprobe: failed to load module ipcomp ipsec_setup: modprobe: module xfrm4_tunnel not found. ipsec_setup: modprobe: failed to load module xfrm4_tunnel ipsec_setup: modprobe: module xfrm_user not found. ipsec_setup: modprobe: failed to load module xfrm_user ipsec_setup: modprobe: module hw_random not found. ipsec_setup: modprobe: failed to load module hw_random ipsec_setup: modprobe: mo

Openswan Porting to Pronghorn-Metro 實務經驗分享 05

在上一次的最後,我們總算將這隻難纏的天鵝給移植到版子上了,接下來,會一帆風順嗎??(我好希望這答案是肯定句唷 ... ) 首先,來參考一下官方網頁的設定步驟: http://wiki.openswan.org/index.php/Openswan/Configure 首先,來看看自己身上的金鑰 # ipsec showhostkey --left 結果,當然找不到金鑰囉,哼,那就自己產生吧。 # ipsec newhostkey --output /etc/ipsec.secrets 恩,好像有點久ㄟ,畢竟只是版子,運算能力差了點,RSA 又是很需要運算的動作,先去作其他事吧...。天真的我真的去處理其他工作上的事了。幾個小時以後... 「甚麼,還沒算完,到底怎麼了??」嵌入式系統在爛也不是這樣的吧!!於是一氣之下,去看看到底他程式是怎麼寫得... openswan/programs/rsasigkey/rsasigkey.c 33 #ifndef DEVICE 34 #define DEVICE " /dev/random " 35 #endif 恩... /dev/random ... 嗎... 思緒飄回過去。那年,我還是甚麼都不懂得研究生,一個叫做「小龍」的學長正在研究室完版子,那時候他正在 porting 一個叫做 dropbear 的 SSH Server (附帶一題,這是嵌入式系統常見的 SSH Server,跟常見的 Openssh 比起來輕巧多了) 小龍 :阿,總算搞定了 我 :不過就是 porting 一個伺服器上去啊,怎麼能讓學長這麼鬆了一口氣(我真是不知天高地厚) 小龍 :是早就上版子了啦,但一直不知道為甚麼會卡住,剛剛才解決。 我 :卡住? 小龍 :對啊,就是程式執行就會停在那邊。找到理由就很簡單了。聽好了, Linux 底下是透過 /dev/random 去取得 random number,而 /dev/random 會收集系統的 interrupt 來作為產生亂數的 seed。你想想看之前你用 putty key gen 來產生憑證的時候,他是不是有要你敲鍵盤嗎?那也是同樣的意思。而在 Linux 底下,如果他覺得他無法產生「 數學上夠完美 」的亂數,整個系統就會停在那裡,等到收

Openswan Porting to Pronghorn-Metro 實務經驗分享 04

上次處理到 Openswan 的編譯,最後停在了 endian 的問題,這次能不能順利解決呢? 在使用 GCC 的編譯上,預設為 little-endian,如果要特別編譯成 big-endian 的話,要加上一個 -mbig-endian 的參數,所以,我們再來一遍。 編譯 GMP ./configure --host=arm-linux CC="arm-linux-gcc" CXX="ucfront-g++ arm-linux-uclibc-g++" --prefix=/usr/local/arm-linux CFLAGS= -mbig-endian make make install 然後,在 openswan/Makefile.inc 加上 CFLAGS += -mbig-endian 編譯 Openswan make KERNELSRC=../../ADI/linux-2.6.x ARCH=arm OSDEP=linux USE_NETKEY=yes CC="arm-linux-gcc -L../ADI/romfs/lib" LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar AS=arm-linux-as STRIP=arm-linux-strip programs make DESTDIR=../../ADI/romfs install 過了嗎??沒有!!怎麼可能... 我發現在 make 的時候,回報的信息告訴我說要 編譯 little-endian 的執行檔卻使用 big-endian 的 library 。How could it be?? 我不是連 CFLAGS 都設定好了嗎? 正當一籌莫展的時候,幸好辦公室的同事(Hidding)即時出手相救。他很有耐心的去觀看編譯的過程,發現 在編譯那幾隻程式的時候根本沒有吃到 -mbig-endian! 於是我在打開 Makefile (openswan/program/pluto/Makefile) 來看 ... 天啊... 在編譯的時候根本沒有使用 CFLAGS 嘛(你前面的 CFLAGS 是寫好玩得就是了) 罪魁禍首是下面幾個~ alg_info_test: $

Openswan Porting to Pronghorn-Metro 實務經驗分享 03

圖片
很好,下一步是編譯 「開放天鵝」OpenSwan 了~ 應該不會有甚麼難度吧(假設語氣)。首先,來乖乖看看安裝文件怎麼說: To use the native (aka, Netkey) stack: 0) Please use at least version kernel version 2.6.6, as prior versions of the kernel have serious bugs in the IPsec stack. 1) From the openswan source directory: make programs 2) As root, install the userland tools: make install 哼,簡單來說,就是 make programs, make install 嘛 (再提醒一下,因為我們沒有使用 KLIPS ... 所以不要去理會 make module 的部份了),編譯的過程並不十分順利,有少部份要進行修改,但都是簡單的修改,所以把修改的地方列在下面而不列出錯誤信息: openswan/programs/pluto/server.c:780 LIST_INSERT_HEAD(&interface_dev, id, id_entry) => LIST_INSERT_HEAD(&interface_dev, id, id_entry) ; openswan/programs/pluto/foodgroups.c: 22 #include => #include < linux/ limits.h> 順利的 make 過了,之後就要 install 囉。因為要特別指定安裝路徑,所以指令如下: make DESTDIR=../ADI/romfs install 簡單啊~之後在製作新的 ramdisk,下 make image 的指令... 結果... 它跟我抱怨 romfs 太大?? 奇怪了,這隻開放天鵝是有多肥啊,我看看 ... 天啊... 它把 man/docs 全都放進去了 ... 難怪啊,好吧,那我再把那些 manual, documents 砍掉總可以了吧~ 成功!很高興的開機進去執行 rsasigkey 看

Openswan Porting to Pronghorn-Metro 實務經驗分享 02

首先,先編出一個可以動的系統吧~ 這部份倒是很簡單,按照下面的步驟即可: 1. tar zxvf ADILinuxDistribution-adi3.tgz 2. Get the cross compiler tool chain (http://www.snapgear.org/snapgear/downloads.html) 3. Intel Access Library Integration 4. make menuconfig ... 4.1 Vendor/Product Selection -> ADI, PronghornMetro ... 4.2 Kernel/Library/Defaults Selection -> linux-2.6.x, uClibc 5. make 6. 將編出來的 image 和 ramdisk 放到版子上 ( 於 boot loader 執行下面的 command ) ... 6.1 ip_address -l 192.168.8.234 -h 192.168.8.239 ... 6.2 load -r -v -b 0x01600000 zImage ... 6.3 load -r -v -b 0x00800000 ramdisk.gz ... 6.4 go -n 0x01600000 這樣就完成了~ 那接下來,要開始進入重頭戲了(或是說,我的一連串搞笑演出),也就是將 OpenSwan 放到版子上。 首先,理所當然的, IPSec 會動到 Linux 本身的 IP Stack,這也意味著,一定有不少的 Kernel Option 會需要進行選擇。在我 印象 中( 這兩個字真是害慘我了,以後記得要多看看官方文件才是 ),kernel 2.4 並不支援 IPsec ,或是說要加上一些 Patch 才能支援,kernel 2.6 則是天生就支援 IPSec,這也是為甚麼前面我編得時候, kernel 選擇 2.6 的理由。所以,我就很勇敢的進入 Kernel 的 menuconfig 畫面,開始選擇我所需要的模組。 一進去就直接來到 Networking --> Networking options 底下,很快的就找到了幾個 Option: IPsec user configuration i

Openswan Porting to Pronghorn-Metro 實務經驗分享 01

緣由: 不知道為甚麼,Femtocell 突然之間變成一個很 Hot 的題目 (我到現在還是搞不懂為甚麼有人想把基地台放在室內 ...)。Femtocell 的概念很簡單,將為型基地台放入用戶的家裡面,透過用戶家裡現有的寬頻網路,將資料(包含語音,反正現在都講 IP 網路了嘛)傳到後端的 Access Network。整個架構看起來會像下面的樣子: User --- Femto AP --- Broadband Provider --- Access Service Provider --- Connectivity Service Provider 然而,對電信業者來說,資料經過 Broadband Provider 才回到自己的手上當然很不放心(擔心被搞鬼就是了),所以他們採用了現成的解決方案,IPSec Tunnel。由 Femto AP 建一條 IPSec Tunnel 到 Access Service Provider 來保護資料的傳送。 這就是所有故事的由來囉~ 系統環境: Platform: ADI Pronghorn-Metro x 2 OS: uclinux (2.6.17-uc1-adi3) Src: ADILinuxDistribution-adi3.tgz Openswan: Version 2.4.5 目標: 讓 IPSec 在 Pronghorn-Metro 執行起來,並且運作 OK。 限制: ADILinuxDistribution-adi3.tgz 是一套很棒的架構,坦白說,要把 OpenSwan 編起來很容易,只要 Follow 下面的步驟: 1. make menuconfig; 2. 選取 Customize Kernel Settings & Customize Vendor/User Settings 3. 選取適當的 Kernel Module 4. 選取 OpenSwan 的套件 5. make 簡單吧~但這次我們不這樣處理,理由很簡單,因為 Access Provider 那一端雖然是 ADI Pronghorn-Metro 的版子,但是,FAP 那一端卻是我們自製的 Picochip HDP203,沒有這一套架構。所以,為了將來在一次的 Porting,我們還是按照正規的作法來