Архитектура
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
Параметры командной строки
| Флаг | Описание | По умолчанию |
|---|---|---|
|
Сетевой интерфейс для подключения eBPF |
|
|
Порт API-сервера |
|
|
Путь к базе данных SQLite |
|
|
Очистка устаревших соединений (секунды) |
|
|
Автоудаление пакетов старше указанного времени (секунды) |
отключено |
|
Агрегация событий за окно (секунды) |
|
|
CIDR-диапазоны, которым разрешён доступ к API |
без ограничений |
|
Путь к конфигурационному файлу YAML |
- |
|
Подавлять логи, не являющиеся ошибками |
|
|
Включить извлечение доменов через DNS + TLS SNI |
|
|
Включить захват пакетов IPv6 |
|
|
Включить обратное DNS-разрешение для IP-адресов |
|
Развёртывание в 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
| Эндпоинт | Метод | Описание |
|---|---|---|
|
GET |
Проверка работоспособности с базовыми счётчиками |
|
GET |
Время работы, пропускная способность, количество соединений |
|
GET |
Топ-50 активных соединений по количеству пакетов |
|
GET |
Последние пакеты из SQLite (не более 1000) |
|
WS |
WebSocket-трансляция статистики каждую секунду |
|
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 КБ (используется только при включённом |
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.