eBPF вместо всего: почему это новая эра сетей, мониторинга и безопасности?

Раньше модификация Linux требовала пересборки ядра или использования дополнительных модулей. Но теперь есть eBPF — технология, которая позволяет программировать ядро на лету, не жертвуя стабильностью. Звучит как мечта системного администратора или очередной тренд, который существует только на бумаге, но нет. Обработка миллионов пакетов в секунду, отслеживание уязвимостей в реальном времени и замена традиционных агентов мониторинга чем-то более эффективным — это не будущее. Это настоящее, в котором уже живут, например, CloudFlare и Netflix. Детали под катом.
Используйте навигацию, если не хотите читать текст целиком:
→ Что такое eBPF
→ Почему eBPF — это революция
→ eBPF в сетях
→ eBPF в мониторинге
→ eBPF в безопасности
→ Заключение
Что такое eBPF
eBPF (Extended Berkeley Packet Filter) — это технология, которая позволяет запускать небольшие программы прямо в ядре Linux, не трогая его код и не подвергая риску стабильность системы. По сути, вы можете модернизировать ядро так же легко, как настраиваете приложения в пользовательском пространстве. Только при этом вы получаете производительность и безопасность уровня системного программирования.
Как это работает
Давайте упростим. Представьте, что у вас есть автомобиль, и вы хотите улучшить его производительность. Вместо того чтобы менять двигатель (пересобирать ядро), вы его настраиваете. Возможно, не только его — здесь пусть эксперты по автомобилям подскажут в комментариях. Так вот, eBPF — это некий режим кастомизации ядра Linux, позволяющий инжектить новые фичи без необходимости править исходный код.
Например, если вы хотите отслеживать сетевой трафик, eBPF может собирать данные о каждом пакете, проходящем через систему. Если нужно фильтровать пакеты, eBPF может перехватывать их прямо в сетевом драйвере, минуя медленные уровни обработки. Это делает систему не только гибкой, но и безопасной, так как программы eBPF выполняются в изолированной песочнице внутри ядра. При этом их ресурсы (память, CPU), строго ограничены, что предотвращает негативное влияние на стабильность ОС.

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

Почему eBPF — это революция
Казалось бы, зачем нам еще одна технология для ядра Linux? Когда система работает стабильно, о ее внутреннем устройстве мало кто задумывается. Но как только возникает проблема, выясняется, что инструменты диагностики слишком медленные, а изменения в ядре требуют пересборки. eBPF решает эту проблему, позволяя заглянуть внутрь системы без лишних сложностей. Давайте разберемся, как это работает.
Чем eBPF отличается от старых подходов
Как уже было сказано, одно из ключевых отличий eBPF в том, что технология позволяет миновать медленные уровни взаимодействия с пользовательским пространством. Это приводит к более быстрой обработке событий и мониторингу без значительного влияния на производительность системы. Одним из главных преимуществ eBPF является возможность динамически загружать и выгружать программы без перезагрузки системы. Это упрощает обновление и мониторинг в реальном времени, что особенно важно для современных высоконагруженных систем.

eBPF-наблюдаемость обеспечивает видимость событий в реальном времени для контейнеров и системных процессов, что позволяет глубже анализировать инфраструктуру. Источник.
Какие проблемы решает eBPF
eBPF помогает решать множество задач, от мониторинга производительности до обеспечения безопасности и сетевой оптимизации. Например, с помощью eBPF можно отслеживать системные вызовы, сетевой трафик и другие события в режиме реального времени. Это позволяет находить узкие места в производительности и оптимизировать систему. Технологии вроде Cilium используют eBPF для реализации сетевых политик в Kubernetes, что обеспечивает более эффективную и динамичную защиту.
Сетевая оптимизация — еще одно важное направление. Технология XDP (eXpress Data Path) использует eBPF для обработки пакетов прямо на уровне драйвера сетевой карты. Некоторые современные сетевые карты (например, SmartNICs) поддерживают выполнение eBPF-программ непосредственно на аппаратном уровне, что позволяет обрабатывать миллионы пакетов в секунду без значительного влияния на производительность системы. Такие решения особенно полезны в работе CDN или дата-центров.
Пример использования bpftrace демонстрирует, как eBPF может мгновенно давать данные о системе без изменения ядра. Например, можно отслеживать выполнение операций в PostgreSQL, таких как VACUUM, и измерять время их выполнения:
sudo bpftrace -e '
uprobe:/home/jan/postgresql-sandbox/bin/REL_14_2_DEBUG/bin/postgres:vacuum_rel
@start[tid] = nsecs;
@oid[tid] = arg0;
uretprobe:/home/jan/postgresql-sandbox/bin/REL_14_2_DEBUG/bin/postgres:vacuum_rel
/@start[tid]/
@vacuum[@oid[tid]] = nsecs - @start[tid];
delete(@start[tid]);
delete(@oid[tid]);
BEGIN
printf("VACUUM calls are traced, press CTRL+C to stop tracing\n");
END
printf("\n\nNeeded time in ns to perform VACUUM FULL per Oid\n");
print(@vacuum);
'
Этот скрипт позволяет получить подробную информацию о производительности базы данных без изменения ядра или перезагрузки системы.
XDP обрабатывает пакеты на самом раннем этапе в сетевом пути — еще до того, как они попадут в традиционный стек ядра. Если XDP-программа решает пропустить пакет дальше, он передается в ядро и продолжает обработку по стандартному пути. Что позволяет фильтровать или перенаправлять трафик с минимальными задержками, что значительно увеличивает пропускную способность. Это одна из самых мощных технологий, построенных на базе eBPF. Отличное решение для высокопроизводительных фильтров, маршрутизаторов и балансировщиков нагрузки.
Ниже приведу пример простой XDP-программы на C, которая фильтрует пакеты на основе их типа и IP-адреса отправителя:
#include
#include
#define SEC(NAME) __attribute__((section(NAME), used))
SEC("prog")
int xdp_drop(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_ABORTED;
}
// Извлечение типа пакета
__u16 h_proto = eth->h_proto;
// Фильтрация пакетов по типу
if (h_proto != bpf_htons(ETH_P_IP)) {
return XDP_PASS;
}
// Дополнительная обработка IP-пакетов
struct iphdr *iph = data + sizeof(*eth);
if ((void *)(iph + 1) > data_end) {
return XDP_ABORTED;
}
// Пример фильтрации по IP-адресу
__u32 src_ip = iph->saddr;
if (src_ip == 0x01010101) { // Пример IP-адреса для фильтрации
return XDP_DROP;
}
return XDP_PASS;
}
char __license[] SEC("license") = "GPL";
Этот код демонстрирует, как eBPF можно использовать для перехвата и фильтрации пакетов на уровне сетевой карты. Программа проверяет тип пакета (например, IPv4) и фильтрует его на основе IP-адреса отправителя. Если пакет соответствует заданным условиям, он блокируется (XDP_DROP). В противном случае — передается дальше (XDP_PASS).
Новые возможности и достижения
В Linux 6.9 появились новые функции, такие как BPF Tokens и BPF Arena. BPF Tokens позволяют делегировать ограниченные права eBPF непривилегированным процессам, что улучшает безопасность в многопользовательских средах. BPF Arena создает общую область памяти между eBPF-программами и пользовательским пространством, что позволяет эффективно обмениваться данными без использования eBPF map, а также через perf buffer и ring buffer.
Интеграция с OpenTelemetry делает eBPF еще более мощным инструментом для наблюдаемости на уровне ядра. Это особенно важно для современных микросервисных архитектур, где традиционные решения часто недостаточно эффективны.
eBPF в сетях
eBPF революционизирует сетевую инфраструктуру, обеспечивая высокопроизводительную маршрутизацию и фильтрацию пакетов на уровне ядра. Это позволяет компаниям вроде CloudFlare оптимизировать сетевые решения и повысить безопасность.
Еще один гигант, который прокачивает свою инфраструктуру с помощью eBPF, — Netflix. В потоковом сервисе критична не только скорость доставки контента, но и стабильность работы при миллионах одновременных пользователей. Чтобы держать высокий уровень производительности, компания активно внедряет eBPF в свои системы мониторинга и оптимизации.
Одна из ключевых проблем — «шумные соседи» в контейнерной среде, когда ресурсы CPU перераспределяются неравномерно, вызывая скачки задержек. Netflix использует eBPF для инструментирования run queue latency и выявления просадок в производительности в реальном времени. Например, запуск ресурсоемкого контейнера может вызвать скачок задержек у других процессов, как показано на графике ниже.

График показывает, как запуск контейнера с полной загрузкой CPU привел к резкому увеличению run queue latency у соседнего контейнера. Netflix использует eBPF для мониторинга таких скачков и оптимизации распределения ресурсов. Источник.
Чтобы еще глубже погружаться в аналитику, Netflix разработал bpftop — инструмент, отслеживающий выполнение eBPF-программ в реальном времени. Он анализирует загрузку CPU, среднее время выполнения и частоту событий, позволяя минимизировать накладные расходы и поддерживать стабильность потокового сервиса даже при пиковых нагрузках.
eBPF в мониторинге
Традиционные агенты мониторинга — это часто отдельные приложения, которые запускаются в пользовательском пространстве и могут оказывать значительное влияние на производительность. eBPF, минуя все эти узкие места, вытаскивает данные и не тормозит систему. Для некоторых компаний это делает eBPF незаменимым инструментом в современных сетях.

eBPF превосходит существующие методы инструментирования. Источник.
eBPF в безопасности
eBPF обеспечивает безопасную обработку пакетов на уровне ядра. Можно фильтровать пакеты, предотвращать DDoS-атаки, анализировать сетевой трафик и даже блокировать подозрительные IP-адреса. Или анализировать аномальные паттерны в поведении процессов или сетевых пакетов, сигнализируя о возможных атаках или эксплуатации уязвимостей.

Процесс загрузки и выполнения eBPF-программ. Источник.
Впрочем, давайте все же добавим ложку дегтя в эту бочку меда. Киберпреступники уже научились применять eBPF для маскировки своей активности и обхода защитных механизмов. Например, вредоносные программы вроде Boopkit, BPFDoor и Symbiote используют eBPF для сокрытия сетевой активности, процессов и даже сбора конфиденциальных данных прямо из ядра. Эти программы способны обходить файерволы и системы обнаружения вторжений, что делает их особенно опасными. Более того, использование eBPF позволяет атакующим оставаться незамеченными, поскольку их действия происходят на уровне ядра, где традиционные инструменты мониторинга часто бессильны.
Но не торопитесь с критикой. eBPF, как и любая технология уровня ядра, — это инструмент, который усиливает как защиту, так и атаки. Его способность интегрироваться в системный стек делает его незаменимым для мониторинга и фильтрации угроз, но та же особенность позволяет злоумышленникам маскировать вредоносную активность.
Это не недостаток eBPF, а плата за его мощь. Точно так же шифрование защищает данные, но может скрывать коммуникации преступников. А открытый код, призванный повысить прозрачность ПО, иногда используется для поиска уязвимостей в злонамеренных целях.
Ключевой момент: eBPF не создает уязвимости «из воздуха» — он лишь расширяет поверхность атаки для тех, кто уже получил привилегии в системе. Именно поэтому его безопасность зависит от строгого контроля доступа (например, BPF Tokens) и постоянного аудита запущенных программ.
Таким образом, eBPF — это двусторонний меч. С одной стороны, технология предоставляет беспрецедентные возможности для защиты систем и выявления угроз. С другой стороны, ее потенциал для атак требует особого внимания к безопасности. Чтобы минимизировать риски, важно ограничивать права на загрузку eBPF-программ, регулярно проверять их поведение и использовать современные механизмы верификации. Только так можно убедиться, что эта мощная технология работает на благо, а не во вред.
Как свести риски к минимуму
На самом деле, все эти советы достаточно известны и вряд ли откроют для кого-то Америку. Скорее, это просто напоминание. Итак.
1. Ограничьте права. Используйте BPF Tokens (доступны с Linux 6.9) для делегирования ограниченных прав непривилегированным процессам и запретите загрузку eBPF-программ пользователям без прав CAP_SYS_ADMIN.
2. Регулярно проверяйте список запущенных eBPF-программ через bpftool prog list. Обращайте внимание на подозрительные программы с незнакомыми хешами или названиями. Требуйте цифровую подпись для всех eBPF-программ, чтобы исключить запуск недоверенного кода.
3. Не забывайте о необходимости мониторинга аномалий. Внедрите инструменты вроде Falco или Cilium, которые используют eBPF для детектирования подозрительных системных вызовов или сетевых атак.
4. Регулярно обновляйтесь. Новые версии Linux добавляют механизмы вроде BPF Arena для изоляции памяти и снижения рисков.
Заключение
Linux десятилетиями был операционной системой, где любое серьезное изменение ядра требовало сложных манипуляций, а мониторинг и безопасность строились на громоздких решениях с высоким оверхедом. eBPF стал эволюционным скачком, предлагая новую концепцию взаимодействия с ядром. Теперь можно внедрять сетевые фильтры, собирать метрики и анализировать системные вызовы в реальном времени без модификации системы и лишней нагрузки. eBPF делает ядро динамическим, позволяя расширять его функциональность без перезагрузок и вмешательства в архитектуру.
Как вы думаете, как eBPF изменит подход к мониторингу и безопасности в ближайшем будущем? Поделитесь своим опытом использования eBPF в реальных проектах в комментариях.