Как стать автором
Обновить

Комментарии 18

Как книгоиздатель подтверждаю — тема BPF сейчас на подъёме не только у нас, но и на западе. По этому хотелось бы обратить внимание на нашу книгу «BPF для мониторинга Linux». Мы очень стараемся отслеживать тренды ещё на этапе формирования и готовить для русскоязычных читателей актуальные книги.
Более подробно с книгой можно ознакомиться на сайте издательства.

Ого, нечасто встречаю статьи о чем-то абсолютно новом для себя. И материал сам по себе достаточно полный. Спасибо!

Очень крутая статья, Марко!

Ну и кто захочет посмотреть bcc-tools, убедитесь, что у вас версия kernel-devel соответствует версии-релизу ядра :)
Версия от Cilium имеет те же особенности, что версия от Dropbox. Но она стоит упоминания хотя бы потому, что делается ребятами из проекта Cilium, а значит, обречена на успех.
libbpf-go — это совместная работа Cloudfare и cilium (вот как ее разработка начиналась год назад
A pure Go BPF library), и основная часть кода, скорее, разработана Cloudfare. Но когда они договаривались о сотрудничестве по разработке/поддержке этой библиотеки, cilium настояли, чтобы репозиторий был расположен в их github. И этот маркетинг, похоже, работает :)
Я правильно понимаю, что на BPF можно построить «избирательный VPN».
То есть который будет создавать туннель только для определённого адреса или группы адресов?
Боюсь что я не специалист в VPN, так что сходу не отвечу. VPN чуть более сложная штука, чем файрвол, даже умный файрвол.
Но разве текущие VPN технологии это не позволяют? Роутинг настроить можно.
Понятно. Спасибо за статью.

Почему у меня возник такой вопрос: участвовал несколько дней назад в хакатоне Demhack. Там была одна команда, они делали «VPN для демонстрации выборочного обхода блокировок».

Кстати, спросил у них про BPF. Ответ был ссылкой на их исходинки))
github.com/pokamest/obhod123
Хм, ну, казалось бы, 90% случаев использования vpn — это когда туннель для определенной группы адресов. И это разруливается через обычный ip route без всякого bpf. У меня вот сейчас два разных туннеля поднято (один на работу, другой на личный сервер) и траффик, не назначенный ни туда ни туда еще отдельно ходит.
Или я чего-то не понимаю в Вашем вопросе?
Качественная статья, спасибо!
Блин, зла не хватает. Ну расшифровывайте вы аббревиатуры хотя бы при первом применении! А ещё лучше — давайте определения. Я прочитал три экрана, и так и не понял, о чём вообще идёт речь. BPF то, BPF сё, BPF на пике популярности, в 1994 году появилась первая версия BPF… Всё это хорошо, но к пониманию предмета обсуждения не приближает. Вместо BPF можно было бы подставить любой другой TLA (three-letter acronym), хуже не стало бы. Всё это щедро перемешано с кучей других buzzwords: twitter, efi, k8s, go…
Наконец, в начале четвёртого экрана нашлось хоть что-то: «BPF — это подсистема ядра Linux». Ну наконец-то. Это даёт хоть какой-то контекст.

Короче. The Berkeley Packet Filter (BPF) is a technology used in certain computer operating systems for programs that need to, among other things, analyze network traffic.… Since version 3.18, the Linux kernel includes an extended BPF virtual machine with ten 64-bit registers, termed extended BPF (eBPF). It can be used for non-networking purposes, such as for attaching eBPF programs to various tracepoints. Since kernel version 3.19, eBPF filters can be attached to sockets, and, since kernel version 4.1, to traffic control classifiers for the ingress and egress networking data path.

Интересная технология.


в этом всём, повторюсь, то, что, будучи

А вот столько запятых подряд я ещё никогда не встречал :)

НЛО прилетело и опубликовало эту надпись здесь
Не подскажете, что за шрифты в терминале? Понравились.
Занятная технология. Спасибо за статью!
Интересно, а можно ли программу на eBPF триггерить по ошибке какого-либо системного вызова? Допустим, чтобы она срабатывала когда происходит попытка открыть несуществующий файл. Но до получения userspace приложением кода ошибки. И можно ли из eBPF сделать другой системный вызов, а его результат подставить вместо первого? Опять же, если говорить о файлах, то, допустим, изменить путь и повторить вызов. Т.е. всё вместе примерно вот так:
1. Приложение пытается открыть /abc, делает системный вызов
2. Такого файла нет
3. Срабатывает код на eBPF
4. Код на eBPF меняет путь на /123 и делает новый системный вызов
5. Его результат возвращается в приложение
Для приложения всё выглядит так, как будто первый системный вызов отработал и файл существует.

Нет, в таком общем виде нельзя.


Для ограниченного набора функций (помеченных в исходном коде ядра ALLOW_ERROR_INJECTION) можно делать error injection. А именно, если ваше ядро собрано с CONFIG_BPF_KPROBE_OVERRIDE, то при помощи хелпера bpf_override_return, доступного для программ типа BPF_PROG_TYPE_KPROBE, вы можете патчить возвращаемые значения функций. Но это не позволяет переписать функцию — она даже не будет запущена.


Для переписывания функциональности ядра есть тип программ BPF_PROG_TYPE_STRUCT_OPS, который позволяет на лету переписывать куски ядра, но тоже не в таком общем виде. См. https://lwn.net/Articles/811631/


А какой use case для вашего примера? Почему нельзя это сделать в пространстве пользователя?

Но это не позволяет переписать функцию — она даже не будет запущена.

Мне не то, чтобы переписать сам системный вызов. А просто вызвать его с другим параметром.
Почему нельзя это сделать в пространстве пользователя?

В пространстве пользователя я вижу способ только с LD_PRELOAD, а это не всегда удобно.

Meжду прочим, моя компания занимается защищенными сетями в том числе с использованием eBPF. Я сам ML занимаюсь, но постоянно слышу про eBPF. Если интересно, то есть несколько блог постов про это:
Announcing eBPF Mode GA; A Look at the New Calico eBPF Dataplane; Introducing the Calico eBPF Dataplane. Еще недавно наш CTO написал e-book на эту тему (бесплатную). Если интересно, могу ссылку поискать.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.