ayaFlow: eBPF-анализатор трафика на Rust для Kubernetes

Архитектура

                                KERNEL SPACE
          +-------------------------------------------------------+
          |                                                       |
          |   NIC                                                 |
          |    |                                                  |
          |    +-- TC Hook (Ingress + Egress)                     |
          |           |                                           |
          |       eBPF Classifier                                 |
          |           |                                           |
          |       PacketEvent --> Ring Buffer                     |
          |                          |                            |
          +-------------------------------------------------------+
                                    |
                                USER SPACE
          +-------------------------------------------------------+
          |                          |                            |
          |                   Tokio Event Loop                    |
          |                     /    |    \                       |
          |                    /     |     \                      |
          |            DashMap    SQLite    Axum HTTP             |
          |          (live stats) (history) (API + metrics)       |
          |                                                       |
          +-------------------------------------------------------+

Высокопроизводительный анализатор сетевого трафика на основе eBPF, написанный на Rust. Разработан для запуска в виде DaemonSet без sidecar-контейнеров в Kubernetes, обеспечивая видимость сетевого трафика на уровне узла средствами ядра с минимальными накладными расходами.

Построен на основе фреймворка eBPF Aya.

Сторона ядра (Kernel-side) — классификатор TC (Traffic Control, управление трафиком), подключённый как на приём (ingress), так и на отправку (egress), разбирает заголовки Ethernet/IPv4/IPv6/TCP/UDP и помещает лёгкие структуры PacketEvent (с меткой направления) в общий кольцевой буфер (ring buffer).

Пространство пользователя (Userspace) — асинхронный агент Tokio опрашивает кольцевой буфер, поддерживает актуальное состояние соединений в DashMap, сохраняет события в SQLite и предоставляет REST API с метриками Prometheus.

Возможности

  • Захват через eBPF — Без libpcap, без привилегированного sidecar-контейнера. Подключается напрямую к подсистеме управления трафиком ядра.

  • DaemonSet без sidecar — Один под на узел вместо одного пода на каждый прикладной под.

  • Широкая поддержка протоколов — Захват и разбор заголовков IPv4, IPv6, TCP и UDP.

  • Мониторинг в реальном времени — Живая панель мониторинга через REST API + потоковая передача по WebSocket.

  • Постоянная история — Хранение в SQLite с настраиваемым сроком хранения данных и агрегацией.

  • Глубокая инспекция L7 — Опциональное извлечение TLS SNI и DNS-запросов для видимости зашифрованного трафика на уровне доменных имён.

  • Prometheus /metrics — Встроенный экспортёр для ayaflow_packets_total, ayaflow_bytes_total, ayaflow_active_connections, ayaflow_domains_resolved_total, ayaflow_deep_inspect_packets_total.

  • Список разрешённых IP — Ограничение доступа к API/панели мониторинга по исходному CIDR.

Наблюдаемость (Observability)

ayaFlow включает полностью настроенный стек мониторинга на основе Prometheus и Grafana для наблюдаемости «из коробки».

Смотрите docker-compose.monitoring.example.yml для запуска ayaFlow вместе с Prometheus (предварительно настроенным для сбора метрик с эндпоинта /metrics) и Grafana (с автоматически подготовленным источником данных и дашбордом).

Предварительные требования

  • Rust: стабильная + nightly-версия инструментальной цепочки

  • bpf-linker: cargo +nightly install bpf-linker

  • Ядро Linux: >= 5.8 с поддержкой BTF (для eBPF)

  • Права доступа (Capabilities): CAP_BPF, CAP_NET_ADMIN, CAP_PERFMON

Быстрый старт

Установка через Docker Packages (рекомендуется)

Готовый Docker-образ можно загрузить напрямую из GitHub Container Registry. Образ автоматически собирается для OS/Arch linux/amd64.

docker pull ghcr.io/davidhavoc/ayaflow:latest

Сборка из исходного кода

# Установка bpf-linker (однократно)
cargo +nightly install bpf-linker

# Сборка всего (eBPF + userspace)
cargo xtask build

Запуск

# Требуются права root для подключения eBPF
sudo ./target/debug/ayaflow --interface eth0

Проверка

curl http://localhost:3000/api/health
curl http://localhost:3000/metrics

Параметры командной строки

Флаг Описание По умолчанию

-i, --interface

Сетевой интерфейс для подключения eBPF

eth0

-p, --port

Порт API-сервера

3000

--db-path

Путь к базе данных SQLite

traffic.db

--connection-timeout

Очистка устаревших соединений (секунды)

60

--data-retention

Автоудаление пакетов старше указанного времени (секунды)

отключено

--aggregation-window

Агрегация событий за окно (секунды)

0 (выкл.)

--allowed-ips

CIDR-диапазоны, которым разрешён доступ к API

без ограничений

-c, --config

Путь к конфигурационному файлу YAML

-

-q, --quiet

Подавлять логи, не являющиеся ошибками

false

--deep-inspect

Включить извлечение доменов через DNS + TLS SNI

false

--enable-ipv6

Включить захват пакетов IPv6

false (по умолчанию только IPv4)

--resolve-dns

Включить обратное DNS-разрешение для IP-адресов

false

Развёртывание в Kubernetes

Разверните в виде DaemonSet (см. k8s/daemonset.yaml):

kubectl apply -f k8s/daemonset.yaml

DaemonSet использует hostNetwork: true и монтирует /sys/fs/bpf. Аннотации для сбора метрик Prometheus включены по умолчанию.

Рекомендации по ресурсам

resources:
  requests:
    memory: "32Mi"
    cpu: "50m"
  limits:
    memory: "128Mi"
    cpu: "500m"

Справочник по API

Эндпоинт Метод Описание

/api/health

GET

Проверка работоспособности с базовыми счётчиками

/api/stats

GET

Время работы, пропускная способность, количество соединений

/api/live

GET

Топ-50 активных соединений по количеству пакетов

/api/history?limit=N

GET

Последние пакеты из SQLite (не более 1000)

/api/stream

WS

WebSocket-трансляция статистики каждую секунду

/metrics

GET

Метрики в текстовом формате Prometheus

Структура проекта

ayaflow-common/    # Общие типы (no_std, используется и ядром, и userspace)
ayaflow-ebpf/      # eBPF-программа ядра (классификатор TC)
ayaflow/           # Агент пространства пользователя (загрузчик Aya + Tokio + Axum)
xtask/             # Оркестрация сборки (cargo xtask)
k8s/               # Манифест Kubernetes DaemonSet

Производительность и потребление ресурсов

Измерено на минимальной виртуальной машине (Ubuntu 24.04, 2 vCPU, 2 ГБ ОЗУ):

Метрика Значение

RSS пространства пользователя (установившееся состояние)

~33 МБ

eBPF-программа (xlated)

784 Б

eBPF-программа (JIT-скомпилированная)

576 Б

memlock eBPF-программы

4 КБ

Кольцевой буфер EVENTS

256 КБ

Кольцевой буфер PAYLOAD_EVENTS

256 КБ (используется только при включённом --deep-inspect)

memlock кольцевого буфера

~270 КБ (540 КБ с deep inspect)

Рост потребления памяти со временем

Не обнаружен (стабильный RSS)

Загрузка классификатора eBPF подтверждается через bpftool:

$ sudo bpftool prog show name ayaflow
430: sched_cls  name ayaflow  tag 0dabf78b3d068075  gpl
     loaded_at 2026-02-16T16:38:12+0100  uid 0
     xlated 784B  jited 576B  memlock 4096B  map_ids 76

Тестирование

  • ОС: Ubuntu 24.04 LTS (aarch64)

  • Ядро: 6.x с поддержкой BTF

  • Оборудование: 2 vCPU, 2 ГБ ОЗУ (Lima VM)

  • Rust: nightly-инструментальная цепочка + bpf-linker

Лицензия

В проекте используются три различные лицензии в зависимости от компонента:

Компоненты пространства пользователя

Агент пространства пользователя и общие библиотеки (ayaflow и ayaflow-common) имеют двойную лицензию — на ваш выбор:

Компоненты ядра

Компоненты eBPF для ядра (ayaflow-ebpf) лицензированы исключительно под GNU General Public License v2.0 (GPL) для обеспечения совместимости с верификатором ядра Linux.

© 2026 meganuke