孫愛愛
(武漢郵電科學研究院,武漢 430074)
防火墻的功能是限制非法流量,保護內網。看一個防火墻是否成功,應該從它是不是瓶頸來考慮,所以避免防火墻成為瓶頸就需要通過提高它的性能來解決。iptables主要通過各個表中的有序規則鏈對網絡數據包進行過濾和篩選,從而有效抵制網絡入侵與攻擊[1]。本文先對iptables的四個表五個鏈以及對經過iptables的數據包的流程作簡要的分析,然后提出幾種簡單的方法來提高防火墻的性能。
netfilter/iptables IP信息包過濾系統是由netfilter與iptables兩個組件構成的。netfilter組件屬于內核的一部分,包含了實現內核過濾和處理信息包的規則集。iptables組件是一種被稱作用戶空間的工具。它使處理信息包的過濾表中的規則變得容易。
iptables包含四個表,五個鏈。表和鏈實際上是netfilter的兩個維度。四個表的處理優先級從高到低依次是 raw、mangle、nat、filter。五條鏈分別是 PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
Filter表,是默認的表,它包括INPUT鏈、OUTPUT鏈以及FORWARD鏈。Nat表主要是做網絡地址轉換,它有三種內建鏈,PREROUTING鏈通常用于DNAT;POSTROUTING會通過SNAT和MASQUERADE兩種方式轉換源IP地址;OUTPUT是處理本機產生的數據包。Mangle表由這包含了這五條鏈,可以對特定的數據包進行修改或者給數據包附上一些額外的數據,以達到路由控制和流量控制等。Raw表用于處理異常,優先級最高,包括PREROUTING鏈和OUTPUT鏈。
由圖1可以看出,經過iptables的數據包的基本步驟如圖1:
數據包到達網絡接口,比如eth0,首先進入raw表的PREROUTING鏈,該鏈的作用是趕在連接跟蹤之前處理數據,如果進行了連接跟蹤,則在此處理;經過IP校驗后,首先經過mangle表中的PREROUTING鏈,在此可以修改數據包,接著進入nat表的PREROUTING鏈,在此可以做DNAT,但不要做過濾;再經過一次路由查找,決定該數據包是給本地主機還是要轉發。若是給本地的主機,則進入mangle表的INPUT鏈,這里是在路由之后,交給本地主機之前,可以對數據包進行一些相應的修改,接著進入Filter表的INPUT鏈,在這里可以對流入的所有數據包進行過濾,無論數據包來自哪個網絡接口,經過這些處理后再傳遞給上層協議。如果數據包需要轉發,則發給mangle表的FORWARD鏈的和Filter表的FORWARD鏈對該數據包進行相應的處理;本機網絡層以上各層產生的數據包在依次通過mangle表、nat表和filter表的OUTPUT鏈后,再通過路由選擇一次;要發送的數據包,都一定要經過mangle表的POSTROUTING鏈和nat表的POSTROUTING鏈進行處理。

在防火墻中,數據包所流經的規則和數據鏈是由其來源、目的地址等屬性決定的,只要數據包匹配了其中一條規則,過濾就會結束,否則會通過整個規則鏈,再按默認的規則來處理該包。經過一次不匹配的規則至少相當于一次比較。由于netfilter/iptables有大量的表和鏈,經過的規則過多,會顯著影響其性能。讓數據包盡可能少的經過netfilter/iptables中的表和鏈是優化防火墻的最終要求,理想情況下數據包能夠達到以線速進行傳送。
一般過濾一類報文,會在默認的filter表中過濾,但是這些報文在到達filter表的FORWARD鏈之前,由圖1可以看到它會首先經過除filter表之外的其它表的某些鏈的所有規則,這會嚴重影響防火墻的過濾性能[4]。這種情況下,可以將filter表中的某些過濾規則前移到raw表或mangle表。
iptables -A FORWARD -d 192.168.2.0/24 -j DROP修改為
iptables -t raw -A PREROUTING -d 192.168.2.0/24 -j DROP
對于做了DNAT的報文,例如:
iptables -t nat -A PREROUTING -p tcp-d 111.173.99.38 --dport 80 -j DNAT --to 192.168.1.20:8080
由于nat表的PREROUTING鏈在filter表的INPUT鏈和FORWARD鏈之前,此時報文在filter表過濾時,已經做了DNAT。此時,可以考慮將過濾的規則前移至raw表的PREROUTING鏈,由于nat表的PREROUTING鏈在raw表的PREROUTING鏈之后,因此在將規則前移到raw表的PREROUTING鏈時,要考慮將規則中的地址作相應的轉換,
iptables -A FORWARD -p tcp -s 111.173.99.40 -d 192.168.1.20 --dport 8080 -j DROP 修改為
iptables -t raw -A PREROUTING -p tcp -s 111.173.99.40 -d 111.173.99.38 -dport 80 -j DROP ,這兩者的效果是一樣的,但是由于過濾規則提到了raw表之前,此時轉發效率得到了提高。
iptables的規則匹配是按順序來匹配的,規則的數量越多,效率就越低。iptables允許用戶自己定義一些規則鏈,在匹配集的基礎上,目標能夠向外擴展或中轉到用戶自己定義規則鏈上。這會有兩種情況存在,若是在用戶自定義鏈上規則沒有匹配成功,則在遍歷了用戶自定義規則后,控制會被轉回到調用鏈,繼續在調用鏈的下一規則上進行相應的匹配;若是在自定義規則鏈上規則匹配成功了,則會對數據包采取相應的行動,這樣控制就不會回到調用鏈了,這樣就大大減少了比較次數。
很多internet的服務程序可能用的是TCP協議,而UDP協議是一種非常簡單的協議,它是基于數據包收發的協議,所以基于該協議的數據包在經過TCP協議的規則鏈時,是不會使系統的負擔明顯加重[5],所以可以將TCP所有規則放在UDP規則之后。
由于ICMP數據包是一種發送頻率是相對較低的數據包,它里面只包含了少量的控制和狀態信息。并且只有Echo-Request ICMP數據包為了應對某種異常出站行為總是發送控制消息或者狀態消息的數據包。所以應該在防火墻規則后端放置ICMP協議。
通過改進,可以通過移動防火墻規則在iptables表中的位置,或者用戶自定義規則鏈,或者是根據一些規則的特點將它放置在防火墻規則之前或之后的方法來提高防火墻的性能。
[1] 王相林, 沈清姿. 高效的iptables規則集管理機制的研究與實現[J]. 杭州電子科技大學學報, 2011(6):59-62.
[2] 周增國, 李忠明. Linux平臺下Netfilter/Iptables包過濾防火墻的研究與應用[J]. 網絡安全技術與應用 , 2008(1):49-50.
[3] 趙躍華,周萬勝.防火墻過濾規則動態生成方案設計[J]. 計算機工程 ,2012, 38(2):135-137,140.
[4] 劉勇,蘇軍.Netfilter/Iptables防火墻的運行機制分析與性能優化[J].科技創新論壇, 2012(6):188.
[5] 吳延卯.iptables防火墻性能優化研究[J].計算機與現代化 ,2012(9):106-108.