美文网首页
suricata的netmap抓包模式的安装说明

suricata的netmap抓包模式的安装说明

作者: 明翼 | 来源:发表于2020-08-15 10:49 被阅读0次

suricata 简介

Suricata是一个免费、开源、成熟、快速、健壮的网络威胁检测引擎。Suricata引擎能够进行实时入侵检测(IDS)、内联入侵预防(IPS)、网络安全监控(NSM)和离线pcap处理。Suricata使用强大而广泛的规则和签名语言来检查网络流量,并提供强大的Lua脚本支持来检测复杂的威胁。使用标准的输入和输出格式(如YAML和JSON),使用现有的SIEMs、Splunk、Logstash/Elasticsearch、Kibana和其他数据库等工具进行集成将变得非常简单。Suricata项目和代码由开放信息安全基金会(OISF)拥有和支持,OISF是一个非盈利基金会,致力于确保Suricata作为一个开源项目的开发和持续成功。

suricata 支持多种抓包模式,比如通过AF-packet抓包,比如采用PF_RING(高性能的网络库,免费版本不支持Zero Copy)抓包,还支持Netmap抓包三种模式,其中性能最好的就是netmap抓包模式,本文就是介绍如何编译netmap版本的suricata。

一 安装前准备

suricata可以正常编译的临时下做以下操作检查。
1)netmap是需要更改网卡驱动的,所以开始时候必须看下网卡的类型,采用命令如下:

[root@localhost ~]# ethtool -i p1p1
driver: ixgbe
version: 5.3.7
firmware-version: 0x800003af
expansion-rom-version:
bus-info: 0000:01:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

通过上面命令看到驱动程序对应的网卡类型为ixgbe即10G即万兆网卡,英特尔的10G网卡(例如,82598、82599,x540)由ixgbe驱动支持,我们以后应该限制住网卡类型。
对于常见的驱动,我们在安装过一次的netmap后,netmap会自动下载这些驱动文件,我们提供的netmap软件最好使用这些驱动,防止客户环境无法下载这些驱动了。
2)内核源码查看
netmap编译的时候需要内核源码的支持,需要先查看内核的版本,并且在/ usr / src目录下看看是否存在内核源码,如果不存在则需要下载内核的内核并解压缩,放到此处。

[root@localhost netmap-master]# uname -r
3.10.0-693.el7.x86_64

或者:

[root@localhost netmap-master]# rpm -qa|grep kernel
kernel-3.10.0-693.el7.x86_64
kernel-tools-libs-3.10.0-693.el7.x86_64
kernel-headers-3.10.0-693.21.1.el7.x86_64
kernel-devel-3.10.0-693.el7.x86_64
kernel-tools-3.10.0-693.el7.x86_64

查询到内核版本后,可以查看源码是否存在:

[root@localhost ~]# ll /usr/src/
debug/   kernels/
[root@localhost ~]# ll /usr/src/
debug/   kernels/
[root@localhost ~]# ll /usr/src/kernels/
总用量 4
drwxr-xr-x. 22 root root 4096 9月  11 10:28 3.10.0-693.el7.x86_64

二 netmap编译和安装

  1. 以下为makefie文件生成和编译安装,说明如下:
    --drivers后面带着网卡的类型。
    --kernel-sources和
    --kernel-dir指定内核内核位置,如果内核内核为/usr/src/kernels下面则可以不提供这两个选项。
    make install命令需要root权限。
./configure  --kernel-sources=/usr/src/kernels/$(uname -r) --kernel-dir=/usr/src/kernels/$(uname -r) --prefix=/usr
make&& make install
  1. 网卡上参数设置:
    网卡本身有些技术提升抓包性能,对于suricata的抓包来说,需要关闭,下面参考suricata的相关文档来设置的
  • LRO/GRO 关闭
    数据包在数据量链路层传输的时候不能超过MTU(1500个字节),那么就需要进行拆包和组包,这部分工作如果有cpu来做,将耗费cpu资源,LRO和GRO技术是由网卡来进行组包和拆包。
    这是suricata的限制.
    ethtool -K p1p1 gro off lro off

  • 关闭硬件校验
    如果启动这个,dsize 在suricata中不可用了和tcp状态的跟踪,如果不用这个关键字可以考虑打开。
    ethtool -K p1p1 tx off rx off

  • 合并队列
    对很多网卡来说,不支持对称hash算法的话,如果多队列,会造成同一个流不同方向的包发到不同的队列上去,对suricata组包会有问题,所以大部分情况下,我们把队列个数改成1个,如果性能要求比较高,网卡支持对称hash算法的话,我们会考虑设置对称hash算法和改成多个队列的模式.

[root@localhost ~]# ethtool -l p1p1
Channel parameters for p1p1:
Pre-set maximums:
RX:     0
TX:     0
Other:      1
Combined:   63   #一共支持多少个队列
Current hardware settings:
RX:     0
TX:     0
Other:      1
Combined:   4  #现在起作用的是多少个队列

合并成一个队列

ethtool -L p1p1 combined 1
  • 网卡队列中包数目修改
    网卡丢包原因可以通过以下命令查看:
[root@localhost netmap-master]# ethtool -S p2p1|grep 'error'
     rx_errors: 0
     tx_errors: 0
     rx_over_errors: 0
     rx_crc_errors: 0
     rx_frame_errors: 0
     rx_fifo_errors: 0
     rx_missed_errors: 0
     tx_aborted_errors: 0
     tx_carrier_errors: 0
     tx_fifo_errors: 0
     tx_heartbeat_errors: 0
     rx_long_length_errors: 0
     rx_short_length_errors: 0
     rx_csum_offload_errors: 0
     fcoe_last_errors: 0
[root@localhost netmap-master]# ethtool -S p2p1|grep 'drop'
     rx_dropped: 0
     tx_dropped: 0
     rx_fcoe_dropped: 0

如果是rx_missed_errors 错误个数很多,需要扩大些队列的包数量.
如果是rx_dropped 多般是程序取包慢了造成缓冲区满了,包被丢掉,如果这种情况,扩大队列数量会稍微好点,但是如果流量持续很大,提升程序性能是王道。

#查看网卡队列中可以保存的包的大小。
[root@localhost netmap-master]# ethtool -g p2p1
Ring parameters for p2p1:
Pre-set maximums:
RX:     4096
RX Mini:    0
RX Jumbo:   0
TX:     4096
Current hardware settings:
RX:     512
RX Mini:    0
RX Jumbo:   0
TX:     512

# 队列中的包数量改成1024个,空间增加防止丢包
[root@localhost netmap-master]# ethtool -G p2p1 rx 1024
[root@localhost netmap-master]# ethtool -G p2p1 tx 1024
  1. 替换网卡驱动
    如果是你替换的是ssh或telnet的网卡,会造成掉线,有时候也只是闪断。
#!bin/sh
#在netmap下执行替换ixgbe的网卡驱动,网卡类型不同则不同,另外由于netmap会接管整个网卡需要注意下不能正在连接网卡上操作,会造成断网。
insmod netmap.ko
modprobe -r ixgbe
# 这种方式会断开连接
#rmmod  ixgbe
insmod /home/xxx/netmap-master/ixgbe-5.3.7/src/ixgbe.ko

验证安装结果:

[root@localhost ~]# ls /dev/netmap
/dev/netmap
[root@localhost ~]# lsmod|grep netmap
netmap                165523  1 ixgbe
# 看下内核日志
[root@localhost ~]# dmesg|grep netmap
  1. 运行测试程序
    pkt-gen是netmap自带的发包和收包工具,性能比tcpreplay更好,可以跑满网卡。
    位置如下:
[root@localhost netmap-master]# tree ./build-apps/pkt-gen/
./build-apps/pkt-gen/
├── GNUmakefile -> /home/miaohq/netmap-master/LINUX/../apps/pkt-gen/GNUmakefile
├── pkt-gen
├── pkt-gen-b
└── pkt-gen-b.o

用法如下:

#发包命令:
 pkt-gen -i p1p1 -n 100000 -z -Z -4 -l 512 -f tx
 
#收包命令:
 pkt-gen -i p1p1 -f rx

对于物理网卡来说,都有其网速极限,这个极限被称为线性速度,包的大小不同,pps即每秒转发包的数量不同,极限如下:

For a physical link, the maximum numer of packets per second can
be computed with the formula:
    pps = line_rate / (672 + 8 * pkt_size)
where "line_rate" is the nominal link rate (e.g 10 Gbit/s) and
pkt_size is the actual packet size including MAC headers and CRC.
The following table summarizes some results
            LINE RATE
    pkt_size \  100M    1G  10G 40G
      64    .1488   1.488   14.88   59.52
     128    .0589   0.589    5.89   23.58
     256    .0367   0.367    3.67   14.70
     512    .0209   0.209    2.09    8.38
    1024    .0113   0.113    1.13    4.51
    1518    .0078   0.078    0.78    3.12

三 suricata编译安装

./configure --prefix=/usr/local --sysconfdir=/etc/ --localstatedir=/usr/local/ --enable-unix-socket --with-libnss-libraries=/usr/lib64 --with-libnss-includes=/usr/include/nss3 --with-libnspr-libraries=/usr/lib64 --with-libnspr-includes=/usr/include/nspr4  --enable-nfqueue --enable-lua --enable-netmap

关键部分就是带上了--enable-netmap 然后再进行make && make install 即可完成编译安装。

验证编译后可执行文件是否支持netmap,可以通过以下命令查看:

[root@localhost .libs]# suricata --build-info
This is Suricata version 5.0.3 RELEASE
Features: PCAP_SET_BUFF AF_PACKET NETMAP HAVE_PACKET_FANOUT LIBCAP_NG LIBNET1.1 HAVE_HTP_URI_NORMALIZE_HOOK PCRE_JIT HAVE_NSS HAVE_LIBJANSSON TLS MAGIC RUST 
SIMD support: none
Atomic intrinsics: 1 2 4 8 byte(s)
64-bits, Little-endian architecture
GCC version 9.3.0, C version 199901
compiled with _FORTIFY_SOURCE=0
L1 cache line size (CLS)=64
thread local storage method: __thread
compiled with LibHTP v0.5.33, linked against LibHTP v0.5.33

Suricata Configuration:
  AF_PACKET support:                       yes
  eBPF support:                            no
  XDP support:                             no
  PF_RING support:                         no
  NFQueue support:                         no
  NFLOG support:                           no
  IPFW support:                            no
  Netmap support:                          yes v12
....

有此命令:Netmap support: yes v12 表示支持。

相关文章

网友评论

      本文标题:suricata的netmap抓包模式的安装说明

      本文链接:https://www.haomeiwen.com/subject/mtoodktx.html