DEV Community

Vladimir Levchenko
Vladimir Levchenko

Posted on

Фильтрация трафика: гибридные решения на основе BPF, XDP и FPGA

Современные сети подвергаются всё более мощным и изощрённым атакам. Объём вредоносного трафика растёт с каждым годом, а традиционные программные методы защиты перестают справляться с нагрузкой. В этой статье мы разберём три технологии, которые в связке формируют эффективный многоуровневый контур фильтрации: BPF, XDP и FPGA.

Что такое BPF и зачем он нужен

BPF (Berkeley Packet Filter) — это виртуальная машина внутри ядра Linux, позволяющая запускать пользовательский код в пространстве ядра без изменения его исходников. Изначально BPF создавался для захвата и анализа сетевых пакетов — именно на нём построены такие инструменты, как tcpdump.

Расширенная версия — eBPF (extended BPF) — радикально расширила возможности оригинала:

  • перехват системных вызовов;
  • трассировка входов и выходов функций ядра;
  • мониторинг сетевых событий в реальном времени;
  • прикрепление обработчиков к произвольным точкам в ядре.

eBPF-программы верифицируются перед загрузкой — ядро отклонит любой небезопасный код: бесконечные циклы, обращения за пределы памяти, недопустимые операции. Это делает технологию надёжной даже при работе с привилегированным кодом.

Данные между eBPF-программой и пространством пользователя передаются через BPF maps — структуры данных в памяти ядра, поддерживающие хеш-таблицы, массивы, LRU-кэши и другие форматы.

XDP: фильтрация на самом раннем этапе

XDP (eXpress Data Path) — это хук в ядре Linux, который подключается на уровне драйвера сетевой карты сразу после обработки прерывания. Ключевое преимущество: пакет анализируется до того, как под него выделяется память в сетевом стеке ядра.

Программа XDP может принять одно из нескольких решений:

Действие Описание
XDP_PASS Передать пакет дальше в стек ядра
XDP_DROP Немедленно отбросить пакет
XDP_TX Отправить пакет обратно через ту же карту
XDP_REDIRECT Перенаправить на другой интерфейс или в пространство пользователя
XDP_ABORTED Прервать обработку (для отладки)

Благодаря тому, что логика выполняется до выделения sk_buff, XDP демонстрирует исключительную производительность. В тестах Red Hat xdp-filter на одном ядре процессора сбрасывал 26 миллионов пакетов в секунду — в несколько раз больше, чем nftables на том же железе.

Пример: ограничение скорости по IP с XDP

SEC("xdp")
int xdp_rate_limit(struct xdp_md *ctx) {
    void *data     = (void *)(long)ctx->data;
    void *data_end = (void *)(long)ctx->data_end;

    struct ethhdr *eth = data;
    if ((void *)(eth + 1) > data_end)
        return XDP_PASS;

    if (eth->h_proto != bpf_htons(ETH_P_IP))
        return XDP_PASS;

    struct iphdr *ip = (void *)(eth + 1);
    if ((void *)(ip + 1) > data_end)
        return XDP_PASS;

    __u32 src_ip = ip->saddr;
    struct rate_limit_entry *entry = bpf_map_lookup_elem(&rate_limit_map, &src_ip);

    if (entry && entry->count > RATE_LIMIT_THRESHOLD)
        return XDP_DROP;

    // обновить счётчик
    return XDP_PASS;
}
Enter fullscreen mode Exit fullscreen mode

Программа разбирает Ethernet- и IP-заголовки, извлекает IP источника и проверяет его по BPF map с лимитами. Если порог превышен — пакет немедленно отбрасывается, не достигая сетевого стека.

Почему программного фильтра недостаточно

XDP работает быстро, но он всё равно потребляет ресурсы CPU. При атаке в несколько сотен гигабит в секунду даже высокооптимизированный eBPF-код начинает вытеснять легитимные процессы. Чем выше скорость атаки, тем больше ядер уходит на фильтрацию.

Проблема не в алгоритме — проблема в том, что ядро вообще участвует в обработке мусорного трафика.

FPGA: аппаратная фильтрация вне ядра

FPGA (Field-Programmable Gate Array) — это перепрограммируемая интегральная схема. В отличие от CPU, FPGA не исполняет инструкции последовательно: её логика реализована в аппаратных схемах и работает параллельно, независимо от ядер процессора.

Идея гибридного подхода: разместить FPGA как отдельное звено между физическим сетевым адаптером и пространством ядра. FPGA перехватывает пакеты до того, как они вообще попадут в драйвер NIC — ядро не тратит ни одного такта на мусорный трафик.

Как это работает

  1. Трафик поступает на физический интерфейс.
  2. FPGA-модуль разбирает заголовки пакетов в аппаратных схемах.
  3. Правила фильтрации (IP-списки, паттерны атак) загружаются в FPGA из управляющей плоскости.
  4. Вредоносные пакеты отбрасываются на скорости линии — без участия CPU.
  5. Чистый трафик передаётся дальше, где XDP/eBPF выполняет тонкую фильтрацию.

Алгоритм LPM в FPGA

Для хранения и поиска IP-префиксов в FPGA применяется алгоритм LPM (Longest Prefix Matching). Он позволяет эффективно работать с таблицами из миллионов IP-диапазонов и принимать решение о судьбе пакета за наносекунды.

Исследование, опубликованное в журнале Sensors (MDPI), показало: гибридный фильтр на базе FPGA и программного XDP/eBPF обеспечивает прирост производительности до 30% по сравнению с чисто программным решением при реалистичных наборах правил.

Гибридная архитектура: три уровня защиты

Объединив три технологии, получаем многоуровневый контур:

[Интернет]
    │
    ▼
┌─────────────────────────────┐
│  FPGA (аппаратный уровень)  │  ← Отбрасывает известные атаки
│  LPM + IP blocklists        │    со скоростью линии, без CPU
└────────────┬────────────────┘
             │ чистый трафик
             ▼
┌─────────────────────────────┐
│  XDP (уровень драйвера NIC) │  ← eBPF-программа, до выделения
│  Rate limiting, SYN cookies │    sk_buff. ~26M pps/core
└────────────┬────────────────┘
             │
             ▼
┌─────────────────────────────┐
│  eBPF (tc / socket filters) │  ← Тонкая логика: анализ L7,
│  Stateful tracking          │    stateful-сессии, аномалии
└────────────┬────────────────┘
             │
             ▼
         [Приложение]
Enter fullscreen mode Exit fullscreen mode

Каждый уровень решает свою задачу:

  • FPGA — отсекает объёмный мусор ещё до ядра;
  • XDP — высокоскоростная обработка в драйвере, минимальный overhead;
  • eBPF/tc — сложная логика с доступом к состоянию соединений.

Применение: защита от DDoS атак

Описанная архитектура особенно эффективна для защиты от DDoS атак — именно в этом сценарии разница между уровнями становится критической.

При атаке в 2+ Тбит/с программный фильтр на CPU будет перегружен. FPGA-уровень принимает удар первым: он отбрасывает пакеты с заблокированных IP-диапазонов и известных ботнет-адресов без какого-либо участия процессора. XDP подхватывает остаток и применяет динамические правила на основе поведенческих паттернов.

Именно так построены решения операторов уровня Cloudflare и аналогичных провайдеров фильтрации: аппаратный offload для объёмных атак + программируемая логика для сложных многовекторных угроз.

Подробнее о том, как организована защита от DDoS атак на практике и какие векторы атак наиболее распространены сегодня, читайте в блоге StormWall.

Операционные аспекты

Управление правилами

Правила фильтрации обновляются через управляющую плоскость и загружаются как в FPGA (через PCIe или JTAG-интерфейс), так и в BPF maps (через bpf() syscall). Это позволяет менять политики фильтрации без перезагрузки и без потери трафика.

Мониторинг и телеметрия

eBPF-программы могут отправлять события в пространство пользователя через perf ring buffers или BPF ring map, формируя поток телеметрии в реальном времени: счётчики сброшенных пакетов, статистика по IP-адресам, гистограммы размеров пакетов.

Портируемость

Начиная с ядра 5.13 поддерживается BTF (BPF Type Format) и CO-RE (Compile Once – Run Everywhere): eBPF-программу можно собрать один раз и запустить на любом ядре, поддерживающем BTF, без перекомпиляции под конкретную версию.

Ограничения и компромиссы

Аспект BPF/XDP FPGA
Гибкость Высокая (код на C/Rust) Низкая (HDL, длинный цикл разработки)
Стоимость Низкая (только CPU) Высокая (аппаратура + разработка)
Производительность Десятки Мпакет/с на ядро Скорость линии без CPU overhead
Порог вхождения Средний (eBPF верификатор) Высокий (VHDL/Verilog, FPGA toolchain)
Обновление правил Миллисекунды Секунды — минуты

Для большинства сервисов XDP+eBPF закрывает задачу полностью. FPGA оправдан там, где объём атак превышает возможности CPU-пула или где каждый наносекунд задержки имеет значение.

Что дальше

Граница между программным и аппаратным фильтром продолжает размываться. SmartNIC нового поколения (например, Nvidia BlueField, Pensando) выполняют eBPF-программы прямо на встроенном ARM-процессоре карты, не задействуя хост-CPU вообще. Это даёт гибкость eBPF при накладных расходах, близких к FPGA.

Параллельно развивается стандарт P4 — язык описания обработки пакетов, компилируемый как на FPGA, так и на программируемые ASIC. Это открывает путь к единой модели программирования для всех уровней аппаратного ускорения.

Итог

  • BPF/eBPF — универсальный инструмент для программируемой логики в ядре: мониторинг, фильтрация, трассировка.
  • XDP — точка наиболее раннего перехвата пакетов в программном стеке Linux, работает до выделения памяти сетевым стеком.
  • FPGA — аппаратный уровень, полностью исключающий ядро из обработки мусорного трафика.

Гибридная архитектура, объединяющая все три, сегодня является эталонным подходом для построения инфраструктуры, устойчивой к крупным сетевым атакам. Подробнее о практических методах противодействия сетевым угрозам — на сайте StormWall, специализирующегося на защите инфраструктуры от объёмных атак, а также в их материале о методах защиты от DDoS.

Top comments (0)