Найти в Дзене

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

Современные сети подвергаются всё более мощным и изощрённым атакам. Объём вредоносного трафика растёт с каждым годом, а традиционные программные методы защиты перестают справляться с нагрузкой. В этой статье мы разберём три технологии, которые в связке формируют эффективный многоуровневый контур фильтрации: BPF, XDP и FPGA. BPF (Berkeley Packet Filter) — это виртуальная машина внутри ядра Linux, позволяющая запускать пользовательский код в пространстве ядра без изменения его исходников. Изначально BPF создавался для захвата и анализа сетевых пакетов — именно на нём построены такие инструменты, как `tcpdump`. Расширенная версия — **eBPF** (extended BPF) — радикально расширила возможности оригинала: - перехват системных вызовов; - трассировка входов и выходов функций ядра; - мониторинг сетевых событий в реальном времени; - прикрепление обработчиков к произвольным точкам в ядре. eBPF-программы верифицируются перед загрузкой — ядро отклонит любой небезопасный код: бесконечные циклы, обраще
Оглавление

Современные сети подвергаются всё более мощным и изощрённым атакам. Объём вредоносного трафика растёт с каждым годом, а традиционные программные методы защиты перестают справляться с нагрузкой. В этой статье мы разберём три технологии, которые в связке формируют эффективный многоуровневый контур фильтрации: 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

```c

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;

}

```

Программа разбирает 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-сессии, аномалии

└────────────┬────────────────┘

[Приложение]

```

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

- **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.