概况

Hyperscan作为一款高性能的正则表达式匹配库,非常适用于部署在诸如DPI/IPS/IDS/NGFW等网络解决方案中。Snort (https://www.snort.org) 是目前应用最为广泛的开源IDS/IPS产品之一,其核心部分涉及到大量纯字符串及正则表达式的匹配工作。本文将重点介绍如何将Hyperscan集成到Snort中来显著提升Snort的总体性能。具体集成代码已公开在 https://01.org/node/4298。

Snort简介

如图1所示,Snort主要分成五个部分。报文解析器负责从不同的网络接口接收到报文,并对报文内容进行初步的解析。预处理器是对解析过的报文进一步处理的插件,其功能包括HTTP URI归一化,报文整合,TCP流重组等。检测引擎是Snort当中最为核心的部分。它根据现有的规则,对报文数据进行匹配。匹配的性能对Snort总体性能起着至关重要的作用。假如匹配成功,则依据规则中定义的行为通知日志及报警系统。该系统可输出相应的警报或者日志。用户也可以定义输出模块来以特定形式(例如数据库,XML文件)保存警报或日志。

Hyperscan 的集成


如图2所示,Hyperscan与Snort的集成主要集中在以下四个方面:

纯字符串匹配

用户可以在Snort规则中定义匹配特定的字符串,并在相应报文中寻找该字符串。Snort中采用了Boyer-Moore算法进行匹配。我们用Hyperscan对这一算法进行替换以提升匹配性能。

PCRE匹配

Snort中使用了PCRE来作为正则表达式匹配的引擎。Hyperscan兼容了PCRE的语法规则,但不支持少数回溯及断言语法。但是Hyperscan本身自带有PCRE的预处理功能(PCRE Prefiltering),可以通过对PCRE规则进行变换以兼容Hyperscan。实际规则产生的匹配是变换后的规则所产生匹配的子集。因此可以使用Hyperscan进行预先扫描,若不产生匹配则实际规则也无匹配。若产生了匹配,可以通过PCRE的扫描来确认是否有真正的匹配。由于Hyperscan的总体性能高于PCRE,Hyperscan的预先过滤可以避免PCRE匹配带来的过大时间开销。

多字符串匹配

Snort中另外一个重要的匹配过程是多字符串的匹配。多字符串的匹配可以快速过滤掉无法匹配的规则以减少需要逐条匹配的规则数从而提升匹配的性能。Snort中使用了Aho-Corasick算法进行多字符串的匹配。我们用Hyperscan替代了这一算法并且带来了显著的性能提升。

Http预处理

除了引擎的匹配算法的集成,我们在预处理器中也添加了Hyperscan。在做Http预处理时,我们利用了Hyperscan搜索相关关键字来进一步加速预处理的流程。

性能数据

我们选取了Snort自带的VRT 规则(8683条)作为测试规则,同时以存有真实网络流量信息的PCAP文件作为输入进行测试。图3展示了在Broadwell-EP平台下,原生Snort和经过Hyperscan加速的Snort在单核单线程下的性能对比。我们可以看到,Hyperscan极大提升了Snort的匹配性能,总体性能约是原始Snort性能的6倍。另外,我们对原生Snort与经过Hyperscan优化后的Snort在内存消耗方面进行了比较。由于原生Snort依赖于Aho-Corasick算法,需要将所有规则转化成Trie树结构,因此占用较大的内存。而Hyperscan拥有自身优化过的匹配引擎进行匹配,大量减少了匹配过程中对内存的消耗。如图4所示,在这个测试中,总体上原始Snort所占用的内存是经过Hyperscan优化后的Snort的12倍。

总结

经过Hyperscan集成后的Snort不管在总体性能还是内存消耗上都远远优于原始Snort。由此,Hyperscan展现了大规模规则匹配的强大能力,非常适用于以规则匹配为核心的DPI/IDS/IPS/NGFW等产品中。

原文:DPDK开源社区

标签: hyperscanpcresnort正则匹配正则表达式留下评论

Hyperscan与Snort的集成方案的更多相关文章

  1. Spring+Struts集成(方案一)

    SSH框架是现在非常流行的框架之一,本文接下来主要来对Spring和Struts的集成进行展示. 集成原理:在Action中取得BeanFactory,通过BeanFactory取得业务逻辑对象. 集 ...

  2. SSO集成方案[随笔]

    看这个方案之前,先说明下为什么要加入SSO,以防对大家产生不好的影响.我们产品使用传统winform+db服务+Db存储方式开发,一群老菜帮子开发,以传统的datatble做数据传递,很多年了未有变化 ...

  3. Jmeter+Ant+Jenkins持续集成方案改进

    关于Jmeter+Ant+Jenkins如何搭建持续集成环境,网上资料一大把,就不多说了,本文主要谈一下期间的问题及扩展该持续集成方案. 其实核心的流程不复杂,Jenkins管理构建项目,Ant配置脚 ...

  4. FineReport和泛微OA(Ecology)的单点登录集成方案

    最近出现了很多关于帆软报表和泛微OA的集成问题,均出现在“单点登录”上.直接也有相关的文章介绍一些FineReport和泛微集成的背景.价值等,以及FineReport和OA的深度集成的方案,但是并没 ...

  5. (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案二

    http://blog.csdn.net/yerenyuan_pku/article/details/52894958 前面我们已经集成了Spring4.2.5+Hibernate4.3.11+Str ...

  6. (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一

    http://blog.csdn.net/yerenyuan_pku/article/details/52888808 前面我们已经集成了Spring4.2.5+Hibernate4.3.11这两个框 ...

  7. 日志服务与SIEM(如Splunk)集成方案实战

    背景信息 目标 本文主要介绍如何让阿里云日志服务与您的SIEM方案(如Splunk)对接, 以便确保阿里云上的所有法规.审计.与其他相关日志能够导入到您的安全运维中心(SOC)中. 名词解释 LOG( ...

  8. CDC+ETL实现数据集成方案

    欢迎咨询,合作! weix:wonter 名词解释: CDC又称变更数据捕获(Change Data Capture),开启cdc的源表在插入INSERT.更新UPDATE和删除DELETE活动时会插 ...

  9. vue+element-ui JYAdmin后台管理系统模板-集成方案【项目搭建篇2】

    项目搭建时间:2020-06-29 本章节:讲述基于vue/cli, 项目的基础搭建. 本主题讲述了: 1.跨域配置 2.axios请求封装 3.eslint配置 4.环境dev,test,pro(开 ...

随机推荐

  1. eclipse git 创建新分支 合并分支 删除分支

    创建分支: 合并分支: 删除分支:

  2. 吴裕雄 26-MySQL 复制表

    如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的.本章节将为大家介绍如何完整的复制MySQL数据 ...

  3. 吴裕雄 19-Mysql 连接的使用

    JOIN 按照功能大致分为如下三类:INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录.LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录.RIGHT ...

  4. 学JS的心路历程-物件与原型(三)

    昨天有说明到函式与建构式的原型,及指定建构式函式原型为另一个建构式函式,但其实这会造成复写constructor的问题. 复写constructor的问题(vmwork) 我们昨天有提到「建构式函式可 ...

  5. 利用等概率Rand5产生等概率Rand3(转)

    问题本身很明确,但不知道起个什么题目好,姑且先这么说吧. 问题描述:现在有一个叫做Rand5的函数,可以生成等概率的[0, 5)范围内的随机整数,要求利用此函数写一个Rand3函数(除此之外,不能再使 ...

  6. 我在eclipse输出的第一个hello world!

    下学期就要学习JAVA 语言,我现在对它好像还真的是一无所知.记得两次在帮学长做测评的时候,他们都说要装上eclipse.然后从放假我就忙着下载,安装,但是由于官网都是英文,似乎一直在出差错.询问了学 ...

  7. 寒假生活第一天——Github初体验

    快开学了,今天体验了一下github这个对我来说很是神秘的东西 它的定义来源于百度百科,如有异议,那就有吧.//gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格 ...

  8. linux下的arm汇编程序

    1.gnu 的编译环境搭建 解压编译工具,加入环境变量PATH 2.编译相关命令的使用 编译命令 arm-linux-gcc  -g -c -o led.o main.o led.c main.c / ...

  9. div下面多个a标签的点击事件,并且获取a的属性

    $('.fensiselect').on('click','a',function(){ var id= $(this).attr('fanid'); alert(id) })

  10. css 鼠标选中内容背景色

    ::selection { background: rgba(32, 178, 170, .6); color: #ffffff; } ::-moz-selection { background: r ...