hyperscan在IPS/IDS产品中的应用

hypercan简介

Hyperscan 5.4 Developer’s Reference Guide — Hyperscan 5.4.0 documentation

hyperscan是基于intel的高速正则表达式匹配引擎,这个基于状态机(Automata)的引擎经过了多年开发经过不断优化与完善,效率非常之高,虽然没有pcre等对正则语法支持全面,但非常适用于网络设备。用户可以在网络设备数据面(Data Plane)使用hyperscan进行规则匹配,实现高性能DPI/lPS/IDS等应用

GitHub - intel/hyperscan: High-performance regular expression matching library

环境要求

    GCC, v4.8.1 or higher

    Clang, v3.4 or higher (with libstdc++ or libc++)

    Intel C++ Compiler v15 or higher

依赖的库

Dependency

Version

Notes

CMake

>=2.8.11

Ragel

6.9

Python

2.7

Boost

>=1.57

Boost headers required

Pcap

>=0.8

Optional: needed for example code only

gcc 版本必须大于v4.8.1 

下载 wget ftp://gcc.gnu.org/pub/gcc/releases/gcc-4.8.2/gcc-4.8.2.tar.bz2    下载源码包

    # tar -jxvf gcc-4.8.2.tar.bz

    # cd gcc-4.8.2.tar.bz2

    # ./contrib/download_prerequisites     执行中会下载3个包,mpfr、gmp、mpc,

编译安装gmp

    # cd gmp &&  mkdir build &&  cd build/

    #  ../configure --prefix=/usr/local/gcc/gmp-4.3.2  &&  make && make install

编译安装mpfr

    #  cd ../../mpfr && mkdir build && cd build/

    # ../configure --prefix=/usr/local/gcc/mpfr-2.4.2 --with-gmp=/usr/local/gcc/gmp-4.3.2 && make&&make install

编译安装mpc

    # cd ../../mpc && mkdir build && cd build

    # ../configure --prefix=/usr/local/gcc/mpc-0.8.1 --with-mpfr=/usr/local/gcc/mpfr-2.4.2 --with-gmp=/usr/local/gcc/gmp-4.3.2 && make && make install

 添加共享库路径

    # vim /etc/ls.do.conf    加入如下内容

    /usr/local/gcc/gmp-4.3.2/lib

    /usr/local/gcc/mpfr-2.4.2/lib

    /usr/local/gcc/mpc-0.8.1/lib

    保存退出,执行ldconfig

编译gcc

    # cd ../../

    # mkdir build

    # cd build

    # ../configure --prefix=/usr/local/gcc --enable-threads=posix --disable-checking --enable-languages=c,c++ --disable-multilib

    # make && make install

    # yum remove gcc gcc-c++ && updatedb 卸载旧版本

    # 链接到新版本

    # cd /usr/bin && ln -s /usr/local/gcc/bin/gcc gcc  && ln -s /usr/local/gcc/bin/g++ g++

Cmake安装

    可以查看是否安装cmake

    # rpm -qa | grep cmake

    cmake-2.8.12.2-4.el6.x86_64

ragel安装

    下载并安装ragel

    #tar zxvf ragel-6.9.tar.gz && cd ragel-6.9  &&  ./configure &&  make && make install

python版本升级(编译boost的时候需要2.7版本的python)

升级python至2.7

    # wget http://www.python.org/ftp/python/2.7.3/Python-2.7.2.tgz

    # mkdir /usr/local/python-2.7.2,之后编译安装,指定prefix为新建目录。

    # ./configure --prefix=/usr/local/python-2.7.2

    # make && make install

    # mv /usr/bin/python /usr/bin/python_old

    # ln -s /usr/local/python-2.7.2/bin/python2.7 /usr/bin/python

    # python -V    验证版本是否正确2.7.2

pcap安装

    查看系统是否安装pcap

    # rpm -qa | grep pcap

    libpcap-1.0.0-6.20091201git117cb5.el6.x86_64

boost安装

    下载安装包

    # tar -xvf  boost_1_60_0.tar && cd boost_1_60_0

    #  ./bootstrap.sh    ## 生成了bjam 和b2 安装工具

    #  ./b2

    #  ./b2 install

hyperscan安装

# wget https://codeload.github.com/01org/hyperscan/tar.gz/v4.3.0

# tar xvzf v4.3.0  && cd hyperscan-4.3.0/ && mkdir hs_build  &&cd hs_build

# cmake ../../hyperscan-4.3.0

#  cmake --build .

#  make install

hyperscan验证

    # ./bin/unit-hyperscan   验证hyperscan,提示libstdc版本问题。

    #  ./bin/unit-hyperscan: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./bin/unit-hyperscan)

    # 解决方法

    # find / -name libstdc++.so.6

    /usr/local/gcc/lib64/libstdc++.so.6

    /usr/lib64/libstdc++.so.6

    # cd /usr/lib64/ && mv libstdc++.so.6 libstdc++.so.6_bak

    # cp /usr/local/gcc/lib64/libstdc++.so.6.0.18 /usr/lib64

    # ln libstdc++.so.6.0.18 libstdc++.so.6

    #运行测试程序./bin/unit-hyperscan  OK出现下面的提示

    

hyperscan设计目标

高性能,包括正常应用场景和边界条件下

较小的database(正则表达式编译后形成的数据)

运行于流模式时,较小的流状态数据(stream state) 。这种模式下每条流都要维护自己的流状态。

另外,还有一些设计要求或限制:

    运行库必须以C实现,因为一些数据面环境不支持C++

    不可以在运行时任意请求内存,用到的内存仅包 括database、匹配临时数据(scratch)和流状态(在流模式下)。

    database必须是平面化(flat)的内存布局,以便可以序列化/反序列化,或者可以内存中的一处移动到另一处(这意味着内部不能含有指针)

重要概念

编译:就是将多个正则表达式编译为hyperscan database,调用编译接口时可以传入一些flags和mode等参数,控制匹配行为和运行模式,主要API:

hs_compile()

hs_compile_multi()

hs_compile_ext_multi()

匹配:就是基于编译好的database,对数据进行匹配,并得到匹配结果。

hyperscan在进行匹配时需要有一个临时数据(scratch),这块数据需要在数据面运行前就分配(不在运行时分配和释放,保证性能),且需要保 证同一时刻仅有一个匹配过程在使用同一块临时数据。

如果使用流模式,还需要预先为每个流分配流状态数据。

运行模式主要有3个:BLOCK、STREAM和VECTORED。

    BLOCK模式就是对多个数据块分别进行匹配;

    STREAM模式 将特定的一组数据库视为一个STREAM,为每一个STREAM维护状态信息,它可以跨数据块进行匹配;

    VECTORED模式可以一次匹配多个数据块。使 用不同模式参数编译的database在匹配时不能混用。

匹配的API主要有

hs_scan()

hs_scan_vector()

hs_scan_stream()

配置文件

后台配置文件hyperscan.conf 举例:

-desc this is a config file of pcre rule

-name pcre_rule

-offset 1

-depth 10

-min_payload 100

-relation 1

-action 13

-pattern ^01aa*

参数说明

desc

合法字符串

正则防护规则的描述

name

合法字符串

正则防护规则的名称

offset

整型

匹配报文payload的偏移(tcp头以后的偏移)

depth

整型

正则匹配的长度,即从offset处开始匹配的长度

min_payload

整型

最小的payload长度

relation

整型

防护组的ID??

pattern

合法正则表达式字符串

正则表达式,注意每一个防护组最多配置5个正则规则

action

整型

匹配了正则需要执行的动作:

SC_FW_DROP,SC_FW_ACCEPT,ACL_DROP_ADDBLACK,ACL_DROP_SENDRST

IPS/IDS防护引擎中的应用

正则扫描范围

TCP报文基于tcp头之后的特定偏移开始扫描正则匹配

基于防护组配置正则规则

每个防护组单独编译数据库

支持基于字符串和十六进制字节流2种匹配方式

匹配的要素

offset

depth

pattern

min_payload

action

性能相关

按照官方给出的测试实例pcapscan

测试例子:

报文2,261,924个报文,配置正则规则10000条

Streaming mode:

database compiled in 0.170277 seconds.

  Total matches: 0

  Match rate:    0.0000 matches/kilobyte

  Throughput (with stream overhead): 674.86 megabits/sec

  Throughput (no stream overhead):   674.89 megabits/sec

Block mode:

  database compiled in 0.588633 seconds.

  Total matches: 0

  Match rate:    0.0000 matches/kilobyte

  Throughput:    1074.08 megabits/sec

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值