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文件进行系统配置。有三种配置方式:
无CPU绑定的自动配置:在此模式下于suricata.yaml文件中指定流配置,允许线程自由调度。适用于单处理器系统,NUMA节点配置不影响性能的场景。
带CPU绑定的自动配置:此模式通过工作线程的CPU绑定控制流的创建与配置。suricata.yaml中每个CPU对应创建一个流和一个工作线程。最适合多NUMA节点系统(即多处理器系统),主机缓冲区的NUMA节点会与线程运行的核心匹配。
手动配置(传统模式):此模式下通过运行Suricata前执行NTPL命令来配置底层Napatech流。Suricata启动后连接到现有流。
23.2.6. 示例配置 - 无CPU绑定的自动配置:¶
若不使用CPU绑定,需在Suricata配置文件中明确定义流。使用此选项需在配置文件中设置以下参数:
关闭CPU绑定
启用Napatech"auto-config"选项
指定启动时应创建的流
指定向Suricata提供流量的端口
指定用于将流量分发到流的哈希模式
设置选项如下:
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:
开启CPU绑定
指定worker-cpu-set
启用Napatech"auto-config"选项
指定向Suricata提供流量的端口
指定用于控制流量分发到不同流/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将处理的四个流。
- 配置步骤:
在suricata.yaml中禁用Napatech自动配置选项
在suricata.yaml中指定Suricata使用的流
创建含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 (点击搜索图标,不输入搜索文本,可查看门户中所有文档。)