Introduction
Bienvenue dans ce deuxième article qui porte sur la technologie eBPF. Aujourd'hui nous allons vous contextualiser afin de vous permettre de mieux comprendre ce qu'est eBPF en passant par ses origines jusqu'à un résumé sur comment écrire un programme eBPF. Origines
À l'origine, eBPF provient de BPF, aussi appelé cBPF (pour "classical Berkeley Packet Filter"), conçu par UNIX comme un mécanisme de filtrage de paquets réseau, injecté depuis l’espace utilisateur dans le noyau (kernel) d’un système d’exploitation de type UNIX. Cette version est qualifiée de “classique” car elle se limite au filtrage des paquets réseau. Cette avancée technologique permettait d’analyser le trafic réseau sans en effectuer une copie inutile en mémoire, puisque tout était effectué dans la couche du noyau.
En 2013, des ingénieurs ont collaboré pour ajouter de nouvelles fonctionnalités et améliorer les performances de BPF, afin que le programme ne soit plus limité au filtrage de paquets réseau, mais permette également d'effectuer d'autres types de manipulations, comme du monitoring système ou de l’optimisation réseau. Ils ont renommé le mécanisme en eBPF (pour "extended BPF") et ont conservé l’appellation “classical BPF” pour la version initiale, en raison de ses limites dans le nombre de cas d’utilisation.
Comment fonctionne eBPF ?
Un programme eBPF est d’abord écrit en C, puis transformé en bytecode eBPF. Une vérification est effectuée par le vérificateur eBPF pour s’assurer que le programme respecte un ensemble de critères précis, afin d’éviter des modifications indésirables du noyau, comme des arrêts de processus ou des boucles infinies qui pourraient nuire aux performances du système.
Le programme est d’abord transféré de l’espace utilisateur vers l’espace noyau. Le noyau l’exécute ensuite dans un interpréteur eBPF, au sein d’un environnement sandboxé, puis renvoie le résultat vers l’espace utilisateur. L'avantage considérable d’eBPF réside dans sa capacité à charger des programmes dans un espace réservé au sein du noyau sans en modifier le comportement.
Cas d’utilisation de eBPF
À l'origine, eBPF permettait de filtrer et analyser le trafic réseau. Bien qu'il ait été étendu depuis, il conserve toujours cette fonctionnalité. L'avantage d’eBPF est qu’il permet d’ajouter des parseurs de protocoles réseau supplémentaires, ce qui offre la possibilité d’analyser le trafic réseau en fonction de protocoles spécifiques. Cela permet, par exemple, d’extraire et de traiter des informations importantes d'un paquet.
eBPF permet également de suivre les programmes du système UNIX en les attachant à des points de trace, offrant ainsi une visibilité sur l'exécution des différentes applications et du système, et permettant de surveiller leur comportement.
Comment écrire un programme eBPF ?
À l’origine, il était nécessaire d’écrire un programme en assembleur avant de l’envoyer au noyau, qui générait le bytecode BPF. Plus tard, le compilateur Clang, un front-end C, a été utilisé pour compiler le code C directement en bytecode eBPF. Clang permet de travailler avec LLVM, un framework qui offre des outils pour générer du code pour différentes architectures système, telles que x86 ou ARM. Tu peux facilement compiler un programme eBPF avec la commande clang --target=bpf, ce qui indique au compilateur que tu souhaites générer du bytecode eBPF.
Sources
What is eBPF? How it works & Uses Cases | Datalog https://www.datadoghq.com/knowledge-center/ebpf/#what-problems-does-ebpf-solve
eBPF Tutorial by example 1: Hello World, Framework and Developement - eunomia https://eunomia.dev/en/tutorials/1-helloworld/
A thorough introduction to eBPF [LWN.net] https://lwn.net/Articles/740157/
eBPF Explained: Use Cases, Concepts, and Architecture | Tigera - Creator of Calico https://www.tigera.io/learn/guides/ebpf/
Commentaires4
Commentaire
Excellent article qui explique clairement les bases d’eBPF ! Tu pourrais aller encore plus loin en donnant un exemple concret et un cas d’usage dans un environnement réel, comme une entreprise ou une organisation. Cela rendrait la lecture encore plus enrichissante !
Réponse
Merci de ton commentaire, justement je gardais ces cas de figures pour mes prochains articles.
Instructif
Très instructif ton article ! Je ne connaissais pas du tout cet outil. Tu mentionnes qu'une des fonctionnalités d'eBPF est d'analyser le trafic réseau en fonction de différents protocoles et je me demandais s'il est comparable à un outil d'analyse de paquets comme Wireshark.
Réponse
Merci de ton commentaire! En effet comme tu as pu le remarquer c'est comparable à des outils comme wireshark ou encore tcpdump à la différence principale que les paquets réseaux ne sont pas stockés dans l'espace utilisateur mais directement dans le kernel ce qui évite les copies de plus. Ça peut faire une grosse différence en terme de ressource utilisées. J'espère avoir répondu convenablement a ta question.