最近在部署Arkime,可给折磨坏了,终于试了各种错,找出了一个比较优雅的部署方案。

Arkime简介

Arkime(原Moloch)是一套面向大规模网络流量分析与取证场景设计的开源网络流量捕获平台,其核心目标是在保证全流量留存的前提下,实现PB级网络数据的高效索引、检索与关联分析。Arkime采用“全包捕获(Full Packet Capture)+元数据索引”的架构设计,通过高速抓包引擎持续采集网络数据包,并将原始PCAP文件存储至本地磁盘,同时提取会话元数据(Session Metadata)写入OpenSearch或Elasticsearch索引,从而兼顾长期流量存储能力与快速查询性能。

在架构层面,Arkime主要由CaptureViewerOpenSearch三部分组成。其中Capture组件负责网络数据包采集、协议解析和会话重组;Viewer组件提供Web管理界面及REST API接口;OpenSearch负责存储和检索流量元数据索引。Arkime支持对HTTP、DNS、TLS、SMTP、SSH等多种常见协议进行深度解析,并能够基于IP地址、端口、域名、URL、证书指纹、用户代理等字段进行复杂查询和关联分析。

与传统网络分析工具相比,Arkime最大的特点在于其将原始流量与索引数据进行解耦存储。用户在检索时首先通过OpenSearch快速定位目标会话,再根据索引记录回溯对应的PCAP数据,从而避免直接扫描海量数据包带来的性能瓶颈。这种设计使Arkime能够在数十TB甚至PB级流量环境下仍保持较高的查询效率。

在实际应用中,Arkime广泛部署于安全运营中心(SOC)、网络取证平台以及威胁狩猎环境中,常与Zeek、Suricata等安全分析工具协同工作。其中Arkime负责流量采集与回溯取证,Zeek负责生成高层协议日志和行为分析结果,Suricata负责实时威胁检测与告警,三者共同构建覆盖“检测—分析—溯源”全流程的网络安全监测体系。

这里,我们选择用Docker方式部署,因为Docker环境隔离做的很漂亮,而且不用考虑乱七八糟的依赖,这里我们一共用到两个Docker镜像,一个是Arkime的,另一个是Opensearch的。

创建目录

首先创建 Arkime 所需的数据目录,用于后续 Docker 容器挂载:

sudo mkdir -p /opt/arkime/{raw,etc,opensearch}

目录说明如下:

目录作用
/opt/arkime/raw存储 Arkime 抓取的原始 PCAP 数据
/opt/arkime/etc存储 Arkime 配置文件、证书等运行配置
/opt/arkime/opensearch存储 OpenSearch 数据库持久化数据

通过将数据挂载到宿主机目录,即使容器重建或升级,抓包数据和数据库数据也不会丢失。

编写 Docker Compose 文件

Arkime 采用分组件架构运行,核心组件包括:

  • Capture:负责网络流量采集与 PCAP 存储;
  • Viewer:提供 Web 界面以及数据查询功能;
  • OpenSearch:负责索引存储和会话检索。

下面给出一个最小可运行版本:

services:

  opensearch:
    image: opensearchproject/opensearch:2.19.1
    container_name: opensearch
    environment:
      - discovery.type=single-node
      - OPENSEARCH_INITIAL_ADMIN_PASSWORD=ArkimeOpenSearch123!
      - OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g
    volumes:
      - /opt/arkime/opensearch:/usr/share/opensearch/data
    ports:
      - "9200:9200"
    restart: unless-stopped

  capture:
    image: ghcr.io/arkime/arkime/arkime:v6-latest
    container_name: arkime-capture
    network_mode: host
    cap_add:
      - NET_ADMIN
      - NET_RAW
      - SYS_NICE
    command: >
      /opt/arkime/bin/docker.sh capture
    volumes:
      - /opt/arkime/raw:/opt/arkime/raw
      - /opt/arkime/etc:/opt/arkime/etc
    restart: unless-stopped
    depends_on:
      - opensearch

  viewer:
    image: ghcr.io/arkime/arkime/arkime:v6-latest
    container_name: arkime-viewer
    network_mode: host
    command: >
      /opt/arkime/bin/docker.sh viewer
    volumes:
      - /opt/arkime/raw:/opt/arkime/raw
      - /opt/arkime/etc:/opt/arkime/etc
    restart: unless-stopped
    depends_on:
      - opensearch

OpenSearch 配置说明

discovery.type=single-node

表示以单节点模式运行 OpenSearch。对于实验环境或中小规模部署场景,无需配置集群即可正常工作。

OPENSEARCH_INITIAL_ADMIN_PASSWORD

设置 OpenSearch 内置 admin 用户密码,后续 Arkime 连接数据库时会使用该账号。

OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g

设置 JVM 堆内存大小:

  • -Xms2g:初始堆内存 2GB
  • -Xmx2g:最大堆内存 2GB

生产环境通常建议分配主机内存的 50% 左右给 OpenSearch。

Capture 配置说明

network_mode: host

Arkime 需要直接访问宿主机网卡进行流量捕获,因此推荐使用 Host 网络模式。

cap_add:
  - NET_ADMIN
  - NET_RAW
  - SYS_NICE

授予容器抓包所需权限:

权限作用
NET_ADMIN修改网卡参数
NET_RAW创建原始套接字进行抓包
SYS_NICE调整线程优先级,提高抓包性能

数据持久化

volumes:

将容器内部目录映射到宿主机:

/opt/arkime/raw

用于保存抓取的 PCAP 文件。

/opt/arkime/etc

用于保存 Arkime 配置文件和证书。

初始化数据库

首先启动 OpenSearch:

docker compose up -d opensearch

确认 9200 端口可以正常访问后,初始化 Arkime 数据库结构:

docker run --rm \
  --network host \
  -v /opt/arkime/etc:/opt/arkime/etc \
  ghcr.io/arkime/arkime/arkime:v6-latest \
  /opt/arkime/db/db.pl \
  --insecure \
  'https://admin:ArkimeOpenSearch123!@127.0.0.1:9200' \
  init

参数说明:

--insecure

OpenSearch 默认启用 HTTPS,并使用自签名证书。

初始化阶段 Arkime 尚未导入根证书,因此需要通过该参数跳过证书校验,否则会出现 TLS 验证失败的问题。

init

创建 Arkime 所需的索引、模板以及数据库结构。

初始化 Web 用户

创建 Arkime Web 管理员账号:

docker run --rm \
  --network host \
  -v /opt/arkime/etc:/opt/arkime/etc \
  ghcr.io/arkime/arkime/arkime:v6-latest \
  /opt/arkime/bin/arkime_add_user.sh \
  admin \
  "Admin User" \
  Password123! \
  --admin

参数含义:
admin:登录用户名。
Admin User:显示名称。
Password123!:登录密码。
--admin:授予管理员权限。

导出 OpenSearch 根证书

OpenSearch 默认启用了 TLS 加密通信。

Arkime 在运行阶段需要验证 OpenSearch 证书,因此需要将 OpenSearch 容器中的根证书导出到本地:

docker cp opensearch:/usr/share/opensearch/config/root-ca.pem \
/opt/arkime/etc/opensearch-ca.pem

执行完成后,本地目录结构如下:

/opt/arkime/etc/
├── config.ini
└── opensearch-ca.pem

如果缺少该证书,Arkime 在启动时通常会出现证书校验失败,从而无法连接 OpenSearch。

配置 config.ini

编辑配置文件:

vim /opt/arkime/etc/config.ini

内容如下:

[default]
elasticsearch=https://admin:ArkimeOpenSearch123!@127.0.0.1:9200
caTrustFile=/opt/arkime/etc/opensearch-ca.pem
interface=ens18
pcapDir=/opt/arkime/raw
snapLen=32768

参数说明:

elasticsearch:指定 OpenSearch 连接地址。
caTrustFile:指定 OpenSearch 根证书文件,用于 TLS 证书验证。
interface:指定抓包网卡。
可通过以下命令查看网卡名称:

ifconfig

pcapDir:指定 PCAP 文件存储目录。
snapLen:指定单个数据包最大捕获长度。
常见取值:

说明
1514仅保存标准以太网帧
9000支持 Jumbo Frame
32768推荐值,适用于绝大多数场景

注意,这里snapLen=0会报错。

启动 Arkime

完成上述配置后,启动所有组件:

docker compose up -d

查看容器状态:

docker ps

正常情况下可以看到:

  • OpenSearch
  • Arkime Capture
  • Arkime Viewer

三个容器均处于运行状态。

至此,一个基于 Docker 的 Arkime 单节点部署已经完成,可以通过 Web 界面对网络流量进行检索、分析和管理。

需要说明的是,本文仅提供一个最小可运行环境,实际生产部署时还需要根据硬件配置、流量规模以及存储需求,对 OpenSearch、Arkime Capture 线程数、PCAP 保留策略以及索引生命周期等参数进行进一步优化。

标签: Arkime

添加新评论