使用基于位掩码的签名预过滤器提高Suricata的性能

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的签名。

你可能感兴趣的:(使用基于位掩码的签名预过滤器提高Suricata的性能)