В состав ядра 4.18 одобрено включение нового пакетного фильтра bpfilter

В ветку linux-next, на основе которой формируется начинка будущего ядра Linux 4.18, приняты патчи c реализацией нового пакетного фильтра bpfilter, который развивается командой проекта NetFilter и в отдалённой перспективе может вытеснить ныне предлагаемые инструменты фильтрации пакетов nftables и iptables.

В рамках проекта bpfilter предпринята попытка создания компромиссного решения, использующего средства фильтрации на основе предоставляемой ядром подсистемы eBPF, предлагая при этом привычный синтаксис iptables. Bpfilter обрабатывает запросы API iptables и транслирует их в программы BPF, привязываемые к различным подсистемам. Например, при помощи XDP (eXpress Data Path) можно запустить BPF-программу на уровне сетевого драйвера, с возможностью прямого доступа к DMA-буферу пакетов для высокопроизводительной обработки.

Так как bpfilter предоставляет на уровне ядра API iptables, штатные утилиты iptables можно пересобрать для работы поверх bpfilter и обеспечить полную совместимость с наборами правил iptables, т.е. bpfilter сможет выступить в роли прозрачной замены iptables, полностью совместимой со всеми существующими конфигурациями (администраторам не придётся изучать новый синтаксис правил). Трансляция правил выполняется целиком в пространстве пользователя, что упрощает отладку и повышает безопасность. Для повышения производительности применяется JIT-компиляция BPF в машинные инструкции и задействование аппаратных механизмов выполнения BPF на уровне сетевого адаптера (например, Netronome NFP SmartNIC).

Основным мотивом создания bpfilter стала недооценённость проекта nftables и появление в ядре подсистемы eBPF, которая может заменить специальную виртуальную машину, применяемую в nftables для выполнения скомпилированных в байткод обработчиков. Чтобы не поддерживать две разные виртуальные машины, выполняющие сходные задачи, и для достижения более высокой производительности и защищённости у разработчиков возникла идея построения пакетного фильтра на основе штатного BPF-движка ядра Linux. Синтаксис правил nftables кардинально отличается от iptables и это привело к трудностям при продвижении и низкой востребованности среди администраторов, которые продолжают использовать iptables, несмотря на все достоинства nftables.

Кроме набора примитивов для фильтрации сетевых пакетов bpfilter также предлагает новый тип модулей ядра umh (usermode helper), которые выполняются в пространстве пользователя и привязываются в базовым модулям (umh-модули содержат вспомогательные функции, например в модуле bpfilter.ko через них выполняется разбор и трансляция в BPF правил фильтрации). Модули umh функционируют под управлением ядра, оформляются в виде модулей ядра и загружаются через modprobe, но выполняются в пространстве пользователя с привилегиями пользовательских приложений.

Взаимодействие umh-обработчиков с обычными модулями ядра производится с использованием неименованных каналов (unix pipe), что позволяет абстрагироваться от протокола взаимодействия. Вынос операций разбора правил в пространство пользователя позволяет исключить из ядра потенциально опасный код, повысив общую безопасность системы. В перспективе рассматривается возможность применения umh-модулей за пределами bpfilter, например, для создания драйверов для устройств с интерфейсом USB.

Дополнительно, можно отметить публикацию компанией Facebook под лицензией GPLv2 кода балансировщика нагрузки Katran, работающего на транспортном уровне (L4) и используемого на серверах первичного распределения нагрузки, образующих общую сеть распределения нагрузки по датацентрам. Замена традиционного IPVS в балансировщике нагрузки Facebook на решение на базе BPF и XDP позволила поднять производительность в 10 раз.

Правила для распределения трафика компилируются в программы BPF, которые выполняются во встроенном в ядро Linux интерпретаторе байткода eBPF, позволяющем создавать обработчики сетевых операций, контролировать доступ и отслеживать работу систем, в том числе BPF-программы могут применяться для низкоуровневой обработки входящих/исходящих пакетов и принятия решений о перенаправлении пакетов. Для дополнительной оптимизации задействована инфраструктура XDP (eXpress Data Path), которая предоставляет средства для запуска BPF-программ на уровне сетевого драйвера, что позволяет создавать высокопроизводительные обработчики для работы в условиях большой сетевой нагрузки.

Источник: OpenNET