基于DPDK收包的suricata的安装和运行

操作系统版本:Ubuntu 20.04.5
suricata版本: suricata-7.0.0-rc1

suricata是一个基于规则的入侵检测和防御引擎,功能强大,但性能可能 差强人意,不过目前最新的7版本已经支持DPDK收包了,DPDK是Intel提供的高性能网络收发包开源库,可想而知,suricata支持DPDK收包会带来性能的极大提升。

下面我们来看一下,如何安装基于DPDK收发包的suricata:
1、安装依赖包:
sudo apt-get -y install autoconf automake libtool && sudo apt-get -y install pkg-config && sudo apt-get -y install zlib1g-dev && apt install -y libpcre2-dev && apt install -y libpcre3-dev && apt-get -y install libyaml-dev && apt install -y libjansson-dev && apt install -y libpcap-dev && apt-get -y install libmagic-dev && apt-get -y install liblz4-dev && apt-get -y install libcap-ng-dev && apt -y install rustc cargo && sudo apt-get install -y libnet-dev && cargo install --force cbindgen

2、安装DPDK开发库:
apt-get install dpdk-dev
如果dpdk下载的版本太低(suricata支持的DPDK最低版本为19.11),需要更新apt的源,即修改/etc/apt/sources.list文件。
当然也可以下载自己想安装的DPDK版本,然后按照安装步骤把DPDK先安装好。DPDK的安装步骤可以参照之前的文章:DPDK的源码编译安装

3、下载igb_uio驱动并编译驱动:
git clone git://dpdk.org/dpdk-kmods
cd dpdk-kmods/linux/igb_uio
make
成功编译后,可以看到生成了igb_uio.ko驱动文件,后面会加载这个文件。

4、如果想使用Hyperscan来进行模式匹配,还需要事先安装好Hyperscan:
Hyperscan的安装步骤可以参照之前的文章:Hyperscan的源码编译安装

5、从github上下载suricata源码
git clone https://github.com/OISF/suricata.git suricata-7.0.0-rc1

6、切换到7.0.0-rc1版本:
cd suricata-7.0.0-rc1
git checkout suricata-7.0.0-rc1

7、从github下载http解析库libhtp,并生成Makefile:
git clone https://github.com/OISF/libhtp
cd libhtp
./autogen.sh
./configure --enable-rust=yes --enable-gccmarch-native=no CPPFLAGS=-I/usr/include/ CFLAGS=-g
cd …

8、编译和安装suricata:
./autogen.sh
./configure --enable-rust=yes --enable-gccmarch-native=no --enable-dpdk=yes --enable-libmagic=yes CPPFLAGS=-I/usr/include/ CFLAGS=-g
make -j
make install
make install-conf
make install-full

9、下载suricata规则:
sudo apt install -y python3-pip python-yaml
sudo pip install --upgrade suricata-update
suricata-update

10、检查编译的suricata是否支持DPDK:
suricata --build-info
在这里插入图片描述

11、修改suricata DPDK收包网卡配置:
先用lshw -C network -businfo命令找到网卡的pcie地址,然后在/usr/local/etc/suricata/suricata.yaml文件中配置suricata DPDK收包,主要修改interface和copy-iface配置。
在这里插入图片描述

dpdk:
  eal-params:
    proc-type: primary

  # DPDK capture support
  # RX queues (and TX queues in IPS mode) are assigned to cores in 1:1 ratio
  interfaces:
    - interface: 0000:0b:00.0 # PCIe address of the NIC port
      # Threading: possible values are either "auto" or number of threads
      # - auto takes all cores
      # in IPS mode it is required to specify the number of cores and the numbers on both interfaces must match
      threads: 1
      promisc: true # promiscuous mode - capture all packets
      multicast: true # enables also detection on multicast packets
      checksum-checks: true # if Suricata should validate checksums
      checksum-checks-offload: false # if possible offload checksum validation to the NIC (saves Suricata resources)
      mtu: 1500 # Set MTU of the device in bytes
      # rss-hash-functions: 0x0 # advanced configuration option, use only if you use untested NIC card and experience RSS warnings,
      # For `rss-hash-functions` use hexadecimal 0x01ab format to specify RSS hash function flags - DumpRssFlags can help (you can see output if you use -vvv option during Suri startup)
      # setting auto to rss_hf sets the default RSS hash functions (based on IP addresses)

      # To approximately calculate required amount of space (in bytes) for interface's mempool: mempool-size * mtu
      # Make sure you have enough allocated hugepages.
      # The optimum size for the packet memory pool (in terms of memory usage) is power of two minus one: n = (2^q - 1)
      mempool-size: 65535 # The number of elements in the mbuf pool

      # Mempool cache size must be lower or equal to:
      #     - RTE_MEMPOOL_CACHE_MAX_SIZE (by default 512) and
      #     - "mempool-size / 1.5"
      # It is advised to choose cache_size to have "mempool-size modulo cache_size == 0".
      # If this is not the case, some elements will always stay in the pool and will never be used.
      # The cache can be disabled if the cache_size argument is set to 0, can be useful to avoid losing objects in cache
      # If the value is empty or set to "auto", Suricata will attempt to set cache size of the mempool to a value
      # that matches the previously mentioned recommendations
      mempool-cache-size: 257
      rx-descriptors: 1024
      tx-descriptors: 1024
      #
      # IPS mode for Suricata works in 3 modes - none, tap, ips
      # - none: IDS mode only - disables IPS functionality (does not further forward packets)
      # - tap: forwards all packets and generates alerts (omits DROP action) This is not DPDK TAP
      # - ips: the same as tap mode but it also drops packets that are flagged by rules to be dropped
      copy-mode: ips
      copy-iface: 0000:13:00.0 # or PCIe address of the second interface

    - interface: 0000:13:00.0
      threads: 1
      promisc: true
      multicast: true
      checksum-checks: true
      checksum-checks-offload: false
      mtu: 1500
      #rss-hash-functions: auto
      mempool-size: 65535
      mempool-cache-size: 257
      rx-descriptors: 1024
      tx-descriptors: 1024
      copy-mode: ips
      copy-iface: 0000:0b:00.0

12、配置DPDK大页内存:
在/etc/default/grub中添加GRUB_CMDLINE_LINUX=“net.ifnames=0 biosdevname=0 default_hugepagesz=2M hugepagesz=2M hugepages=2048”,也可以根据CPU的配置为1G大页。
在这里插入图片描述
重新生成grub配置文件: grub-mkconfig -o /boot/grub/grub.cfg

13、查看大页内存是否生效:
reboot重启系统后,使用grep Huge /proc/meminfo查看大页内存配置
在这里插入图片描述

14、加载igb_uio驱动,并绑定网卡使用igb_uio驱动:
modprobe uio
insmod dpdk-kmods/linux/igb_uio/igb_uio.ko
先使用dpdk-devbind.py -s查看网卡驱动绑定情况:
在这里插入图片描述
绑定两张网卡使用igb_uio驱动:
dpdk-devbind.py -b igb_uio 0000:0b:00.0
dpdk-devbind.py -b igb_uio 0000:13:00.0

15、运行suricata:
至此,DPDK和suricata的运行环境都已经配置好了,我们现在使用suricata --dpdk来启动suricata试试:
在这里插入图片描述
OK,大功告成,我们已经成功迈出了学习研究suricata的第一步。
如果想测试下DPDK收发包是否正常,可以让刚刚DPDK收包指定的两个网卡分别连上两台主机,并配置同网段的IP地址,看两台主机能否互相访问。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
基于DPDK(Data Plane Development Kit)实现服务端和客户端的主要步骤如下: 1. 环境准备:首先需要确保DPDK已经正确安装并配置好了开发环境,包括正确安装可用的网卡驱动程序、配置正确的内存和共享内存等。 2. 服务端实现:在服务端的代码中,需要使用DPDK提供的API来初始化DPDK,包括初始化设备、设置设备属性,以及创建和配置接收数据包的队列等。然后,服务端需要创建一个socket并绑定到指定的IP地址和端口上。接下来,使用DPDK提供的API接收和处理客户端发送的数据包。 3. 客户端实现:在客户端的代码中,同样需要使用DPDK提供的API来初始化DPDK,并创建一个socket。然后,通过socket将数据包发送给服务端。客户端还可以通过DPDK提供的API来设置、修改发送数据包的属性,如目标IP地址和端口等。 4. 编译和运行:完成服务端和客户端的代码编写后,需要将代码编译成可执行文件。在编译时,需要使用DPDK提供的工具和指定相关的编译参数,如指定DPDK的路径、调整内核参数等。最后,将生成的可执行文件分别运行在服务端和客户端的主机上。 基于DPDK实现服务端和客户端可以提供高性能的网络连接和数据交互,减少了网络的延迟和负载。同时,DPDK还提供了丰富的API和功能,如多核支持、零拷贝等,可以进一步优化网络性能和提升系统吞吐量。因此,在需要处理大量网络数据流的场景下,基于DPDK实现服务端和客户端是一个很好的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程十万问

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值