首页 / 资讯中心 / 文章详情

Suricata 接入 Myricom(Sniffer10G)网卡实战:libpcap 捕获、多 Ring 线程与 SNF 环境变量调优指南

Suricata 接入 Myricom(Sniffer10G)网卡实战:libpcap 捕获、多 Ring 线程与 SNF 环境变量调优指南 ★ FEATURED ARTICLE
网络安全【免费下载链接】suricataSuricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.项目地址https://gitcode.com/gh_mirrors/su/suricata点击查看免费下载导读本文基于 Suricata 官方用户手册中针对 Myricom 捕获网卡Sniffer10G的部署指南展开完整讲解如何在已安装 Myricom Sniffer 驱动与运行时库的机器上将 Suricata 编译为使用 Myricom 提供的 libpcap 接口并通过pcap.threads与SNF_NUM_RINGS等参数实现多 Ring 并行捕获。读完本文你将掌握Myricom 卡的驱动状态确认方法、编译参数、Suricatapcap配置块的写法、workers 运行模式的启动命令以及SNF_DATARING_SIZE/SNF_DESCRING_SIZE/SNF_DEBUG_MASK等环境变量的含义与调优思路。背景为什么 Suricata 需要针对 Myricom 网卡单独配置Myricom后被 Broadcom 收购的 Sniffer10G 系列网卡是典型的捕获加速卡它把抓包能力从通用网卡驱动中剥离出来数据包不再进入内核网络栈而是由网卡自带的 Sniffer 固件直接写入用户态可访问的环形缓冲区Ring Buffer。这种方式绕过了内核协议栈与sk_buff分配开销能以低延迟、高吞吐的方式把线速流量交给用户态程序。Suricata 与这类加速卡配合的标准路径是使用 Myricom 提供的定制版 libpcap即libpcap的 SNF 后端。对 Suricata 而言它看到的是一个普通的 libpcap 接口因此无需修改 Suricata 本身的代码——只需在编译时链接 Myricom 的 libpcap再在运行时通过环境变量控制 SNF 驱动行为即可。本文所述流程正是围绕这一思路展开。前置条件确认驱动与网卡状态在开始编译和配置之前需要保证三件事已经就绪Myricom 网卡硬件已正确安装PCIe 插槽、供电、光纤/线缆连接正常MyricomSniffer 驱动myri_snf已安装并加载网卡已进入sniffer 模式而非普通的以太网收发模式。Sniffer 模式是否生效可以通过内核日志确认。驱动加载并进入 sniffer 模式后dmesg中会出现类似下面的信息[ 2102.860241] myri_snf INFO: eth4: Link0 is UP [ 2101.341965] myri_snf INFO: eth5: Link0 is UPLink0 is UP表示对应接口如eth4、eth5的链路已经建立处于可捕获状态。如果 dmesg 中没有这类信息说明驱动未加载或网卡未进入 sniffer 模式应先解决硬件/驱动问题再继续后续步骤。Myricom 的运行时库SNF 库建议安装在统一目录下本文示例将其安装在/opt/snf即头文件位于/opt/snf/include/、库文件位于/opt/snf/lib/。如果你的安装路径不同后续编译参数需对应调整。编译 Suricata链接 Myricom 定制 libpcap要让 Suricata 使用 Myricom 的捕获能力关键一步是让configure找到 Myricom 的 libpcap而不是系统自带的版本。通过--with-libpcap-includes和--with-libpcap-libraries两个参数指定头文件与库文件的目录即可./configure --with-libpcap-includes/opt/snf/include/ --with-libpcap-libraries/opt/snf/lib/ --prefix/usr --sysconfdir/etc --localstatedir/var make sudo make install参数说明--with-libpcap-includes/opt/snf/include/指向 Myricom 定制 libpcap 的头文件目录--with-libpcap-libraries/opt/snf/lib/指向其库文件目录链接时优先使用这里的libpcap--prefix/usr安装根目录--sysconfdir/etc配置文件suricata.yaml安装目录--localstatedir/var运行状态与日志目录。编译完成后sudo make install会把 Suricata 安装到上述路径。此时 Suricata 内部的 pcap 捕获模块src/source-pcap.c在运行时调用的将是 Myricom 的 libpcap 实现进而经由snf_open()等 SNF API 直接操作网卡环形缓冲区。配置 Suricatapcap 捕获块与多线程读取基本配置示例Myricom 官方指南给出的核心配置位于suricata.yaml的pcap配置块。以 8 线程为例对应一台 4 核 超线程、共 8 个逻辑 CPU 的机器pcap: - interface: eth5 threads: 8 buffer-size: 512kb checksum-checks: no各字段含义如下interface: eth5指定要捕获的接口即 dmesg 中确认处于 sniffer 模式的接口threads: 8为eth5创建 8 个捕获读取线程。对 Myricom 卡而言Myricom 驱动会保证每个线程绑定到各自独立的 Ring Buffer 上这是该配置在此场景下的关键价值buffer-size: 512kblibpcap 缓冲区大小注意对 Myricom 卡当前会被忽略详见下文buffer-size 为何失效一节checksum-checks: no关闭 Suricata 侧的校验和校验因为捕获卡卸载了校验和计算网卡已经校验过Suricata 无需重复计算。配置解析与多线程机制的源码印证上述配置项在 Suricata 源码中的解析逻辑位于 src/runmode-pcap.c 的ParsePcapConfig()函数threads通过SCConfGetChildValueWithDefault(if_root, if_default, threads, threadsstr)读取src/runmode-pcap.c使用StringParseUint16解析为 16 位无符号整数若解析失败或值为 0会回退为默认值 1buffer-size支持顶层pcap.buffer-size与接口级buffer-size两种写法src/runmode-pcap.c、src/runmode-pcap.c最终通过ParseSizeStringU64解析大小字符串上限为INT_MAX约 2GBchecksum-checks支持auto/yes/no三种取值src/runmode-pcap.c默认auto。而8 个读取线程最终落在捕获线程的注册与读取循环上pcap 运行模式的 workers 实现RunModeIdsPcapWorkerssrc/runmode-pcap.c调用RunModeSetLiveCaptureWorkers(ParsePcapConfig, PcapConfigGeThreadsCount, ReceivePcap, DecodePcap, ...)其中PcapConfigGeThreadsCount直接返回配置的threads值src/runmode-pcap.cReceivePcap线程模块则在 src/source-pcap.c 中注册其主循环ReceivePcapLoopsrc/source-pcap.c通过pcap_dispatch()批量取包交给下游处理。另外suricata.yaml.in模板suricata.yaml.in中也有关于加速卡的注释说明With some accelerator cards using a modified libpcap (like Myricom), you may want to have the same number of capture threads as the number of capture rings. In this case, set up the threads variable to N to start N threads listening on the same interface.——这正是threads: N与 Myricom Ring 数一一对应的官方依据。启动 SuricataSNF 环境变量与 workers 运行模式8 Ring 启动配置完成threads: 8后通过环境变量告知 SNF 驱动分配 8 个 Ring并以 workers 模式启动SNF_NUM_RINGS8 SNF_FLAGS0x1 suricata -c suricata.yaml -i eth5 --runmodeworkers参数说明SNF_NUM_RINGS8让 SNF 驱动创建 8 个环形缓冲区与配置文件中的threads: 8一一对应SNF_FLAGS0x1SNF 驱动标志位0x1表示启用 sniffer 模式捕获-c suricata.yaml指定配置文件-i eth5指定捕获接口--runmodeworkers使用 workers 运行模式每个线程完成捕获、解码、检测、输出的完整流水线适合多核并行场景见 src/runmode-pcap.c。16 Ring 启动如果希望使用 16 个 Ring需要同步修改两处配置文件中的threads改为16同时启动命令中的SNF_NUM_RINGS改为16SNF_NUM_RINGS16 SNF_FLAGS0x1 suricata -c suricata.yaml -i eth5 --runmodeworkers原则是SNF_NUM_RINGS与pcap.threads保持一致确保每个捕获线程都能独占一个 Ring避免多个线程争抢同一个 Ring 导致丢包或性能下降。深入理解buffer-size 为何对 Myricom 卡失效指南特别强调了一个容易踩坑的点pcap.buffer-size配置项如示例中的512kb在使用 Myricom 卡时当前会被忽略。原因在于 Suricata 的源码实现在HAVE_PCAP_SET_BUFF编译宏开启时ReceivePcapThreadInit会把配置值传给 libpcap 的pcap_set_buffer_size()APIsrc/source-pcap.c。而 Myricom 的 Sniffer10G libpcap 后端并不实现该缓冲设置——根据 Myricom 官方支持给出的说明The libpcap interface to Sniffer10G ignores the pcap_set_buffer_size() value. The call to snf_open() uses zero as the dataring_size which informs the Sniffer library to use a default value or the value from the SNF_DATARING_SIZE environment variable.也就是说Myricom 的snf_open()调用以dataring_size 0进行SNF 库会回退到默认值或SNF_DATARING_SIZE环境变量指定的值pcap_set_buffer_size()传进去的值被直接忽略。Myricom 曾在 libpcap 项目提交过一个 pull requestthe-tcpdump-group/libpcap 的 PR #435旨在让未来的 SNF 软件版本支持通过pcap_set_buffer_size联动设置SNF_DATARING_SIZE。在支持落地之前数据环与描述符环的大小只能通过环境变量显式控制即下一节介绍的内容。这也解释了为何指南中示例配置仍保留buffer-size: 512kb——它代表通用 libpcap 场景下的写法对 Myricom 卡是预留但不生效。SNF 数据环与描述符环SNF_DATARING_SIZE 与 SNF_DESCRING_SIZE两个变量的含义SNF 驱动把捕获内存分为两类环形缓冲区均在所有 Ring 之间共享总内存SNF_DATARING_SIZE用于存储入站报文数据的总内存大小字节即承载实际抓到的数据包内容SNF_DESCRING_SIZE用于存储报文元信息描述符的总内存大小字节包括包长度、偏移量、时间戳等。如果未显式设置Myricom 使用以下默认值变量默认值SNF_DATARING_SIZE256MBSNF_DESCRING_SIZE64MB推荐比例与调优思路Myricom 建议描述符环大小为数据环的 1/4即SNF_DESCRING_SIZE SNF_DATARING_SIZE / 4默认的 256MB/64MB 恰好符合这一比例。实际部署中可根据流量特征调整报文普遍较小时如大量小包、SYN 洪泛描述符相对数据占比升高可适当加大描述符环比例报文普遍较大时如视频流、文件传输数据环占比需求更高可适当减小描述符环比例。实操16 Ring 16GB 数据环 4GB 描述符环在 16 线程示例的基础上使用 16GB 数据环17179869184字节与 4GB 描述符环4294967296字节恰好为 16GB 的 1/4启动命令如下SNF_NUM_RINGS16 SNF_DATARING_SIZE17179869184 SNF_DESCRING_SIZE4294967296 SNF_FLAGS0x1 suricata -c suricata.yaml -i eth5 --runmodeworkers注意这里的大小单位是字节而非 MB/GB需要自行换算16GB 16 × 1024³ 171798691844GB 4 × 1024³ 4294967296。同时这么大的内存分配意味着需要确认系统有足够的物理内存与锁页mlock权限必要时需调整系统限制。启用 SNF 调试信息SNF_DEBUG_MASK 与 SNF_DEBUG_FILENAMEMyricom 提供了一组调试环境变量用于验证配置是否正确、收集更多运行时信息SNF_DEBUG_MASK3启用调试信息输出值为位掩码3为示例值可参考 SNF 库文档选择其他掩码组合SNF_DEBUG_FILENAME可选指定调试输出文件路径不设置时输出到默认位置通常为 stderr/标准输出。延续上面的 16 Ring 示例同时开启调试并输出到/tmp/snf.outSNF_NUM_RINGS16 SNF_DATARING_SIZE17179869184 SNF_DESCRING_SIZE4294967296 SNF_FLAGS0x1 SNF_DEBUG_MASK3 SNF_DEBUG_FILENAME/tmp/snf.out suricata -c suricata.yaml -i eth5 --runmodeworkers启动后可以查看/tmp/snf.out中的调试信息确认 Ring 数量、内存分配是否与预期一致。排查问题时建议先关闭调试避免写文件带来额外开销确认基线性能后再按需开启。故障排查与验证建议综合上文部署 Myricom 卡时建议按以下顺序自查驱动层dmesg | grep myri_snf确认网卡处于 sniffer 模式且链路 UP编译层确认 Suricata 链接的是/opt/snf下的 libpcap可执行ldd查看动态库路径或检查 configure 输出中的 libpcap 信息配置层pcap.threads与SNF_NUM_RINGS数值一致checksum-checks: no避免重复校验内存层SNF_DATARING_SIZE/SNF_DESCRING_SIZE按 4:1 比例设置且系统内存充足运行层--runmodeworkers配合-i指定接口必要时用SNF_DEBUG_MASKSNF_DEBUG_FILENAME收集 SNF 调试日志性能验证用 Suricata 自带的统计计数器如suricata --dump-stats或 EVE 日志中的 counters观察捕获丢包率据此进一步调整 Ring 数量与内存比例。参考与延伸本文核心内容源自 doc/userguide/capture-hardware/myricom.rst文中原始链接指向 40GBe 相关技术页与 Broadcom 知识库中关于 Emulex OneConnect OCE12000-D 适配器配合 FastStack 的使用说明可结合 Myricom/Broadcom 官方资料进一步阅读Suricata 捕获层的实际实现可参考 src/source-pcap.cReceivePcapLoop的pcap_dispatch读取循环、pcap_set_buffer_size调用与 src/runmode-pcap.cParsePcapConfig配置解析、workers/autofp/single 三种运行模式suricata.yaml.in模板suricata.yaml.in中的pcap配置块注释是理解各参数取值范围与默认值的第一手资料。最后需要提醒的是SNF_DATARING_SIZE通过pcap.buffer-size配置自动生效的能力取决于未来 SNF 软件版本的发布当前部署应以环境变量方式为准同时具体的SNF_FLAGS、SNF_DEBUG_MASK取值含义以你所安装的 Myricom SNF 库版本文档为准不同版本之间可能存在差异。赞分享网络安全【免费下载链接】suricataSuricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.项目地址https://gitcode.com/gh_mirrors/su/suricata点击查看免费下载相关推荐libpcap与Myricom网络适配器的集成使用指南libpcap与Myricom网络适配器的集成使用指南 前言 libpcap作为网络数据包捕获的基石库支持多种网络接口类型。本文将深入探讨如何将libpcap网络OpenBLAS 使用指南多线程配置、运行时环境变量与链接实战OpenBLAS 使用指南多线程配置、运行时环境变量与链接实战 OpenBLAS 是一个基于 GotoBLAS2 1.13 BSD 版本优化而来的高性能 BL高性能计算科学计算HCCL 多 QP 通信数据量阈值调优HCCL_MULTI_QP_THRESHOLD 环境变量实战指南HCCL 多 QP 通信数据量阈值调优HCCL_MULTI_QP_THRESHOLD 环境变量实战指南 本篇技术指南聚焦 CANN/HCCL 集合通信库中控制通信高性能计算人工智能AscendCANN上一篇MMSegmentation 语义分割入门3 条命令出结果下一篇android-async-http微服务架构集成API网关对接创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站