- 网络安全
【免费下载链接】suricata
Suricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.
导读
本文基于 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 直接操作网卡环形缓冲区。
配置 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_SIZE | 256MB |
SNF_DESCRING_SIZE | 64MB |
推荐比例与调优思路
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 卡时建议按以下顺序自查:
- 驱动层:
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 比例设置,且系统内存充足; - 运行层:
--runmode=workers配合-i指定接口,必要时用SNF_DEBUG_MASK+SNF_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.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.
相关推荐
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
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考