Arkime:大规模开源网络分析与数据包捕获系统
项目描述
Arkime(前身为Moloch)是一个大规模、开源的网络数据包捕获和分析系统,专为处理现代网络环境中的高速流量而设计。该系统能够存储和索引标准PCAP格式的网络流量数据,提供快速的索引访问和直观的Web界面用于数据包浏览、搜索和导出。Arkime支持水平扩展,可以部署在多个系统上处理数十Gbps的流量。
Arkime保留了所有原始数据包,允许安全分析师使用Wireshark等标准工具进行深度分析,同时提供了强大的API接口用于程序化访问会话数据和PCAP文件。
功能特性
- 大规模数据包捕获: 支持多线程处理和高吞吐量数据包捕获,可扩展至数十Gbps流量
- 完整PCAP保留: 所有数据包以标准PCAP格式存储,兼容现有分析工具
- 高效索引检索: 基于Elasticsearch/OpenSearch的元数据索引,实现快速搜索和查询
- 丰富协议解析: 内置支持100+种网络协议解析,包括HTTP、DNS、TLS、SSH等
- 实时流量监控: 提供实时网络流量可视化和会话分析功能
- 灵活部署选项: 支持单机部署和分布式集群部署模式
- 安全取证能力: 完整的会话重建和数据包导出功能,支持网络安全调查
安装指南
系统要求
- Linux操作系统(推荐CentOS 7+或Ubuntu 18.04+)
- Node.js 18或20版本
- OpenSearch或Elasticsearch
- 至少2-3GB内存(开发环境)
快速安装
# 使用easybutton-build.sh快速构建
./easybutton-build.sh# 安装依赖项
make check# 启动查看器
npm run viewer:test
详细安装步骤
- 安装OpenSearch/Elasticsearch
- 安装Node.js运行环境
- 运行构建脚本编译Arkime组件
- 配置网络接口和数据存储路径
- 启动捕获进程和Web界面
使用说明
基本使用
访问Web界面:http://localhost:8123
数据加载示例
# 加载测试数据
./easybutton-build.sh# 运行测试用例
make check# 启动开发模式查看器
npm run viewer:dev
API访问
Arkime提供完整的REST API接口用于程序化访问:
# 获取会话数据
curl http://localhost:8123/sessions.json# 下载PCAP文件
curl http://localhost:8123/api/session/[sessionId]/pcap
核心代码
数据包处理核心
/******************************************************************************/
/* packet.c -- Functions for acquiring data */
#include "arkime.h"SUPPRESS_ALIGNMENT
LOCAL ArkimePacketRC arkime_packet_process(ArkimePacketBatch_t *batch, ArkimePacket_t *const packet, const uint8_t *data, int len)
{// 数据包基础验证和处理if (len < 20)return ARKIME_PACKET_CORRUPT;// 运行以太网回调处理return arkime_packet_run_ethernet_cb(batch, packet, data + 18, len - 18, ARKIME_ETHERTYPE_ETHER, "garland");
}
会话管理核心
/******************************************************************************/
/* session.c -- Session functions */
LOCAL void arkime_session_init(ArkimeSession_t *session, const uint8_t *sessionId)
{// 初始化会话结构memset(session, 0, sizeof(ArkimeSession_t));memcpy(session->sessionId, sessionId, ARKIME_SESSIONID_LEN);// 初始化协议状态session->stopSaving = 0;session->midSave = 0;// 初始化数据统计session->databytes[0] = 0;session->databytes[1] = 0;
}
HTTP解析器实现
/******************************************************************************/
/* http.c -- HTTP protocol parsing */
LOCAL int http_parser_callback(http_parser *parser, const char *at, size_t length)
{ArkimeSession_t *session = parser->data;// HTTP头部解析和处理switch (parser->type) {case HTTP_REQUEST:arkime_field_string_add(hostField, session, at, length, TRUE);break;case HTTP_RESPONSE:arkime_field_int_add(statuscodeField, session, parser->status_code);break;}return 0;
}
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码