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