BPF ksock даёт BPF-программам прямой доступ к сетевым сокетам
В ядре Linux предлагают API BPF ksock: он позволяет BPF-программам создавать сетевые сокеты и отправлять данные напрямую из ядра, минуя отдельный процесс в пользовательском пространстве. Детали описаны в докладе для Linux Plumbers Conference — ежегодной технической конференции разработчиков ядра Linux и системного окружения. Первая версия API предлагает пять функций для работы с UDP-сокетами.
Краткий ответ
BPF ksock — предложенный в докладе на конференции разработчиков ядра API, который даёт BPF-программам возможность напрямую создавать сетевые сокеты и отправлять через них данные, не выходя в пользовательское пространство. Первая версия ограничена пятью kfunc и протоколом UDP, но уже позволяет передавать телеметрию и события безопасности без участия отдельного агента. Поддержка TCP, приёма данных и других операций с сокетами значится в планах авторов.
Зачем BPF-программам свои сокеты
Сегодня BPF-программа обычно не умеет сама открыть сетевое соединение и отправить по нему данные. Для этого нужен отдельный процесс в пользовательском пространстве: он читает события из BPF-карты или кольцевого буфера, упаковывает их и пересылает дальше. Это лишний компонент в цепочке и лишнее копирование данных между ядром и userspace.
BPF ksock убирает это звено для части сценариев. kfunc — это функции ядра, которые можно вызывать прямо из BPF-программы; именно через них авторы и реализовали работу с сокетами. API пока доступен не для всех типов BPF-программ, а для ограниченного набора — это осознанное ограничение первой версии, а не случайный недостаток.
Что умеет первая версия API
Пять kfunc покрывают базовый жизненный цикл UDP-сокета: создание сокета, подключение к удалённому адресу, отправка данных, закрытие соединения и освобождение ресурсов. Этого достаточно, чтобы отправить готовое событие или метрику одним вызовом из BPF-программы, без обращения к userspace-агенту.
Подключение к удалённому адресу означает, что BPF-программа сама решает, куда слать данные — например, на локальный syslog-коллектор или UDP-эндпоинт системы телеметрии. Приём данных через сокет в эту версию не входит: API пока однонаправленный, только на отправку.
Где это пригодится
Один из сценариев, который называют авторы, — события безопасности из BPF LSM (BPF-реализации хуков Linux Security Module). Если пользовательский агент, который обычно собирает такие события, по какой-то причине недоступен или ещё не успел запуститься, BPF-программа сможет отправить событие сама, напрямую по UDP. Второй сценарий — обычная телеметрия: счётчики, метрики, уведомления, которые раньше шли через копирование в userspace и обратно.
Авторы также упоминают более смелые идеи: heartbeat-механизмы, которые живут целиком в ядре, и даже DNS-сервер, реализованный внутри ядра на BPF. Пока это направления для обсуждения, а не готовые реализации.
Почему это важно
BPF ksock решает узкую, но знакомую инженерам observability- и security-команд проблему: лишний процесс в пользовательском пространстве, который должен быть всегда жив, чтобы события не терялись. Если расширение API закрепится в ядре, часть агентов потенциально сможет меньше зависеть от постоянно работающего процесса в userspace — но пока это направление дискуссии на конференции разработчиков, а не согласованный план развития ядра. Направление логично продолжает развитие BPF LSM и других возможностей BPF для безопасности и наблюдаемости.
Что дальше
API пока ограничен UDP и узким набором типов BPF-программ — это предложение, представленное в докладе на LPC, а не готовый к использованию инструмент и не подтверждённый патч, принятый в основную ветку ядра. Платформенным и security-командам, которые следят за BPF LSM и BPF-based observability, стоит держать тему в поле зрения, но не закладывать ksock в текущие планы эксплуатации: поддержка TCP, приёма данных и дополнительных операций с сокетами пока только заявлена.
FAQ
Что такое BPF ksock?
Это предложенный в докладе API ядра Linux, который даёт BPF-программам возможность создавать сетевые сокеты и отправлять через них данные напрямую из ядра, без участия отдельного пользовательского процесса.
Чем это отличается от обычных BPF-программ?
Обычно BPF-программа записывает события в карту или кольцевой буфер, а их читает и пересылает по сети отдельный userspace-агент. BPF ksock позволяет отправить данные сразу из ядра, без этого промежуточного звена.
Какие операции с сокетами уже доступны?
Первая версия API даёт пять kfunc: создание UDP-сокета, подключение к удалённому адресу, отправка данных, закрытие соединения и освобождение ресурсов.
Когда появится поддержка TCP?
Точной даты нет. Авторы называют поддержку TCP, приём данных и дополнительные операции с сокетами направлением дальнейшей работы, но пока это планы, а не готовая реализация.
Как BPF ksock связан с BPF LSM?
BPF LSM — это реализация хуков Linux Security Module через BPF-программы. Один из сценариев для ksock — отправка событий безопасности из таких программ напрямую по сети, даже если пользовательский агент, который обычно их собирает, недоступен.