编译、配置与源码原理详解)
网络安全网络后端数据可视化【免费下载链接】arkimeArkime is an open source, large scale, full packet capturing, indexing, and database system.项目地址https://gitcode.com/gh_mirrors/ar/arkime点击查看免费下载Arkime 的 PF_RING 插件reader-pfring.so让 capture 进程直接基于 ntop 的 PF_RING 驱动抓包绕过 libpcap 用户态桥接是网卡驱动级、适合大流量场景的高吞吐读取方案。本文以仓库中的官方说明 capture/plugins/pfring/README.md 为主体结合 reader-pfring.c 源码与 Arkime 插件/读取器框架完整讲解该插件的编译、加载、配置方法以及它如何接入 Arkime 的 reader 注册机制实现零拷贝抓包。插件背景为什么 Arkime 需要 PF_RINGArkime 是面向大规模流量的全包捕获、索引与数据库系统capture 进程默认通过 libpcap 抓包capture/readers.c 中pcapReadMethod的默认值为libpcap。在万兆甚至更高带宽下标准 libpcap 的拷贝与用户态桥接会成为瓶颈。PF_RING 是 ntop 推出的高性能网络抓包框架驱动层将数据包直接写入 mmap 环形缓冲区大幅降低丢包率。Arkime 的 pfring 插件正是为此设计直接以原生 PF_RING 库libpfring打开网卡不再经过 pfring 提供的 pcap 用户态桥接层userland bridge。这一点在 capture/plugins/pfring/README.md 的第一句就有明确说明The pfring reader plugin now works directly with the pfring rpm, skipping the pfring pcap userland bridge.因此本插件要求构建机与所有运行 capture 的主机都安装 PF_RING 的 rpm 包官方包源为 ntop 的软件仓库http://packages.ntop.org/而不是只装 libpcap。插件框架reader 注册与加载机制要理解 pfring 插件的工作方式先看 Arkime 的两级插件机制。读取器注册表arkime_readers_add所有读取器reader都通过arkime_readers_add()注册到一个哈希表capture/readers.cvoid arkime_readers_add(char *name, ArkimeReaderInit func) { arkime_string_add(readersHash, name, func, TRUE); }内置读取器在arkime_readers_init()中注册capture/readers.c包括libpcap-file、libpcap、tpacketv3、afpacketv3、null、pcap-over-ip-client/server、tzsp、scheme、bpf、netmap。而 pfring 插件通过自身的arkime_plugin_init()把pfring这个名字与reader_pfring_init绑定capture/plugins/pfring/reader-pfring.cvoid arkime_plugin_init() { arkime_readers_add(pfring, reader_pfring_init); }插件加载rootPlugins 的作用.so插件由 capture/plugins.c 中的arkime_plugins_load_so()通过g_module_open()动态加载并要求导出符号arkime_plugin_init。在 capture 启动流程中capture/main.cconfig.rootPlugins会在解析器初始化之前被加载arkime_plugins_load(config.rootPlugins, FALSE);这正是 pfring 这类读取器插件必须放在rootPlugins的原因它必须在早期把pfring读取器注册进 readersHash随后arkime_readers_set()才能依据pcapReadMethod找到并调用它capture/readers.c。若配置的pcapReadMethod在哈希表中找不到对应实现capture 会直接报错退出CONFIGEXIT(Couldnt find pcapReadMethod %s implementation, name);编译插件官方 README 给出的构建方式是在插件目录内直接执行makemake该目录下的 Makefile.in 定义了构建规则核心编译命令为$(CC) -pthread SHARED_FLAGS -o $ CFLAGS -Wall -Wextra -D_GNU_SOURCE -fPIC $(INCLUDE_OTHER) $(INCLUDE_PCAP) $ -lpfring值得注意的几点编译时以-lpfring链接原生 PF_RING 库并引入PCAP_CFLAGSINCLUDE_PCAP这是因为 reader-pfring.c 同时#include pfring.h与pcap.h用于DLT_EN10MB常量。产物.so输出到上一级目录capture/plugins/SOS$(patsubst %.c,../%.so,$(SRCS))即生成reader-pfring.so。编译需要 Arkime 头文件../../arkime.h、../../hash.h、../../dll.h以及 GLib2 开发头文件GLIB2_CFLAGS。编译前提是构建主机已经安装 pfring 开发包由于该插件依赖具体硬件驱动仓库测试目录tests/中并未包含对应的 pcap 回归测试功能验证以实际部署抓包为准。配置 capture 使用 PF_RING官方 README 的启用步骤可以归纳为两步加载 一步选型外加可选调优项。以 Arkime 的config.ini为例1. 加载插件rootPlugins在配置文件默认[default]或对应 capture 节点的 section中加入rootPluginsreader-pfring.so如上文所述rootPlugins会在解析器初始化前被加载capture/main.c确保pfring读取器先注册进 reader 哈希表capture/config.c 中rootPlugins由arkime_config_str_list解析支持多个插件用逗号分隔。2. 指定读取方法pcapReadMethodpcapReadMethodpfringcapture 启动时会读取该配置并在 readersHash 中查找名为pfring的实现capture/readers.c随后调用注册的reader_pfring_init。3. 可选设置集群 IDpfringClusterId0pfringClusterId通过arkime_config_int(NULL, pfringClusterId, 0, 0, 255)读取capture/plugins/pfring/reader-pfring.c默认值为0合法取值范围为 0255。该值对应 PF_RING 的 cluster 机制用于把同一网卡上的多个 socket 收包流量按流分散cluster 分配策略为cluster_per_flow_5_tuple即按五元组哈希分流以便多线程/多进程并行处理。多 capture 进程共享同一网卡时建议为不同进程设置不同的 cluster ID 以避免重复收包。4. 可选调整 interfaceinterfaceeth0interface支持 Arkime 的通用接口配置多个接口用逗号分隔来自 capture/config.c 的arkime_config_str_list也可以传入 PF_RING 支持的特殊接口值如zc:eth0等零拷贝模式前缀具体取决于所安装 PF_RING 版本与网卡驱动支持此时pfring_open()会直接把该接口名交给 PF_RING 处理。源码级原理reader_pfring 的完整生命周期reader-pfring.c 只有约 150 行清晰展示了初始化、抓包循环、统计与收尾四个阶段。初始化打开 ring、设置过滤器与调优参数reader_pfring_init()reader-pfring.c依次完成打开网卡对config.interface中的每个接口执行rings[i] pfring_open(config.interface[i], config.snapLen, flags);其中flags PF_RING_PROMISC | PF_RING_TIMESTAMP混杂模式 PF_RING 时间戳config.snapLen默认 16384 字节来自 capture/config.c 的snapLen配置。打开失败直接CONFIGEXIT退出。设置 BPF 过滤若配置了bpfcapture/config.c则调用pfring_set_bpf_filter()把过滤器下发到 PF_RING失败即报错退出。集群与调优依次执行pfring_set_cluster(rings[i], clusterId, cluster_per_flow_5_tuple); pfring_set_application_name(rings[i], arkime-capture); pfring_set_poll_watermark(rings[i], 64); pfring_enable_rss_rehash(rings[i]);cluster按五元组把流量分散到集群内的多个 socketapplication name标识应用为arkime-capturepoll watermark轮询水位设为 64影响批处理唤醒时机兼顾延迟与吞吐RSS rehash启用 RSS 重散列改善多队列网卡上的负载均衡。注册生命周期回调arkime_reader_start reader_pfring_start; arkime_reader_stop reader_pfring_stop; arkime_reader_stats reader_pfring_stats; arkime_reader_exit reader_pfring_exit;抓包线程per-interface 线程与批量投递reader_pfring_start()为每个接口创建一条独立线程线程名形如arkime-pfring0reader-pfring.c并设置链路类型与 snaplenarkime_packet_set_dltsnap(DLT_EN10MB, config.snapLen);每个线程在reader_pfring_thread()中先pfring_enable_ring()激活 ring然后进入pfring_loop(ring, reader_pfring_packet_cb, batch, -1)阻塞式抓包循环reader-pfring.c。包通过reader_pfring_packet_cb回调进入 Arkime 的批量batch机制每凑满 10000 个包就arkime_packet_batch_flush()刷一次兼顾吞吐与内存占用reader-pfring.c。全包捕获的强制校验回调函数里有一段重要校验reader-pfring.cif (unlikely(h-caplen ! h-len)) { LOGEXIT(ERROR - Arkime requires full packet captures caplen: %d pktlen: %d, h-caplen, h-len); }Arkime 作为全包捕获系统要求caplen实际捕获长度必须等于len原始包长。若因 snaplen 设置过小导致截断capture 会直接终止因此在 PF_RING 模式下务必保证snapLen不小于链路 MTU 与封装开销之和。统计与收尾reader_pfring_stats()遍历所有接口调用pfring_stats()汇总recv收包数与drop丢包数到ArkimeReaderStats_treader-pfring.c供监控与丢包告警使用。reader_pfring_stop()在停止时对每个活跃 ring 调用pfring_breakloop()打断抓包循环抓包线程若发现pfring_loop返回非正值异常会触发arkime_quit()并清空对应 ringreader-pfring.c。reader_pfring_exit()在退出时逐个pfring_close()关闭 ring释放资源reader-pfring.c。配置参数速查表配置项说明默认值取值范围/备注rootPlugins加载.so插件列表pfring 读取器必须在此声明空多个插件逗号分隔capture/config.cpcapReadMethod抓包读取方式设为pfringlibpcap取值必须在 reader 哈希表中有注册capture/readers.cpfringClusterIdPF_RING cluster 编号00255reader-pfring.cinterface抓包网卡可含 PF_RING 特殊接口值必填多接口逗号分隔上限MAX_INTERFACEScapture/config.cbpfBPF 过滤表达式下发到 PF_RING空设置失败会CONFIGEXITreader-pfring.csnapLen每包捕获长度163841ARKIME_PACKET_MAX_LEN需保证全包捕获否则插件强制退出capture/config.c部署注意事项与故障排查依赖与硬件所有运行 capture 的主机都必须安装与网卡驱动匹配的 PF_RING rpm且网卡需被 PF_RING 驱动接管否则pfring_open失败capture 会以pfring open failed! - interface退出reader-pfring.c。加载顺序插件必须通过rootPlugins提前加载若误放入普通plugins则读取器注册时机可能晚于arkime_readers_set()的查找导致Couldnt find pcapReadMethod pfring implementation报错。BPF 过滤bpf配置项在 PF_RING 模式下同样生效但过滤逻辑由 PF_RING 内核模块执行行为与 libpcap 表达式语法保持一致。多进程部署多台 capture 节点共享同一物理网卡时通过设置不同的pfringClusterId0255配合五元组 cluster 分流可把流量按流切分到不同进程避免重复采集与计数偏差。全包要求任何 snaplen 截断都会触发LOGEXIT出现Arkime requires full packet captures时请调大snapLen或排查网卡/驱动配置。丢包监控capture 状态页与统计接口中的 dropped 数值来自reader_pfring_stats()对pfring_stats的drop字段汇总可用于判断 PF_RING 收包是否达到驱动/硬件上限。小结Arkime 的 pfring 插件是一条“插件注册 配置选型”的典型路径arkime_plugin_init()把pfring读取器注册进 readersHashrootPluginsreader-pfring.so保证其在解析器之前完成注册pcapReadMethodpfring完成最终选型。运行时它以原生libpfring打开接口、按五元组集群分流、按线程逐接口抓包并批量投递给 Arkime 处理管线同时通过强制caplen len校验维护全包捕获的语义。对需要突破 libpcap 性能瓶颈的高带宽部署这套配置与源码路径是理解 PF_RING 接入 Arkime 的最直接参考。赞分享网络安全网络后端数据可视化【免费下载链接】arkimeArkime is an open source, large scale, full packet capturing, indexing, and database system.项目地址https://gitcode.com/gh_mirrors/ar/arkime点击查看免费下载相关推荐Arkime 高吞吐抓包实战Myricom SNF Reader 插件配置与原理全解析Arkime 高吞吐抓包实战Myricom SNF Reader 插件配置与原理全解析 导读 本文聚焦 Arkime原 Moloch开源全包捕获系统中与网络安全网络后端数据可视化揭秘Kubeshark高性能抓包PF_RING内核模块的终极优化指南揭秘Kubeshark高性能抓包PF_RING内核模块的终极优化指南 在Kubernetes网络监控领域Kubeshark凭借其eBPF驱动的创新架构脱颖而可观测性云原生网络MCP 服务DataX SqlServerReader 插件详解JDBC 读取 SqlServer 的配置、原理与实战DataX SqlServerReader 插件详解JDBC 读取 SqlServer 的配置、原理与实战 SqlServerReader 是阿里云 Data数据集成批处理ETL大数据后端上一篇Model Context Protocol 发布一周年2025-11-25 规范版本核心特性全解析下一篇Arch Linux光标主题终极指南Bibata与Vimix安装配置教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考