2010/10/01
Improving Suricata performance with bitmask based signature prefiltering
上几周我花费了大量时间提高Suricata的表现,取得了较好的进展。我做了很多优化,最显著的是一种预过滤签名(signature)的新方式。我在这里简要解释一下。
首先解释一下Suricata是如何选择签名进行检查的。当Suricata启动时,它将签名组织成组,代码中命名为SigGroupHead。为了减少每个包需要检查的签名数量,分组实在很多属性上完成的:flow direction, protocol, src ip, dst ip, src port, dst port。尽管这样分组十分粗暴,每个单独的SigGroupHead仍然可以包含成千上万的签名。例如 Emerging Threats web-client 签名几乎都包含在了相同的SigGroupHead中。
The bitmask prefilter --- 位掩码预过滤器
每个签名都在引擎初始化时创建一个位掩码,为每一个需要匹配的“特征”设置一位。这种特征有: needs payload, needs flowbit set, needs flow, needs http state。
在运行时,我们为每个包创建一个掩码。在这些包中设置标志以表示这个包是否有payload,是否有相关的flow,flow又是否有flowbits,诸如此类。这个操作非常廉价,因为它只需要对每个包进行一次且相对简单的检查。
这个过程的最后一步,我们将一个SigGroupHead中每个签名的掩码与包的掩码进行比较。
if ((packetmask & sigmask) != sigmask)
skip_this_signature();
使用这个过滤器后,使用flowbits变得更有吸引力了。大多数flow没有设置flowbits,所以这样一来有效排除了所有需要花一点时间来检查flowbits的签名。
网友评论