Rechercher

Chapitre 46. Comprendre les fonctionnalités de mise en réseau eBPF dans RHEL 9

download PDF

Le filtre de paquets Berkeley étendu (eBPF) est une machine virtuelle intégrée au noyau qui permet l'exécution de code dans l'espace du noyau. Ce code s'exécute dans un environnement restreint (sandbox) qui n'a accès qu'à un ensemble limité de fonctions.

Dans le domaine des réseaux, vous pouvez utiliser eBPF pour compléter ou remplacer le traitement des paquets du noyau. Selon le crochet que vous utilisez, les programmes eBPF ont, par exemple, les caractéristiques suivantes

  • Accès en lecture et en écriture aux données et métadonnées des paquets
  • Peut consulter les sockets et les routes
  • Peut définir les options de la prise
  • Peut rediriger les paquets

46.1. Vue d'ensemble des fonctionnalités de mise en réseau eBPF dans RHEL 9

Vous pouvez attacher des programmes de mise en réseau Berkeley Packet Filter (eBPF) étendus aux crochets suivants dans RHEL :

  • eXpress Data Path (XDP) : Fournit un accès anticipé aux paquets reçus avant que la pile réseau du noyau ne les traite.
  • tc classificateur eBPF avec drapeau d'action directe : Fournit un traitement puissant des paquets à l'entrée et à la sortie.
  • Groupes de contrôle version 2 (cgroup v2) : Permet de filtrer et d'outrepasser les opérations basées sur les sockets effectuées par les programmes d'un groupe de contrôle.
  • Filtrage des sockets : Permet de filtrer les paquets reçus des sockets. Cette fonction était également disponible dans le filtre de paquets Berkeley classique (cBPF), mais elle a été étendue pour prendre en charge les programmes eBPF.
  • Analyseur de flux : Permet de diviser les flux en messages individuels, de les filtrer et de les rediriger vers des sockets.
  • SO_REUSEPORT sélection de la prise : Permet la sélection programmable d'une prise de réception à partir d'un groupe de prises reuseport.
  • Dissecteur de flux : Permet d'outrepasser la manière dont le noyau analyse les en-têtes de paquets dans certaines situations.
  • Rappels de contrôle de congestion TCP : Permet de mettre en œuvre un algorithme de contrôle de congestion TCP personnalisé.
  • Routes avec encapsulation : Permet de créer une encapsulation de tunnel personnalisée.

XDP

Vous pouvez attacher des programmes du type BPF_PROG_TYPE_XDP à une interface réseau. Le noyau exécute alors le programme sur les paquets reçus avant que la pile réseau du noyau ne commence à les traiter. Cela permet une transmission rapide des paquets dans certaines situations, telles que l'abandon rapide de paquets pour prévenir les attaques par déni de service distribué (DDoS) et les redirections rapides de paquets pour les scénarios d'équilibrage de la charge.

Vous pouvez également utiliser XDP pour différentes formes de surveillance et d'échantillonnage des paquets. Le noyau permet aux programmes XDP de modifier les paquets et de les transmettre pour traitement ultérieur à la pile réseau du noyau.

Les modes XDP suivants sont disponibles :

  • XDP natif (pilote) : Le noyau exécute le programme à partir du point le plus précoce possible pendant la réception du paquet. À ce moment, le noyau n'a pas analysé le paquet et, par conséquent, aucune métadonnée fournie par le noyau n'est disponible. Ce mode nécessite que le pilote de l'interface réseau prenne en charge XDP, mais tous les pilotes ne prennent pas en charge ce mode natif.
  • XDP générique : La pile réseau du noyau exécute le programme XDP au début du traitement. À ce moment-là, les structures de données du noyau ont été allouées et le paquet a été prétraité. Si un paquet doit être abandonné ou redirigé, cela nécessite un surcoût important par rapport au mode natif. Cependant, le mode générique ne nécessite pas de pilote d'interface réseau et fonctionne avec toutes les interfaces réseau.
  • XDP déchargé : Le noyau exécute le programme XDP sur l'interface réseau et non sur l'unité centrale de l'hôte. Notez que cela nécessite un matériel spécifique et que seules certaines fonctionnalités de l'eBPF sont disponibles dans ce mode.

Sur RHEL, chargez tous les programmes XDP à l'aide de la bibliothèque libxdp. Cette bibliothèque permet de contrôler l'utilisation de XDP par le système.

Note

Actuellement, il existe certaines limitations de configuration du système pour les programmes XDP. Par exemple, vous devez désactiver certaines fonctions de décharge matérielle sur l'interface de réception. En outre, toutes les fonctionnalités ne sont pas disponibles avec tous les pilotes qui prennent en charge le mode natif.

Dans RHEL 9, Red Hat prend en charge les fonctionnalités XDP uniquement si vous utilisez la bibliothèque libxdp pour charger le programme dans le noyau.

AF_XDP

En utilisant un programme XDP qui filtre et redirige les paquets vers une socket AF_XDP donnée, vous pouvez utiliser une ou plusieurs sockets de la famille de protocoles AF_XDP pour copier rapidement des paquets du noyau vers l'espace utilisateur.

Contrôle du trafic

Le sous-système "Contrôle du trafic" (tc) propose les types de programmes eBPF suivants :

  • BPF_PROG_TYPE_SCHED_CLS
  • BPF_PROG_TYPE_SCHED_ACT

Ces types vous permettent d'écrire des classificateurs tc et des actions tc personnalisés dans eBPF. Avec les éléments de l'écosystème tc, ils permettent un traitement puissant des paquets et sont au cœur de plusieurs solutions d'orchestration de réseaux de conteneurs.

Dans la plupart des cas, seul le classificateur est utilisé, car avec l'indicateur d'action directe, le classificateur eBPF peut exécuter des actions directement à partir du même programme eBPF. La discipline de mise en file d'attente clsact (qdisc) a été conçue pour permettre cela du côté de l'entrée.

Il convient de noter que l'utilisation d'un programme eBPF de dissecteur de flux peut influencer le fonctionnement de certains autres classificateurs qdiscs et tc, tels que flower.

Filtre à douille

Plusieurs utilitaires utilisent ou ont utilisé le filtre de paquets classique de Berkeley (cBPF) pour filtrer les paquets reçus sur une socket. Par exemple, l'utilitaire tcpdump permet à l'utilisateur de spécifier des expressions, que tcpdump traduit ensuite en code cBPF.

Comme alternative au cBPF, le noyau autorise les programmes eBPF du type BPF_PROG_TYPE_SOCKET_FILTER dans le même but.

Groupes de contrôle

Dans RHEL, vous pouvez utiliser plusieurs types de programmes eBPF que vous pouvez attacher à un cgroup. Le noyau exécute ces programmes lorsqu'un programme du cgroup donné effectue une opération. Notez que vous ne pouvez utiliser que les cgroups version 2.

Les programmes cgroup eBPF suivants, liés à la mise en réseau, sont disponibles dans RHEL :

  • BPF_PROG_TYPE_SOCK_OPS: Le noyau appelle ce programme lors de divers événements TCP. Le programme peut ajuster le comportement de la pile TCP du noyau, y compris les options d'en-tête TCP personnalisées, etc.
  • BPF_PROG_TYPE_CGROUP_SOCK_ADDR: Le noyau appelle ce programme pendant les opérations connect, bind, sendto, recvmsg, getpeername, et getsockname. Ce programme permet de modifier les adresses IP et les ports. Ceci est utile lorsque vous implémentez la traduction d'adresse réseau (NAT) basée sur les sockets dans l'eBPF.
  • BPF_PROG_TYPE_CGROUP_SOCKOPT: Le noyau appelle ce programme pendant les opérations setsockopt et getsockopt et permet de modifier les options.
  • BPF_PROG_TYPE_CGROUP_SOCK: Le noyau appelle ce programme lors de la création d'une socket, de la libération d'une socket et de la liaison à des adresses. Vous pouvez utiliser ces programmes pour autoriser ou refuser l'opération, ou seulement pour inspecter la création de la socket pour les statistiques.
  • BPF_PROG_TYPE_CGROUP_SKB: Ce programme filtre les paquets individuels à l'entrée et à la sortie, et peut accepter ou rejeter des paquets.
  • BPF_PROG_TYPE_CGROUP_SYSCTL: Ce programme permet de filtrer l'accès aux contrôles du système (sysctl).

Analyseur de flux

Un analyseur de flux fonctionne sur un groupe de sockets qui sont ajoutés à une carte eBPF spéciale. Le programme eBPF traite ensuite les paquets que le noyau reçoit ou envoie sur ces sockets.

Les programmes eBPF d'analyseur de flux suivants sont disponibles dans RHEL :

  • BPF_PROG_TYPE_SK_SKB: Un programme eBPF analyse les paquets reçus de la socket en messages individuels et demande au noyau d'abandonner ces messages ou de les envoyer à une autre socket du groupe.
  • BPF_PROG_TYPE_SK_MSG: Ce programme filtre les messages de sortie. Un programme eBPF analyse les paquets en messages individuels et les approuve ou les rejette.

Sélection du socket SO_REUSEPORT

Cette option permet de lier plusieurs sockets à la même adresse IP et au même port. Sans eBPF, le noyau sélectionne la socket de réception sur la base d'un hachage de connexion. Avec le programme BPF_PROG_TYPE_SK_REUSEPORT, la sélection de la socket de réception est entièrement programmable.

Dissecteur de flux

Lorsque le noyau doit traiter les en-têtes de paquets sans passer par le décodage complet du protocole, ils sont dissected. Cela se produit par exemple dans le sous-système tc, dans le routage par trajets multiples, dans la liaison ou lors du calcul du hachage d'un paquet. Dans cette situation, le noyau analyse les en-têtes de paquets et remplit les structures internes avec les informations des en-têtes de paquets. Vous pouvez remplacer cette analyse interne à l'aide du programme BPF_PROG_TYPE_FLOW_DISSECTOR. Notez que vous ne pouvez disséquer que TCP et UDP sur IPv4 et IPv6 dans eBPF sous RHEL.

Contrôle de congestion TCP

Vous pouvez écrire un algorithme de contrôle de congestion TCP personnalisé en utilisant un groupe de programmes BPF_PROG_TYPE_STRUCT_OPS qui implémentent les rappels struct tcp_congestion_oops. Un algorithme implémenté de cette manière est disponible pour le système en même temps que les algorithmes intégrés du noyau.

Routes avec encapsulation

Vous pouvez attacher l'un des types de programme eBPF suivants aux itinéraires de la table de routage en tant qu'attribut d'encapsulation du tunnel :

  • BPF_PROG_TYPE_LWT_IN
  • BPF_PROG_TYPE_LWT_OUT
  • BPF_PROG_TYPE_LWT_XMIT

La fonctionnalité d'un tel programme eBPF est limitée à des configurations de tunnel spécifiques et ne permet pas de créer une solution générique d'encapsulation ou de décapsulation.

Recherche de sockets

Pour contourner les limitations de l'appel système bind, utilisez un programme eBPF de type BPF_PROG_TYPE_SK_LOOKUP. Ces programmes peuvent sélectionner un socket d'écoute pour les nouvelles connexions TCP entrantes ou un socket non connecté pour les paquets UDP.

Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.