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