2010/10/01
Improving Suricata performance with bitmask based signature prefiltering
上幾周我花費了大量時間提高Suricata的表現(xiàn)炭晒,取得了較好的進(jìn)展莺禁。我做了很多優(yōu)化撤师,最顯著的是一種預(yù)過濾簽名(signature)的新方式。我在這里簡要解釋一下书斜。
首先解釋一下Suricata是如何選擇簽名進(jìn)行檢查的。當(dāng)Suricata啟動時毅贮,它將簽名組織成組惜犀,代碼中命名為SigGroupHead。為了減少每個包需要檢查的簽名數(shù)量马昨,分組實在很多屬性上完成的:flow direction, protocol, src ip, dst ip, src port, dst port竞帽。盡管這樣分組十分粗暴,每個單獨的SigGroupHead仍然可以包含成千上萬的簽名鸿捧。例如 Emerging Threats web-client 簽名幾乎都包含在了相同的SigGroupHead中屹篓。
The bitmask prefilter --- 位掩碼預(yù)過濾器
每個簽名都在引擎初始化時創(chuàng)建一個位掩碼,為每一個需要匹配的“特征”設(shè)置一位匙奴。這種特征有: needs payload, needs flowbit set, needs flow, needs http state堆巧。
在運行時,我們?yōu)槊總€包創(chuàng)建一個掩碼泼菌。在這些包中設(shè)置標(biāo)志以表示這個包是否有payload谍肤,是否有相關(guān)的flow,flow又是否有flowbits哗伯,諸如此類荒揣。這個操作非常廉價,因為它只需要對每個包進(jìn)行一次且相對簡單的檢查焊刹。
這個過程的最后一步乳附,我們將一個SigGroupHead中每個簽名的掩碼與包的掩碼進(jìn)行比較。
if ((packetmask & sigmask) != sigmask)
skip_this_signature();
使用這個過濾器后伴澄,使用flowbits變得更有吸引力了。大多數(shù)flow沒有設(shè)置flowbits阱缓,所以這樣一來有效排除了所有需要花一點時間來檢查flowbits的簽名非凌。