概况

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. 如何用java完成一个中文词频统计程序

    要想完成一个中文词频统计功能,首先必须使用一个中文分词器,这里使用的是中科院的.下载地址是http://ictclas.nlpir.org/downloads,由于本人电脑系统是win32位的,因此下 ...

  2. git---远程仓库版本回滚

    开发中,发现有错误版本提交带远程分支master,怎么处理? 1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客. 2 问题 如果提交了一个错误的版本,怎么回 ...

  3. Jetty 与 Tomcat 的比较

    Tomcat 和 Jetty 都是作为一个 Servlet 引擎应用的比较广泛,可以将它们比作为中国与美国的关系,虽然 Jetty 正常成长为一个优秀的 Servlet 引擎,但是目前的 Tomcat ...

  4. Java虚拟机1

    Java内存区域 程序计数器(Program Counter Register):记录当前线程所执行字节码的行号指示器.字节码解释器工作时,判断是循环,分支,跳转,异常等条件,然后更新这个计数器的值来 ...

  5. VM虚拟机 Centos7 lnmp环境 配置域名问题 windows浏览器访问的问题

    CentOS7  ip地址为 192.168.0.155 搭有 LNMP集成环境 执行 lnmp vhost add 配置服务器 指定目录的域名 mark.com 这时windows 机器的 浏览器想 ...

  6. 第二章 向量(d5)有序向量:插值查找

  7. Dbutils 连接数据库

    用了JDBC后接着学习Dbutils连接数据库 1.添加驱动包 Class.forName("oracle.jdbc.driver.OracleDriver"); 2.获取数据库连 ...

  8. Python: 调用youtube_dl实现视频下载

    研究PySide与youtube_dl结合实现视频下载,抽丝剥蚕,步步维艰,却也颇有意思. 记录初始心得.界面以PySide之Qt编写,调用youtube_dl下载,回调出下载进度,代码如下: # e ...

  9. classLoader.getResourceAsStream中文乱码

    一直用一个方法安然无恙,今天在新项目中突然乱码了,原代码: ClassLoader classLoader = Thread.currentThread().getContextClassLoader ...

  10. war包内更新文件

    感谢@这个博客提供的分享 亲测有效,原文: 1.如果要替换的文件直接在war包的根目录(一级目录)下,直接使用jar uvf命令替换即可 如:替换a.war中b.xml文件 jar uvf a.war ...