2021-05-12 14:32:11
Linux軟防火牆ACL匹配的優化點
首先,請求不要再誣陷Netfilter!雖然它有一些固有效能損耗,但敬請不要將iptables和Netfilter等同,如果你要抓元凶,請直接說iptables,而不要說成Netfilter!
iptables真的是弱爆了!它的ipt_do_table竟然是五大元兇之一,如果規則超過了7000,那麼它就是之首(其它的元兇是nf_conntrack函數,它們也是Netfilter的HOOK)。iptables低效的原因在於它的ACL規則沒有經過預處理,直接使用人類設定的方式和順序讓封包逐個匹配,就跟在Linux協定棧中路由表沒有轉換成轉發表而直接讓封包執行最長字首匹配一樣!這不是Linux的錯,也不是Netfilter的錯,而是你的錯。你咋就不試著使用或者修改nf-HiPAC呢?
ACL的元素匹配可以分為“與”和“或“,一般認為,與操作在同一條規則內進行,而或操作則表示不同的規則,比如下面的規則:
iptables -A FORWARD -d $ip1 -p tcp -j DROP
iptables -A FORWARD -d $ip2 -p udp -j DROP
其中,ip1和tcp以及ip2和udp就是與操作,而兩條規則則是或操作,如果我們進行分組,就會得出同組要序列,不同組可並行操作的結論。
如果將兩條規則進行預處理,重新顛倒分組,我們能否不按規則而按匹配元素來重新分組呢?這麼做是有理由的,因為匹配元素的數量是固定的,而規則數量則是不固定的,我們必須在海量元素之間可以執行快速的查詢演算法而不是順序遍歷匹配的演算法,因此必須不能讓海量元素作為同組元素序列。在ACL匹配過程中,遍歷和快速查詢都是需要的(前面說過的,同組序列-只能遍歷,異組並行-可執行任意演算法),但是必須記住的是,不要按照規則將規則分到一個組,而要以匹配元素為分組基準。要知道,人的理解方式和計算機的處理方式是完全不同的,甚至是相反的。
大多數的防火牆產品(Cisco,華為的暫不說,XXWRT的都有類似的修補程式,也許?嗯,好象是真的,雖然我沒有親見,只是猜的...)都對待人工敲進去的ACL規則鏈都進行了預處理,這其實也是nf-HiPAC的方式,我之前寫過幾篇相關的文章。而Linux的iptables並沒有任何的預處理,這就是它低效的原因,但這種低效不能歸結到Linux或者Netfilter身上,請明悉。
--------------------------------------分割線 --------------------------------------
CentOS 7.0關閉預設防火牆啟用iptables防火牆 http://www.linuxidc.com/Linux/2015-05/117473.htm
iptables使用範例詳解 http://www.linuxidc.com/Linux/2014-03/99159.htm
Linux防火牆iptables詳細教學 http://www.linuxidc.com/Linux/2013-07/87045.htm
iptables的備份、恢復及防火牆指令碼的基本使用 http://www.linuxidc.com/Linux/2013-08/88535.htm
Linux下防火牆iptables用法規則詳解 http://www.linuxidc.com/Linux/2012-08/67952.htm
--------------------------------------分割線 --------------------------------------
本文永久更新連結地址:http://www.linuxidc.com/Linux/2015-07/120040.htm
相關文章