Показать статистику
0 голосов
от (2.4тыс. баллов)
Не могу найти хорошую статью по Berkley Packet Filter. Буду признателен за помощь по теме.
507 просмотров 1 ответов

1 Ответ

0 голосов
от (4.6тыс. баллов)
редактировать от

BPF или Berkeley Packet Filters - одно из наиболее удачных инженерных решений линукс ядра, идея которого заключается в наличии виртуальной машины, код в которой может исполняться на уровне ядра изолиорванно от других процессов. Такие утилиты как tcpdump, strace и многие другие используют BPF.

Рассматривая BPF в общих словах, работает технология так: пользователь создает код для архитектуры BPF и далее при помощи системного вызова подключает эту программу к некому генератору событий в ядре. Событиями могут быть входящий сигнал от USB устройства, или пакет приходящий на сетевой интерфейс компьютера. Далее, при возникновении такого события, ядро запускает BPF программу и срабатывает заложенная логика - либо это счетчик событий, либо что то другое - в зависимости от самой программы BPF.

Вот небольшая иллюстрация, взятая отсюда:

Технология BPF довольно старая. С 1997 года в ядре появился поддержка BPF, и продолжительное время BPF была основой libcap - библиотеки, позволяющей захватывать или пересылать сетевые пакеты в заданное устройство или файл. Наиболее известными программами, использующими BPF, являются strace и tcpdump.

В чем же отличие eBPF от BPF ?

Фундаментально, eBPF является тем же BPF. Это небольшая виртуальная машина, которая запускает программы из userspace (пространства пользователя) и прикрепляет их к заданному фильру событий в ядре. Годами такой подход являлся оптимальным - возможность работать с сетевыми пакетами без дорогостоящих операций по переносу данных в пространство пользователя. Однако, время не стоит на месте, и представление о том что могут делать виртуальные машины изменилось. 

Классическая виртуальная машина BPF состояла из 32-разрядного аккумулятора, регистров "X" шириной в 32 разряда, а так же из шестнадцати 32-х битных регистра, задачей которых было взаимодействие с памятью. Такая архитектура имела ряд ограничений:

  • классический BPF ограничен только фильтацией пакетов без сохранения состояния (stateless filtering)
  • иные, более сложные задачи, решались вне BPF

eBPF значительно расширил функциональность BPF путем использования расширенного набора регистров и дополнительных инструкций. Был добавлен функционал key/value хранилища без ограничения по размеру. Стэк стал поддерживать 512 байт, более сложные функции и связвапть события в цепочку. 

Новые функции повлекли за собой некоторые усложнения, в частности возникли иные требования к безопасности. Чтобы обеспечить надлежащее выполнение кода виртуальной машины, верификатор, реализованный в ядре, был переработан. Этот верификатор проверяет наличие любых циклов в коде (которые могут привести к возможным бесконечным циклам, что приводит к зависанию ядра) и любых небезопасных обращений к памяти. Он отклоняет любую программу, не отвечающую критериям безопасности. За этим шагом, выполняемым в действующей системе каждый раз, когда пользователь пытается внедрить программу, следует JIT-код байт-кода BPF в инструкции сборки для выбранной платформы

...