Gnort:高性能网络入侵检测
1. 初始化与搜索阶段
在初始化阶段,CPU会在主机内存中构建每个规则组的状态机表,然后将其复制到GPU可直接访问的纹理内存中。在搜索阶段,所有状态机表仅存于GPU内存。使用GPU纹理内存而非通用GPU内存的好处在于内存读取会被缓存。缓存命中仅需一个周期,而从通用设备内存传输则可能需要数百个周期。由于Aho - Corasick算法具有很强的引用局部性,使用纹理内存存储状态机表可使GPU执行时间提升约19%。
对于Aho - Corasick搜索阶段,实现了两种不同的并行化方法:
- 方法一:将每个数据包分割成固定的相等部分,每个线程并行搜索数据包的每个部分。
- 方法二:为每个线程分配一个完整的数据包进行并行搜索。
2. 结果传输到CPU
当线程在数据包中匹配到模式时,会将匹配信息追加到之前在设备内存中分配的数组中。每个数据包的匹配报告将按其复制到纹理内存的顺序写入数组的单独一行,这意味着数组的行数与批量中的数据包数量相同。每个报告由匹配模式的ID和在数据包中找到的索引组成。
在为每个匹配对发出警报之前,需要检查以下额外情况:
- 区分大小写的模式:由于Aho - Corasick无法区分大小写字母,需要在找到模式的索引处进行额外的区分大小写的搜索。
- 面向偏移的规则:某些模式必须位于数据包有效负载的特定位置才能激活规则。例如,可能需要在有效负载的前5个字节内查找指定模式。在Snort中,使用特殊关键字(如offset、depth、distance等)指定这些范围。将匹配位置的索引与偏移量进行比较,以判断匹配是否有效。
- 具有公共后缀的模式:如果两个
Gnort:高性能网络入侵检测方案
超级会员免费看
订阅专栏 解锁全文
52

被折叠的 条评论
为什么被折叠?



