netfilter技術(shù)分析
netfilter是由Rusty Russell提出的Linux 2.4內(nèi)核防火墻框架,該框架既簡(jiǎn)潔又靈活,可實(shí)現(xiàn)安全策略應(yīng)用中的許多功能,如數(shù)據(jù)包過濾、數(shù)據(jù)包處理、地址偽裝、透明代理、動(dòng)態(tài)網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation,NAT),以及基于用戶及媒體訪問控制(Media Access Control,MAC)地址的過濾和基于狀態(tài)的過濾、包速率限制等。
1.1 netfilter框架
netfilter提供了一個(gè)抽象、通用化的框架[1],作為中間件,為每種網(wǎng)絡(luò)協(xié)議(IPv4、IPv6等)定義一套鉤子函數(shù)。Ipv4定義了5個(gè)鉤子函數(shù),這些鉤子函數(shù)在數(shù)據(jù)報(bào)流過協(xié)議棧的5個(gè)關(guān)鍵點(diǎn)被調(diào)用,也就是說,IPv4協(xié)議棧上定義了5個(gè)“允許垂釣點(diǎn)”。在每一個(gè)“垂釣點(diǎn)”,都可以讓netfilter放置一個(gè)“魚鉤”,把經(jīng)過的網(wǎng)絡(luò)包(Packet)釣上來,與相應(yīng)的規(guī)則鏈進(jìn)行比較,并根據(jù)審查的結(jié)果,決定包的下一步命運(yùn),即是被原封不動(dòng)地放回IPv4協(xié)議棧,繼續(xù)向上層遞交;還是經(jīng)過一些修改,再放回網(wǎng)絡(luò);或者干脆丟棄掉。
Ipv4中的一個(gè)數(shù)據(jù)包通過netfilter系統(tǒng)的過程如圖1所示。
圖1 Netfilter的功能框架
1.2 netfilter的關(guān)鍵技術(shù)
netfilter主要采用連線跟蹤(Connection Tracking)、包過濾(Packet Filtering)、地址轉(zhuǎn)換、包處理(Packet Mangling)4種關(guān)鍵技術(shù)。
1.2.1 連線跟蹤
連線跟蹤是包過濾、地址轉(zhuǎn)換的基礎(chǔ),它作為一個(gè)獨(dú)立的模塊運(yùn)行。采用連線跟蹤技術(shù)在協(xié)議棧低層截取數(shù)據(jù)包,將當(dāng)前數(shù)據(jù)包及其狀態(tài)信息與歷史數(shù)據(jù)包及其狀態(tài)信息進(jìn)行比較,從而得到當(dāng)前數(shù)據(jù)包的控制信息,根據(jù)這些信息決定對(duì)網(wǎng)絡(luò)數(shù)據(jù)包的操作,達(dá)到保護(hù)網(wǎng)絡(luò)的目的。
當(dāng)下層網(wǎng)絡(luò)接收到初始化連接同步(Synchronize,SYN)包,將被netfilter規(guī)則庫檢查。該數(shù)據(jù)包將在規(guī)則鏈中依次序進(jìn)行比較。如果該包應(yīng)被丟棄,發(fā)送一個(gè)復(fù)位(Reset,RST)包到遠(yuǎn)端主機(jī),否則連接接收。這次連接的信息將被保存在連線跟蹤信息表中,并表明該數(shù)據(jù)包所應(yīng)有的狀態(tài)。這個(gè)連線跟蹤信息表位于內(nèi)核模式下,其后的網(wǎng)絡(luò)包就將與此連線跟蹤信息表中的內(nèi)容進(jìn)行比較,根據(jù)信息表中的信息來決定該數(shù)據(jù)包的操作。因?yàn)閿?shù)據(jù)包首先是與連線跟蹤信息表進(jìn)行比較,只有SYN包才與規(guī)則庫進(jìn)行比較,數(shù)據(jù)包與連線跟蹤信息表的比較都是在內(nèi)核模式下進(jìn)行的,所以速度很快。
1.2.2 包過濾
包過濾檢查通過的每個(gè)數(shù)據(jù)包的頭部,然后決定如何處置它們,可以選擇丟棄,讓包通過,或者更復(fù)雜的操作。
1.2.3 地址轉(zhuǎn)換
網(wǎng)絡(luò)地址轉(zhuǎn)換源(NAT)分為(Source NAT,SNAT)和目的NAT(Destination NAT, DNAT)2種不同的類型。SNAT是指修改數(shù)據(jù)包的源地址(改變連接的源IP)。SNAT會(huì)在數(shù)據(jù)包送出之前的最后一刻做好轉(zhuǎn)換工作。地址偽裝(Masquerading)是SNAT的一種特殊形式。DNAT 是指修改數(shù)據(jù)包的目標(biāo)地址(改變連接的目的IP)。DNAT 總是在數(shù)據(jù)包進(jìn)入以后立即完成轉(zhuǎn)換。端口轉(zhuǎn)發(fā)、負(fù)載均衡和透明代理都屬于DNAT。
1.2.4 包處理
利用包處理可以設(shè)置或改變數(shù)據(jù)包的服務(wù)類型(Type of Service, TOS)字段;改變包的生存期(Time to Live, TTL)字段;在包中設(shè)置標(biāo)志值,利用該標(biāo)志值可以進(jìn)行帶寬限制和分類查詢。
評(píng)論