Arkime:大规模开源网络分析与数据包捕获系统

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

详细安装步骤

  1. 安装OpenSearch/Elasticsearch
  2. 安装Node.js运行环境
  3. 运行构建脚本编译Arkime组件
  4. 配置网络接口和数据存储路径
  5. 启动捕获进程和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智能小助手)
公众号二维码

posted @ 2025-09-17 14:14  qife  阅读(30)  评论(0)    收藏  举报