23.2. Napatech

23.2.1. 目录

  • 简介

  • 软件包安装

  • 基础配置

  • 高级多线程配置

23.2.2. 简介

Napatech数据包捕获加速卡可通过以下硬件特性显著提升Suricata部署性能:

  • 板载突发缓冲(最高12GB)

  • 零拷贝内核旁路DMA

  • 非阻塞式PCIe性能

  • 端口聚合

  • 负载分发至128个主机缓冲区

  • 精确时间戳

  • 准确时间同步

该软件包使用专有shell脚本处理安装流程。无论哪种情况,编译内核模块和安装软件都需要gcc、make及内核头文件。

23.2.3. 软件包安装

注意:安装需要make、gcc和内核头文件

同时需要root权限

最新驱动和工具安装包可从以下地址下载:https://www.napatech.com/downloads

注意:安装过程中会提示安装Napatech libpcap库。若需在Wireshark、tcpdump或其他基于pcap的应用中使用Napatech卡捕获数据包,请回答"yes"。Suricata不需要libpcap,因其已内置原生Napatech API支持

基于Red Hat的发行版:

$ yum install kernel-devel-$(uname -r) gcc make
       $ ./package_install_3gd.sh

基于Debian的发行版:

$ apt-get install linux-headers-$(uname .r) gcc make
       $ ./package_install_3gd.sh

所有发行版完成安装后需启动 ntservice

$ /opt/napatech3/bin/ntstart.sh -m

23.2.4. Suricata安装

下载并解压Suricata源码包后,需运行configure启用Napatech支持并准备编译:

$ ./configure --enable-napatech --with-napatech-includes=/opt/napatech3/include --with-napatech-libraries=/opt/napatech3/lib
$ make
$ make install-full

23.2.5. Suricata配置

编辑suricata.yaml文件进行系统配置。有三种配置方式:

  1. 无CPU绑定的自动配置:在此模式下于suricata.yaml文件中指定流配置,允许线程自由调度。适用于单处理器系统,NUMA节点配置不影响性能的场景。

  2. 带CPU绑定的自动配置:此模式通过工作线程的CPU绑定控制流的创建与配置。suricata.yaml中每个CPU对应创建一个流和一个工作线程。最适合多NUMA节点系统(即多处理器系统),主机缓冲区的NUMA节点会与线程运行的核心匹配。

  3. 手动配置(传统模式):此模式下通过运行Suricata前执行NTPL命令来配置底层Napatech流。Suricata启动后连接到现有流。

23.2.6. 示例配置 - 无CPU绑定的自动配置:

若不使用CPU绑定,需在Suricata配置文件中明确定义流。使用此选项需在配置文件中设置以下参数:

  1. 关闭CPU绑定

  2. 启用Napatech"auto-config"选项

  3. 指定启动时应创建的流

  4. 指定向Suricata提供流量的端口

  5. 指定用于将流量分发到流的哈希模式

设置选项如下:

threading:
  set-cpu-affinity: no
    .
    .
    .
napatech:
    auto-config: yes
    streams: ["0-3"]
    ports: [all]
    hashmode: hash5tuplesorted

同时修改 ntservice.ini ,确保为流分配足够的主机缓冲区,并建议设置 TimeSyncReferencePriority 。修改内容如下:

HostBuffersRx = [4,16,-1] # [主机缓冲区数量, 大小(MB), NUMA节点] TimeSyncReferencePriority = OSTime # 时间戳时钟与操作系统同步

修改ntservice后停止并重启 ntservice

$ /opt/napatech3/bin/ntstop.sh
$ /opt/napatech3/bin/ntstart.sh

现在可启动Suricata:

$ suricata -c /usr/local/etc/suricata/suricata.yaml --napatech --runmode workers

23.2.7. 示例配置 - 带CPU绑定的自动配置:

此选项将为 worker-cpu-set 中每个CPU创建单一工作线程和流。使用此选项需修改suricata.yaml:

  1. 开启CPU绑定

  2. 指定worker-cpu-set

  3. 启用Napatech"auto-config"选项

  4. 指定向Suricata提供流量的端口

  5. 指定用于控制流量分发到不同流/CPU的哈希模式

最终配置类似:

threading:
  set-cpu-affinity: yes
  cpu-affinity:
    management-cpu-set:
      cpu: [ 0 ]
    receive-cpu-set:
      cpu: [ 0 ]
    worker-cpu-set:
      cpu: [ all ]
      .
      .
      .
napatech:
  auto-config: yes
  ports: [all]
  hashmode: hash5tuplesorted

在此模式下运行Suricata前,还需为每个NUMA节点配置足够的主机缓冲区。例如:双处理器服务器共32核且计划使用全部核心时,需在每个NUMA节点分配16个主机缓冲区。同时建议将Napatech卡时间源设为操作系统。

修改ntservice.ini如下:

TimeSyncReferencePriority = OSTime  # 时间戳时钟与操作系统同步
HostBuffersRx = [16,16,0],[16,16,1] # [主机缓冲区数量, 大小(MB), NUMA节点]

修改ntservice后停止并重启:

$ /opt/napatech3/bin/ntstop.sh -m
$ /opt/napatech3/bin/ntstart.sh -m

现在可启动Suricata:

$ suricata -c /usr/local/etc/suricata/suricata.yaml --napatech --runmode workers

23.2.8. 示例配置 - 手动配置

手动配置下,Napatech流通过运行Suricata前执行NTPL命令创建。

注意:此选项主要为传统配置保留,此前这是配置Napatech产品的唯一方式。流感知和内联处理等新功能无法手动配置。

本例将设置Napatech捕获加速卡合并所有物理端口,然后将合并流量分发至Suricata将处理的四个流。

配置步骤:
  1. 在suricata.yaml中禁用Napatech自动配置选项

  2. 在suricata.yaml中指定Suricata使用的流

  3. 创建含NTPL命令的文件以配置底层Napatech流

首先配置suricata.yaml如下:

napatech:
  auto-config: no
  streams: ["0-3"]

接着确保ntservice.ini中定义足够主机缓冲区,并建议设置时间同步。修改如下:

TimeSyncReferencePriority = OSTime      # 时间戳时钟与操作系统同步
HostBuffersRx = [4,16,-1]               # [主机缓冲区数量, 大小(MB), NUMA节点]

修改ntservice后停止并重启:

$ /opt/napatech3/bin/ntstop.sh
$ /opt/napatech3/bin/ntstart.sh

ntservice运行后,需执行以下NTPL(Napatech编程语言)命令完成设置。创建含以下命令的文件:

Delete=All                              # 删除现有过滤器
Assign[streamid=(0..3)]= all    # 分配所有物理端口至流ID 0

使用 ntpl 工具执行命令:

$ /opt/napatech3/bin/ntpl -f <my_ntpl_file>

现在可启动Suricata:

$ suricata -c /usr/local/etc/suricata/suricata.yaml --napatech --runmode workers

通过创建适当NTPL文件并将Suricata附加到流,可指定更复杂的配置。

23.2.9. 流绕过

在支持流感知的Napatech产品上,单个流的流量可在Suricata检查初始数据包后由硬件自动丢弃(IDS模式)或转发(内联配置)。这将节省CPU资源,因已裁决流的后续数据包不再由Suricata处理。通过配置文件Napatech部分的hardware-bypass选项启用。

使用硬件绕过时,必须配置接收网络上下游流量的端口信息,以便硬件正确处理双向流量。这在"ports"部分以连字符分隔的端口对列表形式指定,例如:

napatech:
  hardware-bypass: true
  ports[0-1,2-3]

注意:IDS配置也需要这些"端口配对",因硬件需知连接双方到达的端口。

对于依赖光分路器的配置,配对双方通常是不同端口。对于SPAN端口配置(上下游流量均送达单一端口),"端口对"两侧将引用相同端口。

例如分路器配置形式类似:

ports[0-1,2-3]

而SPAN端口配置则类似:

ports[0-0,1-1,2-2,3-3]

注意:SPAN和分路器配置可在同一适配器上组合使用。

Suricata可通过多种方式配置绕过流量。一种是在配置文件中启用stream.bypass,例如:

stream:
  bypass: true

启用后,当Suricata评估流的初始块(其大小也可配置)后,将指示流的剩余数据包可被绕过。IDS模式下这意味着流的后续数据包将被丢弃而不送达Suricata。内联操作中数据包将在输出端口转发但不送达Suricata。

另一种方式是在规则中指定"bypass"关键字。当触发含此关键字的规则时,"pass"或"drop"操作将自动应用于流的后续数据包而无需Suricata进一步分析。例如给定规则:

drop tcp any 443 <> any any (msg: "SURICATA Test rule"; bypass; sid:1000001; rev:2;)

Suricata初始评估首数据包并识别流后,该流所有后续数据包将由硬件丢弃,从而节省CPU资源处理更重要任务。

硬件流表中陈旧流的超时值可通过ntservice.ini中的FlowTimeout属性指定。

23.2.10. 内联操作

支持流感知的Napatech产品可配置为内联模式。这在配置文件中指定。启用时,端口以端口对形式指定。接收自一个端口的流量经Suricata检查后从对等端口转发。例如配置:

napatech:
 inline: enabled
 ports[0-1, 2-3]

将配对端口0和1、2和3为对等端口。可定义规则通过匹配特定特征的流量。例如给定规则:

pass tcp any 443 <> any any (msg: "SURICATA Test rule";  bypass; sid:1000001; rev:2;)

Suricata将评估流的初始数据包并将流编程到硬件中。该流的后续数据包将自动从一个端口桥接至其对等端口。

23.2.11. 计数器

提供以下计数器:

  • napa_total.pkts - 卡接收的总数据包数。

  • napa_total.byte - 卡接收的总字节数。

  • napa_total.overflow_drop_pkts - 因主机缓冲区满丢弃的数据包数。(即应用处理速度不足。)

  • napa_total.overflow_drop_byte - 因主机缓冲区满丢弃的字节数。(即应用处理速度不足。)

流感知产品还提供以下计数器:

  • napa_dispatch_host.pkts, napa_dispatch_host.byte:

    分发至主机缓冲区由Suricata处理的总数据包/字节数。(注:此计数含可能因主机缓冲区无空间被丢弃的数据包。)

  • napa_dispatch_drop.pkts, napa_dispatch_drop.byte:

    因Suricata"drop"绕过规则或其他裁决导致硬件丢弃的总数据包/字节数。这些数据包未送达应用。

  • napa_dispatch_fwd.pkts, napa_dispatch_fwd.byte:

    配置内联操作时,因Suricata"pass"绕过规则或配置文件启用流/加密绕过而转发的总数据包/字节数。这些数据包未送达应用。

  • napa_bypass.active_flows:

    硬件上编程为转发或丢弃的活跃流数量。

  • napa_bypass.total_flows:

    应用启动后编程的总流数。

若配置文件中启用enable-stream-stats,stats.log将为每个处理的流输出以下计数器:

  • napa<streamid>.pkts: 流接收的数据包数。

  • napa<streamid>.bytes: 流接收的总字节数。

  • napa<streamid>.drop_pkts: 因缓冲区溢出从该流丢弃的数据包数。

  • napa<streamid>.drop_byte: 因缓冲区溢出从该流丢弃的字节数。

这对调试特定CPU核心或线程是否落后导致丢包非常有用。

调试:

调试配置时,查看流动情况及创建和接收流的流非常有用。/opt/napatech3/bin中有两个工具:

  • monitoring: 除其他功能外,显示端口接口到达的流量。

  • profiling: 显示主机缓冲区、流及流向流的流量。

若Suricata异常终止,通常在关闭时移除的流定义可能保留。发生时可执行以下"delete=all"NTPL命令清除:

# /opt/napatech3/bin/ntpl -e "delete=all"

23.2.12. Napatech配置选项:

Suricata配置文件中可用的Napatech选项:

napatech:
  # 当use_all_streams设为"yes"时,初始化代码将查询Napatech服务获取所有配置流并监听它们。
  # 设为"no"时将使用streams配置数组。
  #
  # 此选项需在运行Suricata前执行适当NTPL命令创建所需流。
  #use-all-streams: no

  # 自动配置禁用或线程CPU绑定禁用时监听的流。可为:
  #   单个流(如streams: [0])
  # 或
  #   流范围(如streams: ["0-3"])
  #
  streams: ["0-3"]

  # 启用流统计可提供每个配置线程/流的细粒度数据包和字节计数。
  #
  enable-stream-stats: no

  # 启用自动配置时,流将自动创建并分配到线程所在的NUMA节点。若线程部分启用CPU绑定,
  # 流将根据worker cpu set中指定的工作线程数创建。否则使用streams数组定义流。
  #
  # 此选项不能与"use-all-streams"同时使用。
  #
  auto-config: yes

  # 启用硬件级流绕过。
  #
  hardware-bypass: yes

  # 启用内联操作。启用时,给定端口到达的流量经Suricata分析后自动从其peer端口转发。
  # 启用此选项时必须启用hardware-bypass。
  #
  inline: no

  # ports指示自动配置模式下使用的napatech端口。这些是将被合并后分发到流的端口ID。
  #
  # 启用hardware-bypass时,端口必须配置为段以指定上下游流量到达的端口。
  # 此信息为硬件正确处理流所必需。
  #
  # 使用分路器配置时,一个端口接收网络入站流量,另一个接收出站流量。给定段上的两个端口必须位于同一网络适配器。
  #
  # 使用SPAN端口配置时,上下游流量到达单一端口。通过将段两侧设为相同端口配置(如0-0配置端口0上的SPAN端口)。
  #
  # 端口段以形式指定:
  #    ports: [0-1,2-3,4-5,6-6,7-7]
  #
  # 对于传统系统,当hardware-bypass禁用时,可以以下任一方式指定:
  #
  #   单个端口列表(如ports: [0,1,2,3])
  #
  #   端口范围(如ports: [0-3])
  #
  #   "all"表示合并所有端口(如ports: [all])
  #
  # 若自动配置禁用,此参数无效。
  #
  ports: [0-1,2-3]

  # 自动配置启用时,hashmode指定确定数据包分发到流的算法。可为任何有效Napatech NTPL hashmode命令。
  #
  # 最常见hashmode命令:hash2tuple, hash2tuplesorted, hash5tuple, hash5tuplesorted和roundrobin。
  #
  # 其他hashmode及使用详情参见Napatech NTPL文档。
  #
  # 若自动配置禁用,此参数无效。
  #
  hashmode: hash5tuplesorted

确保 ntservice.ini 中声明的主机缓冲区足够容纳使用的核心/流数量。

23.2.13. 支持

联系技术支持工程师:ntsupport@napatech.com

Napatech文档位于:https://docs.napatech.com (点击搜索图标,不输入搜索文本,可查看门户中所有文档。)