林燕
摘 要: 分析了Iptables工作原理,介紹了Iptables規(guī)則集,提出了一種有效的規(guī)則集優(yōu)化算法,并在Linux下實現(xiàn)。運用該優(yōu)化算法能夠有效剔除規(guī)則集中重復(fù)的規(guī)則,直接提升系統(tǒng)過濾效率,減少過濾數(shù)據(jù)包所需的時間,從而提高防火墻系統(tǒng)的網(wǎng)絡(luò)吞吐量。
關(guān)鍵詞: Linux; 防火墻; Iptables; 規(guī)則集; 優(yōu)化
中圖分類號:TP391.9 文獻標(biāo)志碼:A 文章編號:1006-8228(2015)02-47-03
Optimization design of Iptables rules set
Lin Yan
(Hangzhou Vocational & Technical College, Hangzhou, Zhejiang 310008, China)
Abstract: The working principles of Iptables are analyzed and its rule set is introduced. An effective optimization algorithm is put forward and implemented in Linux. The optimization algorithm can effectively eliminate rules focused duplicate rules, directly improve the system filtration efficiency and reduce the required data packet filtering time, so as to improve the throughput of network firewall system.
Key words: Linux; firewall; Iptables; rules set; optimization
0 引言
防火墻是指隔離本地網(wǎng)絡(luò)與外界網(wǎng)絡(luò)之間的一道防御系統(tǒng),它在網(wǎng)絡(luò)之間執(zhí)行訪問控制策略[1]。防火墻是非常簡單的過濾器,或者是精心配置的網(wǎng)關(guān),檢測并過濾所有內(nèi)部網(wǎng)和外部網(wǎng)之間的信息交換,防火墻保護著內(nèi)部網(wǎng)絡(luò)敏感的數(shù)據(jù)不被偷竊和破壞,并記錄內(nèi)外通訊的有關(guān)狀態(tài)信息日志。防火墻軟件通常是運行在計算機上的一個特別的服務(wù)軟件,它可以識別并屏蔽非法的請求。
在計算機網(wǎng)絡(luò)日益普及的今天,不但要求防治病毒,還要提高系統(tǒng)抵抗外來非法入侵的能力,更要提高對遠(yuǎn)程數(shù)據(jù)傳輸?shù)谋C苄裕苊庠趥鬏斖局性庥龇欠ǜ`取。此時,對防火墻性能進行優(yōu)化顯得尤為重要。
netfilter/Iptables (其中包括netfilter和Iptables兩個組件)組成了Linux平臺下的包過濾防火墻,它與大多數(shù)的Linux自帶軟件一樣,這個防火墻是免費提供的,它可以代替昂貴的企業(yè)級防火墻來解決實際問題與實際方案,完成封包過濾,封包重定向和網(wǎng)絡(luò)地址轉(zhuǎn)換等功能[2-3]。
Iptables并不是最早出現(xiàn)的防火墻軟件,它的前身是ipchains。隨著發(fā)展到Linux 2.4.X內(nèi)核以后,ipchains逐漸被功能更加強大的Iptables所代替。Iptables可以檢查數(shù)據(jù)包的源和目的IP地址,源和目的端口,流入數(shù)據(jù)包的順序號,TCP先后順序的信息,以及包頭標(biāo)記(SYN、ACK、FIN、RST等)的狀態(tài)。Iptables會跟蹤整個會話過程,從而提高安全性和包過濾的效率。
1 Iptables工作原理
數(shù)據(jù)包從外網(wǎng)傳送到防火墻后,防火墻在IP層向TCP層傳送之前,將數(shù)據(jù)包轉(zhuǎn)發(fā)給檢查模塊進行處理。其過程如下。
⑴ 首先與第一個過濾規(guī)則比較。
⑵ 如果與第一個模塊相同,則對它進行審核,判斷是否要轉(zhuǎn)發(fā)該數(shù)據(jù)包,這時審核的結(jié)果是轉(zhuǎn)發(fā)數(shù)據(jù)包,則將數(shù)據(jù)包發(fā)送到TCP層進行處理,否則就將它丟棄。
⑶ 如果與第一個過濾規(guī)則不同,則接著與第二個規(guī)則相比較,如果相同則對它進行審核,過程與上一步相同。
⑷ 如果與第二個過濾規(guī)則不同,則繼續(xù)與下一個過濾規(guī)則比較,直到與所有的過濾規(guī)則比較完成。要是不滿足所有過濾規(guī)則,就將數(shù)據(jù)丟棄。
包檢查器并不檢查數(shù)據(jù)包的所有內(nèi)容,它通常只檢查下列幾項:
2 Iptables規(guī)則集
規(guī)則就是決定如何處理一個包的語句。如果一個包符合所有的條件(match),我們就運行target指令。書寫規(guī)則的語法格式是:
Iptables [-t table] command [match] [target]
一條Iptables規(guī)則包含如下四個基本元素。
2.1 表(table)
[-t table]選項允許使用標(biāo)準(zhǔn)表之外的任何表。表是包含僅處理特定類型信息包的規(guī)則和鏈的信息包過濾表。有三種可用的表選項:filter、nat和mangle。該選項不是必須的,如果未指定,則filter用作默認(rèn)表。Filter表用于一般的信息包過濾,包含INPUT、OUTPUT和FORWARD鏈。Nat表用于要轉(zhuǎn)發(fā)的信息包,它包含PREROUTING、OUTPUT和POSTROUTING鏈。如果信息包及其頭內(nèi)進行了任何更改,則使用mangle表。該表包含一些規(guī)則來標(biāo)記用于高級路由的信息包以及PREROUTING和OUTPUT鏈。
2.2 命令(command)
Command部分是Iptables命令的最重要部分,它告訴Iptables命令要做什么,例如,插入規(guī)則、將規(guī)則添加到鏈的末尾或刪除規(guī)則[4]。
命令選項用于指明要進行的特定操作:
-A 增加一個規(guī)則到鏈中;
-D 在鏈中的指定位置刪除一個規(guī)則;
-R 在鏈中的指定位置替換一個規(guī)則;
-I 在鏈中的指定位置插入一個新的規(guī)則;
-N 產(chǎn)生一個新的鏈;
-X 刪除一個空的鏈;
-P 設(shè)置一個鏈的默認(rèn)策略;
-L 列出一個鏈的規(guī)則;
-F 清空一個鏈的所有規(guī)則;
-Z 清零一個鏈里所有規(guī)則的包和字節(jié)計數(shù)器;
2.3 匹配(match)
Iptables命令的可選match部分指定信息包與規(guī)則匹配所應(yīng)具有的特征(如源和目的地地址、協(xié)議等)[5]。
參數(shù)選項組成一個規(guī)則的說明:
-p - -protocol [!]protocol 協(xié)議說明選項
-s - -source[!]address[/mask] 源地址說明選項
-d - -destination[!]address[/mask] 目標(biāo)地址說明選項
-o - -out-interface[!][name] 指明離開接口的值
-c - -set-counters PKTS BYTES 管理員的初始包和字節(jié)計數(shù)器
-j - - jump target 指明規(guī)則的目標(biāo)
-i - - in-interface[!][name] 指明進入接口的值
2.4 目標(biāo)(target)
目標(biāo)是由規(guī)則指定的操作,對與那些規(guī)則匹配的信息包執(zhí)行這些操作。除了允許用戶定義的目標(biāo)之外,還有許多可用的目標(biāo)選項。下面是常用的一些目標(biāo)及其示例和說明。
ACCEPT:當(dāng)信息包與具有ACCPET目標(biāo)的規(guī)則完全匹配時,會被接受(允許它前往目的地)。
DROP:當(dāng)信息包與具有DROP目標(biāo)的規(guī)則完全匹配時,會阻塞該信息包,并且不對它作進一步處理。
REJECT:該目標(biāo)的工作方式與DROP目標(biāo)相同,但它比DROP好。REJECT不會在服務(wù)器和客戶機上留下死套接字。另外,REJECT會將錯誤信息發(fā)回給信息包的發(fā)送方。
SNAT:指明包的源地址將被修改,并將停止規(guī)則的檢查。
DNAT:指明包的目的地址將被修改,并將停止規(guī)則的檢查。
MASQUERADE:被專門設(shè)計用于那些動態(tài)獲取IP地址的連接的,比如,撥號上網(wǎng)、DHCP連接等。
REDIRECT:改變包的目的IP地址來發(fā)送包。
MIRROR:互換源和目的地址后發(fā)送數(shù)據(jù)包。
3 規(guī)則集優(yōu)化與實現(xiàn)
對于一個防火墻系統(tǒng)來說,過濾規(guī)則是系統(tǒng)過濾的核心。隨著防火墻系統(tǒng)的運行,新的過濾規(guī)則會不斷的加入。當(dāng)規(guī)則越來越多時,系統(tǒng)對每個數(shù)據(jù)包的處理時間會變得越來越長,系統(tǒng)的過濾效率會越來越低,這樣勢必會造成數(shù)據(jù)包的延時和網(wǎng)絡(luò)的擁堵。因此,規(guī)則集的結(jié)構(gòu)合理性對系統(tǒng)的過濾效率起著至關(guān)重要的作用。
3.1 算法思想
考慮到過濾系統(tǒng)中,規(guī)則一般都是由入侵檢測系統(tǒng)根據(jù)實際網(wǎng)絡(luò)情況來實時動態(tài)添加的,規(guī)則之間可能存在極大的冗余。因此,在添加規(guī)則時,嘗試對新添加的規(guī)則和已有的規(guī)則進行比較和合并,刪除被包含的規(guī)則,合并多條相關(guān)的規(guī)則成一條規(guī)則。這樣可以大大減少規(guī)則的數(shù)量,從而提高過濾的效率。
3.2 Iptables運行流程
當(dāng)用戶從命令行輸入操作命令時,系統(tǒng)執(zhí)行流程如下:
⑴ main函數(shù)載入相應(yīng)的模塊,然后將命令行參數(shù)傳入do_command,調(diào)用do_command函數(shù)。
⑵ do_command函數(shù)解析main函數(shù)傳遞過來的命令行參數(shù),解析出命令、規(guī)則等信息。
⑶ main函數(shù)判斷do_command函數(shù)的返回值,如果相應(yīng)的操作成功,則調(diào)用iptc_commit函數(shù)將提交用戶修改到內(nèi)核。
d.iptc_commit函數(shù)將根據(jù)表操作句柄中的所有鏈信息轉(zhuǎn)換成內(nèi)核數(shù)據(jù)結(jié)構(gòu),然后將所有的修改提交到內(nèi)核。
⑷ 如果提交操作完成,main函數(shù)退出,完成命令執(zhí)行。
3.3 算法實現(xiàn)
規(guī)則集優(yōu)化算法的流程不改變Iptables系統(tǒng)的執(zhí)行流程,只是在其默認(rèn)的處理過程中加入一個預(yù)處理過程。這個預(yù)處理過程判斷所添加的規(guī)則是否能夠和已有的規(guī)則重新組合。如果可以重新組合,則修改現(xiàn)有的規(guī)則,然后返回,否則執(zhí)行默認(rèn)的流程。
3.3.1 主要函數(shù)
本算法中主要函數(shù)如下。
⑴ pp_iptc_merge_entry函數(shù)
此函數(shù)的功能是合并規(guī)則到規(guī)則鏈,其函數(shù)原型如下:
Int pp_iptc_merge_entry(iptc_handle_t *handle,
const ipt_chainlabel chain,const struct ipt_entry *entry)
⑵ pp_compare_entry函數(shù)
此函數(shù)的功能為比較兩條規(guī)則,判斷兩條規(guī)則之間是否具有等價、包含或交叉關(guān)系,其函數(shù)原型如下:
Int pp_compare_entry(const struct ipt_entry *e1,
const struct ipt_entry *e2)
⑶ pp_compare_match函數(shù)
此函數(shù)的功能為比較兩條規(guī)則的匹配部分,判斷兩條規(guī)則的匹配部分是否具有等價、包含或交叉關(guān)系。其函數(shù)原型如下:
Int pp_compare_match(const struct ipt_entry *e1,
const struct ipt_entry *e2)
⑷ pp_compare_target函數(shù)
此函數(shù)的功能為比較兩條規(guī)則的目標(biāo)部分,判斷兩條規(guī)則的目標(biāo)部分是否相同,其函數(shù)原型如下:
Int pp_compare_target(const struct ipt_entry *e1,
const struct ipt_entry *e2)4
3.3.2 算法流程
當(dāng)向規(guī)則集中添加一條規(guī)則時,優(yōu)化程序執(zhí)行如下操作。
⑴ 取出待添加鏈中的所有規(guī)則,將規(guī)則集中的每條規(guī)則和待添加的規(guī)則比較。
⑵ 根據(jù)比較結(jié)果,執(zhí)行如下流程:
(a) 如果待添加的規(guī)則和已有的規(guī)則是等價關(guān)系,則直接丟棄待添加的規(guī)則。
(b) 如果待添加的規(guī)則和已有的規(guī)則是包含關(guān)系,則刪除原規(guī)則集中被包含的規(guī)則,然后將待添加的規(guī)則加入到規(guī)則集。
(c) 如果待添加的規(guī)則和已有的規(guī)則是被包含關(guān)系,則直接丟棄待添加的規(guī)則。
(d) 如果待添加的規(guī)則和已有的規(guī)則是交叉關(guān)系,則根據(jù)交叉關(guān)系修改已有的規(guī)則,待添加的規(guī)則丟棄。
(e) 如果規(guī)則集中的規(guī)則和待添加的規(guī)則沒有等價、包含、交叉關(guān)系,則執(zhí)行默認(rèn)的添加過程。
4 結(jié)束語
Iptables在經(jīng)過優(yōu)化后,對于無法合并的規(guī)則集,系統(tǒng)的執(zhí)行效率只有微小的降低,基本上只減慢了3-5%之間。對于可以合并的規(guī)則集,優(yōu)化算法避免了插入重復(fù)的規(guī)則,Iptables和內(nèi)核的交互次數(shù)減少了,Iptables系統(tǒng)的性能有明顯的提高,特別是在當(dāng)規(guī)則集的數(shù)目巨大時更為突出。這從另一方面說明了優(yōu)化算法能有效的去掉規(guī)則集中冗余的規(guī)則,提高內(nèi)核過濾效率。優(yōu)化算法能夠有效地剔除規(guī)則集中重復(fù)的規(guī)則,這不僅能夠提高Iptables系統(tǒng)本身運行效率,而且由于系統(tǒng)中過濾規(guī)則的減少,直接提升了系統(tǒng)過濾效率,減少過濾數(shù)據(jù)包所需的時間,從而提高防火墻的吞吐率。
參考文獻:
[1] 黎連業(yè),張維.防火墻及其應(yīng)用技術(shù)[M].清華大學(xué)出版社,2004.3:
220-244
[2] 朱立才.Netfilter/Iptables防火墻性能優(yōu)化方案與實現(xiàn)[J].計算機工
程與應(yīng)用,2008.6:218-232
[3] 劉君堯.linux下基于Netfilter的防火墻設(shè)計[J].計算機技術(shù)與發(fā)展,
2005.10:250-255
[4] 毛德操.linux內(nèi)核源代碼情景分析[M].浙江大學(xué)出版社,2001.6:
118-130
[5] 徐千洋.linux C函數(shù)庫參考手冊[M].北京:中國青年出版社,2007.9:
102-111