摘要:為了構建安全可靠的網絡,對Linux內核防火墻結構Netfilter的實現機制進行了深入的研究和分析。在此基礎上,結合嵌入式Linux系統開發流程,闡述了嵌入式Linux系統的Netfilter/IP tables防火墻功能。最后,給出了嵌入式Linux防火墻在實驗室網絡中的具體應用。
關鍵詞:嵌入式Linux;防火墻;Netfilter;IP tables
中圖法分類號:TP393文獻標識碼:A 文章編號:1009-3044(2009)35-9936-02
對于安全性要求較高的企業來說,基于軟件的解決方案,例如個人防火墻以及防病毒掃描程序等,都不夠強大,無法滿足用戶的要求。即使一個電子郵件傳送過來的惡意腳本程序,都能輕松將這些防護措施屏蔽掉,甚至是那些運行在主機上的“友好”應用都可能為避免驅動程序的沖突而無意中關掉這些安全性防護軟件,網絡中的其他部分也將處攻擊威脅之下。
安全性能是由硬件處理器來承擔的,因此,邊緣防火墻應用程序或網關能夠為這類用戶提供更優的入侵防范手段。但是這些設備的功能僅限于為網絡邊緣提供保護。一套嵌入式防火墻解決方案能將這一功能延伸到邊緣防火墻的范圍之外,并分布到網絡的終端。邊緣防火墻既能提供規避策略,也能提供入侵防范策略。安全性措施在PC系統上執行,但是卻由嵌入式防火墻的硬件系統來實施,整個過程獨立于主機系統之外。這一策略使企業網絡幾乎不受任何惡意代碼或黑客攻擊的威脅。即使攻擊者完全通過了防火墻的防護并取得了運行防火墻主機的控制權,他們也將寸步難行,因為他們不能關閉掉嵌入式防火墻,或者以被入侵的主機為跳板進一步展開侵入網絡其他領域的行動。[1-2]
1 嵌入式Linux防火墻實現機制分析
Linux內核防火墻的實現包括兩個部分, 一個部分是內核中的Netfilter模塊。它提供了一個抽象的、通用化框架, 是實現數據包過濾、處理、NAT等防火墻功能的核心。另一個部分就是用戶空間的規則配置工具IP tables。Netfilter提供了一系列的表(table),每個表由若干鏈(chain) 組成, 而每條鏈中可以由一條或數條規則組成。在Netfilter中,使用內建的INPUT、OUTPUT和FORWARD過濾規則。入站數據包需要經過路由功能,由其決定是將數據包送到本地主機的輸入規則鏈,還是轉發規則鏈。Netfilter 數據包的流動如圖1所示。
如果目的地址為本地的數據包被INPUT規則鏈的規則所接受,數據包就會在本地傳送。如果目的地址為外地的數據包被FORWARD規則鏈的規則接受,數據包就會被送出相應的接口,經本地處理后的外出數據包被送到OUTPUT規則鏈。如果數據包被接受了,就會被送出相應的接口。于是,每個數據包被過濾一次。
用Netfilter建立防火墻使用IP tables管理命令,IP tables命令執行所建立的防火墻策略管理防火墻的行為,IP tables可以加入、插入或刪除核心包過濾表格(鏈)中的規則。在iptables 防火墻中提供了三種策略規則表:Filter、NAT 和Mangle,分別實現包過濾,地址轉換和處理包內容的功能。
2 Netfilter的實現原理
Netfilter為IPv4網絡協議定義了5個鉤子函數(hook),內核模塊則可以對一個或多個這樣的鉤子函數進行注冊掛接,使這些鉤子函數在數據包流過協議棧時被調用。數據包經過鉤子函數處理后,根據如下的返回值進行下一步的處理:
1) NF_DROP:丟棄此數據包,不再處理;
2) NF_ACCEPT:接受此數據包,進入下一步的處理;
3) NF_STOLEN:模塊接管該數據包,不再繼續傳輸;
4) NF_QUEUE:排隊到用戶空間,等待用戶處理;
5) NF_REPEAT:再次調用該鉤子函數處理。
Netfilter5個鉤子函數的架構如圖2所示。
1) NF_IP_PRE_ROUTING:剛剛進入網絡層的數據包通過此點(剛剛進行完版本號、校驗和等檢測),源地址轉換在此點進行;
2) NF_IP_LOCAL_IN:經路由查找后,送往本機的通過此檢查點,IN PUT包過濾在此點進行;
3) NF_IP_FORWARD:要轉發的包通過此檢測點,FORWORD包過濾在此點進行;
4) NF_IP_LOCAL_OUT:本機進程發出的包通過此檢測點,OUT PUT包過濾在此點進行;
5) NF_IP_POST_ROUTING:所有馬上要通過網絡設備出去的包通過此檢測點,內置的目的地址轉換功能(包括地址偽裝)在此點進行。
由圖2可以看出數據包經過Netfilter架構的過程:數據包從左邊進入系統,進行IP校驗以后,數據包經過第一個鉤子NF_IP_PRE_ROUTING函數進行處理;然后就進入路由代碼,其決定該數據包是需要轉發還是發給本機的;若該數據包是發給本機的,則該數據經過鉤子函數NF_IP_LOCAL_IN處理以后傳遞給上層協議;若該數據包被轉發,則被NF_IP_ FORWARD處理;經過轉發的數據包經過最后一個鉤子函數NF_IP_POST_ROUTING處理以后,再傳輸到網絡上。本地產生的數據經過鉤子函數NF_IP_LOCAL_OUT處理以后,進行路由選擇理,然后經過NF_IP_POST_ROUTING處理后,發送到網絡上。[3]
3 嵌入式Linux的防火墻實現
要實現嵌入式Linux 防火墻,主要有3個方面工作:建立交叉編譯環境;編譯嵌入式Linux內核,使其支持Netfilter;包過濾實現。
3.1 建立交叉編譯環境
本文采用的是自動創建交叉編譯環境的方法。針對商業硬件平臺,廠家都會為你提供一個開發包,利用這個開發包自動化創建交叉編譯環境、編譯內核、建立根文件系統、創建Ram Disk。需要有一臺運行Linux的PC(宿主機),在上面安裝編譯器以及相關的嵌入式Linux系統的源代碼和文件系統。
3.2 編譯嵌入式Linux內核
編譯內核是為目標機建立一個合適的內核,對于建立內核,有兩點值得考慮的:1) 功能上的選擇。應該能夠滿足需要的情況下,盡量地小;2) 穩定性。
在宿主機上進入嵌入式Linux內核目錄,通過shell終端編譯和配置所需內核模塊,特別的,要選中支持Netfilter的選項。完整內核的編譯后,剩下的工作就是建立及安裝模塊了。[5-6]
//建立模塊
#make ARCH=i386 CROSS_COMPILE=i386-linux- modules
//安裝內核模塊至/images
#make ARCH=i386 CROSS_COMPILE= i386-linux-
>;INSTALL_MOD_PATH=/images/modules-2.4.18-rmk5
>;modules_install
然后是為模塊建立依存關系,不能使用原生的depmod來建立,而需要使用交叉編譯工具。將depmod.pl拷貝至交叉編譯工具鏈的bin目錄。
#depmod.pl
>;-k ./vmlinux –F ./System.map
>;-b /images/modules-2.4.27-rmk5/lib/modules >;
>;/images/modules-2.4.27-rmk5/lib/modules/2.4.27-rmk5/modules.dep
3.3 包過濾實現
1) 在/etc/rc.d/目錄下用touch命令建立firewall 文件,執行chmod u+x firewll以更改文件屬性,編輯/etc/rc.d/rc.local文件,在末尾加上/etc/rc.d/firewall以確保開機時能自動執行該腳本。
2) 刷新所有鏈的規則:
#! /bin/sh
echo \"Starting iptables rules...\"
#Refresh all chains
/sbin/iptables - F
3) 設置防火墻FORWARD鏈的策略為DROP:
/sbin/iptables - P FORWARD DROP
4) 設置關于服務器的包過慮規則:
/sbin/iptables - A FORWARD - p tcp - d 198.168.80.11 - - dport www - i eth0 - j ACCEPT
#Allow ftp request packets from Internet clients to Intranet ftp server
/sbin/iptables - A FORWARD - p tcp - d 198.168.80.12 - - dport ftp - i eth0 - j ACCEPT
/sbin/iptables - A FORWARD - p tcp - d 198.168.80.13 - - dport smtp - i eth0 - j ACCEPT
5) 接受來自整個Intranet的數據包過慮,規則如下:
/sbin/iptables - A FORWARD - s 198.168.80.0/24 - i eth1 – j ACCEPT
6) 處理Ip碎片規則:
/sbin/iptables - A FORWARD - f - m limit - - limit 100/s - - limitburst 100 - j ACCEPT
7) 設置Icmp包過濾:
/sbin/iptables - A FORWARD - p icmp - m limit - - limit 1/s - - limit- burst 10 - j ACCEPT
通過以上步驟,實現了防火墻基本的包過濾功能。默認策略為禁止一切,允許被選擇的數據包通過。[4]
通過以上的配置,就基本實現了所需的防火墻功能。在實際應用中,需要根據具體情況進行設置。當然,以上的一些配置修改的只是嵌入式系統中RAM的內容,如果需要斷電之后仍能使用這些功能,則需要重新下載修改后的ramdisk文件系統,把他保存到FLASH里。具體的做法為:把在宿主機中的嵌入式Linux文件系統ramdisk掛載到宿主機的某個目錄,然后修改宿主機目錄下的/etc/rc.sh文件,把以上所列的配置語句寫入到rc.sh里,保存后取消掛載。這里的rc.sh就是Linux內核啟動并加載文件系統后自動執行的shell文件。當然,也可以通過LKM方式來設計自己的防火墻程序,不過由于Linux內置的Netfitler/IP tables防火墻功能已經足夠滿足需要,這里就不再對其進行詳細討論了。
4 結束語
Linux下的Netfilter/IP tables防火墻體系結構是帶有狀態檢測的高效率防火墻體系。本課題對該結構進行了分析,并實現了一個嵌入式Linux 防火墻系統。經過長期使用測試,整個系統非常穩定和安全,取得了非常好的效果。
5 創新點
第一,整個系統基于開放源代碼的嵌入式LINUX,這使得學習、修改、裁剪本系統成為可能,系統的設計者可以方便的對該系統進行二次開發。
第二,嵌入式LINUX是開放源代碼的自由軟件,遵循GPL協議,源代碼可以自由獲得,所以本系統用于購買嵌入式操作系統的費用可以忽略不計。
第三,強大的網絡支持功能。嵌入式LINUX 誕生于因特網時代并具有Unix 的特性,保證了本系統支持所有標準因特網協議,并且可以利用Linux的網絡協議棧將其開發成為嵌入式的TCP/IP網絡協議棧。
第四,廣泛的硬件支持。本系統基于嵌入式LINUX,包括x86、ARM、MIPS、ALPHA、PowerPC等多種體系結構都能夠運行,支持各種主流硬件設備和最新的硬件技術。
參考文獻:
[1] 方政,趙德安,周俊華,等.基于嵌入式系統的網絡硬件防火墻的實現[J].微計算機信息,2006(1-2):188-190.
[2] Goncalves,Marcus.Firewalls:a complete guide[M].Beijing:McGraw-Hill,2000.
[3] 胡安磊,周大水,李大興.Linux中Netfilter/IPtables的應用研究[J].計算機應用與軟件,2004,10(21).
[4] 安金萍.狀態檢測包過濾技術在Linux下的實現[J].計算機工程,2005,31(2).
[5] Bovet D P,Cesati M.深入理解Linux內核[M].2版.北京:中國電力出版社,2004.
[6] 李善平,劉文峰,李程遠.Linux內核2.14版源代碼分析大全[M].北京:機械工業出版社,2002.
[7] 李飛,甘剛,索望.基于Linux平臺的圖形界面防火墻設計[J].計算機應用,2005(25).