高祥斌
[摘要]防火墻技術(shù)在保護網(wǎng)絡(luò)安全方面的作用越來越明顯。相比較window,Linux有更好的網(wǎng)絡(luò)性能,因此基于Linux的Netfilter技術(shù)的使用越來越廣泛。先分析Netfilter技術(shù)的特點,然后從兩個方面對其進行詳細(xì)分析:Netfilter的工作原理和Netfilter對數(shù)據(jù)包的處理過程,最后簡要分析Netfilter應(yīng)用開發(fā)及其優(yōu)越性。
[關(guān)鍵詞]Netfilter數(shù)據(jù)包鉤子函數(shù)
中圖分類號:TP3文獻標(biāo)識碼:A文章編號:1671-7597(2009)0710041-01
網(wǎng)絡(luò)在經(jīng)濟和生活的各個領(lǐng)域正在迅速普及,眾多的企業(yè)、組織、政府部門與機構(gòu)都在組建和發(fā)展自己的網(wǎng)絡(luò),并連接到Internet上。為了保護組織資源不泄露,不受到病毒侵襲,黑客攻擊,網(wǎng)絡(luò)安全越來越受到人們的重視。Linux良好的網(wǎng)絡(luò)性能和開放源代碼的特點,使越來越多的用戶選擇了Linux作為其防火墻的操作平臺,本文正是針對當(dāng)前流行的Linux中采用的Netfilter技術(shù)進行相關(guān)分析。
一、Netfilter的技術(shù)特點
Netfilter技術(shù)對ipchains進行了改進:它摒棄了ipchains不區(qū)分?jǐn)?shù)據(jù)包是單純的進入包、外出包或中轉(zhuǎn)包的做法,同時為每種網(wǎng)絡(luò)協(xié)議(IPv4、IPv6等)定義一套鉤子函數(shù),這些鉤子函數(shù)在數(shù)據(jù)包流過協(xié)議棧的幾個關(guān)鍵點被調(diào)用;Netfilter內(nèi)核中,任何模塊可以對每種協(xié)議的一個或多個鉤子進行注冊,實現(xiàn)掛載,這樣當(dāng)某個數(shù)據(jù)包被傳遞給Netfilter框架時,內(nèi)核能檢測是否有任何模塊對某種協(xié)議和鉤子函數(shù)進行了注冊[1]。如果是注冊了,這些模塊就調(diào)用注冊時使用的回調(diào)函數(shù)對數(shù)據(jù)包進行檢查或修改,然后決定是丟棄還是接受數(shù)據(jù)包;Netfilter位于Linux的IP層,它的防火墻的代碼與實現(xiàn)IP層的代碼完全分離,從而構(gòu)成不同的模塊,使網(wǎng)絡(luò)層和防火墻在結(jié)構(gòu)上很清晰,防火墻代碼修改和功能擴充更加容易。
二、Netfilter技術(shù)分析
Netfilter是Linux內(nèi)核實現(xiàn)數(shù)據(jù)包過濾、網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)、數(shù)據(jù)包處理等的功能框架。相對于原來的ipchains防火墻,Netfilter防火墻以更好的結(jié)構(gòu)重新構(gòu)造,并實現(xiàn)了許多新功能。
(一)Netfilter的工作原理。Netfilter的設(shè)計為Linux內(nèi)核中其它模塊動態(tài)參與IP層中的數(shù)據(jù)包處理提供了途徑。其實現(xiàn)方法是:
1. 在內(nèi)核中建立了一個函數(shù)指針鏈表,即鉤子函數(shù)鏈表,加入到鏈表中的函數(shù)指針?biāo)傅暮瘮?shù)稱為鉤子函數(shù)(Hook Function)。當(dāng)內(nèi)核模塊需要參與IP層中對數(shù)據(jù)包的處理時,通過調(diào)用Netfilter中鉤子函數(shù)的注冊函數(shù),注冊內(nèi)核模塊的數(shù)據(jù)包處理函數(shù),Netfilter將在鉤子函數(shù)鏈表中記錄下此模塊中的數(shù)據(jù)包處理函數(shù)指針。
2. IP層在數(shù)據(jù)包處理過程中,會檢查相應(yīng)的鉤子函數(shù)鏈表中是否有鉤子函數(shù)被注冊:如果存在注冊的鉤子函數(shù),便會調(diào)用此函數(shù),并且根據(jù)該函數(shù)的處理結(jié)果,決定是繼續(xù)完成IP層中的后續(xù)處理過程,還是丟棄此數(shù)據(jù)包,中斷數(shù)據(jù)包的傳輸;如果不存在注冊的鉤子函數(shù),則繼續(xù)完成IP層中的后續(xù)處理。
3. 當(dāng)內(nèi)核模塊不需要參與IP層的數(shù)據(jù)包處理時,調(diào)用Netfilter鉤
子注銷函數(shù),Netfilter從鉤子函數(shù)鏈表中去掉此鉤子函數(shù)指針,這樣IP層檢測不到鉤子函數(shù)的存在,會繼續(xù)其后續(xù)操作。
鉤子和掛載函數(shù)是Netfilter架構(gòu)中的核心部分。Linux內(nèi)核的Netfil
Ter框架為IPv4協(xié)議實現(xiàn)了五個鉤子函數(shù)掛載點,分別為:NF_IP_PRE_ROUT
ING,NF_IP_LOCAL_IN,NF_IP_FORWARD,NF_IP_POST_ROUTING,NF_IP_LOC
AL_OUT。當(dāng)數(shù)據(jù)包流經(jīng)IPv4協(xié)議棧的五個掛載點時,內(nèi)核就會調(diào)用在掛載點注冊的回調(diào)函數(shù)對數(shù)據(jù)包進行處理。Netfilter掛載點回調(diào)函數(shù)的調(diào)用代碼是通過NF_HOOK宏嵌入在網(wǎng)絡(luò)協(xié)議棧的代碼之中的,其定義在include/li
nux/netfilter.h中。
(二)Netfilter對數(shù)據(jù)包的處理過程?;贚inux的Netfilter防火墻設(shè)計中,其對數(shù)據(jù)包的處理過程如圖1所示:
圖1Netfilter中數(shù)據(jù)包的處理過程
圖1中共有5個鉤子函數(shù)(即HOOK),數(shù)據(jù)包從左邊進入系統(tǒng),進行IP校驗以后,數(shù)據(jù)包經(jīng)過第一個鉤子函數(shù)鏈表NF_IP_PRE_ROUTING進行處理;然后就進入路由代碼,決定該數(shù)據(jù)包是需要轉(zhuǎn)發(fā)還是發(fā)給本機;若該數(shù)據(jù)包是發(fā)給本機的,則經(jīng)過鉤子函數(shù)鏈表NF_IP_LOCAL_IN處理后傳遞給上層協(xié)議;若該數(shù)據(jù)包應(yīng)該被轉(zhuǎn)發(fā),則它被NF_IP_FORWARD處理;轉(zhuǎn)發(fā)的數(shù)據(jù)包經(jīng)過最后一個鉤子函數(shù)鏈表NF_IP_POST_ROUTING處理以后,再傳輸?shù)骄W(wǎng)絡(luò)上。本地產(chǎn)生的數(shù)據(jù)包經(jīng)過鉤子函數(shù)鏈表NF_IP_LOCAL_OUT處理后,進行路由選擇處理,然后經(jīng)過NF_IP_POST_ROUTING處理并發(fā)送到網(wǎng)絡(luò)上。另外,還可以使用內(nèi)核模塊在Netfilter的五個鉤子函數(shù)鏈表上掛載一個或者多個這樣的鉤子函數(shù)。這樣當(dāng)有數(shù)據(jù)包進入鉤子點處理時,將查找被掛載的函數(shù),然后調(diào)用這些函數(shù)對數(shù)據(jù)包進行處理。
(三)Netfilter應(yīng)用和開發(fā)。一般而言基于Netfilter的應(yīng)用開發(fā)有兩種[2]:從用戶空間的角度進行開發(fā),這種開發(fā)主要是如何充分發(fā)揮內(nèi)核所提供的防火墻功能,它不能為防火墻增加基本功能模塊;另外就是從內(nèi)核空間的角度進行開發(fā)。這種方法不僅能充分發(fā)揮現(xiàn)有功能,而且還能添加新的功能模塊。
Netfilter具有良好的框架和拓展性,這使得開發(fā)人員無需過多涉及內(nèi)核協(xié)議棧的改動。開發(fā)基于Netfilter框架的內(nèi)核模塊一般有一下幾個步驟:分析功能需求,確定要在哪幾個鉤子掛載點處注冊鉤子函數(shù);按照鉤子函數(shù)的接口規(guī)范編寫鉤子函數(shù);在掛載點處注冊鉤子函數(shù)。
參考文獻:
[1]鄒思軼,嵌入式Linux設(shè)計與應(yīng)用[M].北京:清華大學(xué)出版社,2002.
[2]姚曉宇、趙晨,Linux內(nèi)核防火墻Netfilter實現(xiàn)與應(yīng)用研究[J].計算機工程,2003(5).