Napatech ======== 目录 -------- * 简介 * 软件包安装 * 基础配置 * 高级多线程配置 简介 ------------ Napatech数据包捕获加速卡可通过以下硬件特性显著提升Suricata部署性能: * 板载突发缓冲(最高12GB) * 零拷贝内核旁路DMA * 非阻塞式PCIe性能 * 端口聚合 * 负载分发至128个主机缓冲区 * 精确时间戳 * 准确时间同步 该软件包使用专有shell脚本处理安装流程。无论哪种情况,编译内核模块和安装软件都需要gcc、make及内核头文件。 软件包安装 -------------------- *注意:安装需要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 Suricata安装 --------------------- 下载并解压Suricata源码包后,需运行configure启用Napatech支持并准备编译:: $ ./configure --enable-napatech --with-napatech-includes=/opt/napatech3/include --with-napatech-libraries=/opt/napatech3/lib $ make $ make install-full Suricata配置 ---------------------- 编辑suricata.yaml文件进行系统配置。有三种配置方式: 1. 无CPU绑定的自动配置:在此模式下于suricata.yaml文件中指定流配置,允许线程自由调度。适用于单处理器系统,NUMA节点配置不影响性能的场景。 2. 带CPU绑定的自动配置:此模式通过工作线程的CPU绑定控制流的创建与配置。suricata.yaml中每个CPU对应创建一个流和一个工作线程。最适合多NUMA节点系统(即多处理器系统),主机缓冲区的NUMA节点会与线程运行的核心匹配。 3. 手动配置(传统模式):此模式下通过运行Suricata前执行NTPL命令来配置底层Napatech流。Suricata启动后连接到现有流。 示例配置 - 无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 示例配置 - 带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 示例配置 - 手动配置 -------------------------------------------- 手动配置下,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 现在可启动Suricata:: $ suricata -c /usr/local/etc/suricata/suricata.yaml --napatech --runmode workers 通过创建适当NTPL文件并将Suricata附加到流,可指定更复杂的配置。 流绕过 --------------- 在支持流感知的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属性指定。 内联操作 ---------------- 支持流感知的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将评估流的初始数据包并将流编程到硬件中。该流的后续数据包将自动从一个端口桥接至其对等端口。 计数器 -------- 提供以下计数器: - 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.pkts: 流接收的数据包数。 - napa.bytes: 流接收的总字节数。 - napa.drop_pkts: 因缓冲区溢出从该流丢弃的数据包数。 - napa.drop_byte: 因缓冲区溢出从该流丢弃的字节数。 这对调试特定CPU核心或线程是否落后导致丢包非常有用。 调试: 调试配置时,查看流动情况及创建和接收流的流非常有用。/opt/napatech3/bin中有两个工具: - monitoring: 除其他功能外,显示端口接口到达的流量。 - profiling: 显示主机缓冲区、流及流向流的流量。 若Suricata异常终止,通常在关闭时移除的流定义可能保留。发生时可执行以下"delete=all"NTPL命令清除:: # /opt/napatech3/bin/ntpl -e "delete=all" 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`` 中声明的主机缓冲区足够容纳使用的核心/流数量。 支持 ------- 联系技术支持工程师:ntsupport@napatech.com Napatech文档位于:https://docs.napatech.com (点击搜索图标,不输入搜索文本,可查看门户中所有文档。)