☰
Suricata 接入 Myricom(Sniffer10G)网卡实战:libpcap 捕获、多 Ring 线程与 SNF 环境变量调优指南
2026/10/8 7:51:43 网站建设 项目流程
  • 网络安全

【免费下载链接】suricata

Suricata 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 驱动行为即可。本文所述流程正是围绕这一思路展开。

前置条件:确认驱动与网卡状态

在开始编译和配置之前,需要保证三件事已经就绪:

  1. Myricom 网卡硬件已正确安装(PCIe 插槽、供电、光纤/线缆连接正常);
  2. MyricomSniffer 驱动(myri_snf)已安装并加载;
  3. 网卡已进入sniffer 模式(而非普通的以太网收发模式)。

Sniffer 模式是否生效,可以通过内核日志确认。驱动加载并进入 sniffer 模式后,dmesg中会出现类似下面的信息:

[ 2102.860241] myri_snf INFO: eth4: Link0 is UP [ 2101.341965] myri_snf INFO: eth5: Link0 is UP

Link0 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 直接操作网卡环形缓冲区。

配置 Suricata:pcap 捕获块与多线程读取

基本配置示例

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: 512kb:libpcap 缓冲区大小(注意:对 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,会回退为默认值 1;
  • buffer-size支持顶层pcap.buffer-size与接口级buffer-size两种写法(src/runmode-pcap.c、src/runmode-pcap.c),最终通过ParseSizeStringU64解析大小字符串,上限为INT_MAX(约 2GB);
  • checksum-checks支持auto/yes/no三种取值(src/runmode-pcap.c),默认auto。

而"8 个读取线程"最终落在捕获线程的注册与读取循环上:pcap 运行模式的 workers 实现(RunModeIdsPcapWorkers,src/runmode-pcap.c)调用RunModeSetLiveCaptureWorkers(ParsePcapConfig, PcapConfigGeThreadsCount, "ReceivePcap", "DecodePcap", ...),其中PcapConfigGeThreadsCount直接返回配置的threads值(src/runmode-pcap.c),ReceivePcap线程模块则在 src/source-pcap.c 中注册,其主循环ReceivePcapLoop(src/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 数一一对应的官方依据。

启动 Suricata:SNF 环境变量与 workers 运行模式

8 Ring 启动

配置完成(threads: 8)后,通过环境变量告知 SNF 驱动分配 8 个 Ring,并以 workers 模式启动:

SNF_NUM_RINGS=8 SNF_FLAGS=0x1 suricata -c suricata.yaml -i eth5 --runmode=workers

参数说明:

  • SNF_NUM_RINGS=8:让 SNF 驱动创建 8 个环形缓冲区,与配置文件中的threads: 8一一对应;
  • SNF_FLAGS=0x1:SNF 驱动标志位,0x1表示启用 sniffer 模式捕获;
  • -c suricata.yaml:指定配置文件;
  • -i eth5:指定捕获接口;
  • --runmode=workers:使用 workers 运行模式,每个线程完成捕获、解码、检测、输出的完整流水线,适合多核并行场景(见 src/runmode-pcap.c)。

16 Ring 启动

如果希望使用 16 个 Ring,需要同步修改两处:配置文件中的threads改为16,同时启动命令中的SNF_NUM_RINGS改为16:

SNF_NUM_RINGS=16 SNF_FLAGS=0x1 suricata -c suricata.yaml -i eth5 --runmode=workers

原则是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()API(src/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 request(the-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_SIZE256MB
SNF_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_RINGS=16 SNF_DATARING_SIZE=17179869184 SNF_DESCRING_SIZE=4294967296 SNF_FLAGS=0x1 suricata -c suricata.yaml -i eth5 --runmode=workers

注意这里的大小单位是字节而非 MB/GB,需要自行换算(16GB = 16 × 1024³ = 17179869184;4GB = 4 × 1024³ = 4294967296)。同时,这么大的内存分配意味着需要确认系统有足够的物理内存与锁页(mlock)权限,必要时需调整系统限制。

启用 SNF 调试信息:SNF_DEBUG_MASK 与 SNF_DEBUG_FILENAME

Myricom 提供了一组调试环境变量,用于验证配置是否正确、收集更多运行时信息:

  • SNF_DEBUG_MASK=3:启用调试信息输出(值为位掩码,3为示例值,可参考 SNF 库文档选择其他掩码组合);
  • SNF_DEBUG_FILENAME:可选,指定调试输出文件路径;不设置时输出到默认位置(通常为 stderr/标准输出)。

延续上面的 16 Ring 示例,同时开启调试并输出到/tmp/snf.out:

SNF_NUM_RINGS=16 SNF_DATARING_SIZE=17179869184 SNF_DESCRING_SIZE=4294967296 SNF_FLAGS=0x1 SNF_DEBUG_MASK=3 SNF_DEBUG_FILENAME="/tmp/snf.out" suricata -c suricata.yaml -i eth5 --runmode=workers

启动后可以查看/tmp/snf.out中的调试信息,确认 Ring 数量、内存分配是否与预期一致。排查问题时,建议先关闭调试(避免写文件带来额外开销),确认基线性能后再按需开启。

故障排查与验证建议

综合上文,部署 Myricom 卡时建议按以下顺序自查:

  1. 驱动层:dmesg | grep myri_snf确认网卡处于 sniffer 模式且链路 UP;
  2. 编译层:确认 Suricata 链接的是/opt/snf下的 libpcap(可执行ldd查看动态库路径,或检查 configure 输出中的 libpcap 信息);
  3. 配置层:pcap.threads与SNF_NUM_RINGS数值一致;checksum-checks: no避免重复校验;
  4. 内存层:SNF_DATARING_SIZE/SNF_DESCRING_SIZE按 4:1 比例设置,且系统内存充足;
  5. 运行层:--runmode=workers配合-i指定接口,必要时用SNF_DEBUG_MASK+SNF_DEBUG_FILENAME收集 SNF 调试日志;
  6. 性能验证:用 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.c(ReceivePcapLoop的pcap_dispatch读取循环、pcap_set_buffer_size调用)与 src/runmode-pcap.c(ParsePcapConfig配置解析、workers/autofp/single 三种运行模式);
  • suricata.yaml.in模板(suricata.yaml.in)中的pcap配置块注释,是理解各参数取值范围与默认值的第一手资料。

最后需要提醒的是:SNF_DATARING_SIZE通过pcap.buffer-size配置自动生效的能力取决于未来 SNF 软件版本的发布,当前部署应以环境变量方式为准;同时,具体的SNF_FLAGS、SNF_DEBUG_MASK取值含义以你所安装的 Myricom SNF 库版本文档为准,不同版本之间可能存在差异。

  • 网络安全

【免费下载链接】suricata

Suricata 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
点击查看免费下载
上一篇:MMSegmentation 语义分割入门:3 条命令出结果
下一篇:android-async-http微服务架构集成:API网关对接

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询