Современные сети подвергаются всё более мощным и изощрённым атакам. Объём вредоносного трафика растёт с каждым годом, а традиционные программные методы защиты перестают справляться с нагрузкой. В этой статье мы разберём три технологии, которые в связке формируют эффективный многоуровневый контур фильтрации: 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;
}
Программа разбирает Ethernet- и IP-заголовки, извлекает IP источника и проверяет его по BPF map с лимитами. Если порог превышен — пакет немедленно отбрасывается, не достигая сетевого стека.
Почему программного фильтра недостаточно
XDP работает быстро, но он всё равно потребляет ресурсы CPU. При атаке в несколько сотен гигабит в секунду даже высокооптимизированный eBPF-код начинает вытеснять легитимные процессы. Чем выше скорость атаки, тем больше ядер уходит на фильтрацию.
Проблема не в алгоритме — проблема в том, что ядро вообще участвует в обработке мусорного трафика.
FPGA: аппаратная фильтрация вне ядра
FPGA (Field-Programmable Gate Array) — это перепрограммируемая интегральная схема. В отличие от CPU, FPGA не исполняет инструкции последовательно: её логика реализована в аппаратных схемах и работает параллельно, независимо от ядер процессора.
Идея гибридного подхода: разместить FPGA как отдельное звено между физическим сетевым адаптером и пространством ядра. FPGA перехватывает пакеты до того, как они вообще попадут в драйвер NIC — ядро не тратит ни одного такта на мусорный трафик.
Как это работает
- Трафик поступает на физический интерфейс.
- FPGA-модуль разбирает заголовки пакетов в аппаратных схемах.
- Правила фильтрации (IP-списки, паттерны атак) загружаются в FPGA из управляющей плоскости.
- Вредоносные пакеты отбрасываются на скорости линии — без участия CPU.
- Чистый трафик передаётся дальше, где 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.
Top comments (0)