suricata的netmap抓包模式安装

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
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 表示支持。

四 诗词欣赏

商山早行
[唐] 温庭筠
晨起动征铎,客行悲故乡。
鸡声茅店月,人迹板桥霜。
槲叶落山路,枳花明驿墙。
因思杜陵梦,凫雁满回塘。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值