Red Hat Training

A Red Hat training course is available for RHEL 8

Capítulo 48. Comprender las funciones de red de eBPF en RHEL

El filtro de paquetes Berkeley ampliado (eBPF) es una máquina virtual dentro del núcleo que permite la ejecución de código en el espacio del núcleo. Este código se ejecuta en un entorno de caja de arena restringido con acceso sólo a un conjunto limitado de funciones.

En el ámbito de las redes, se puede utilizar eBPF para complementar o sustituir el procesamiento de paquetes del núcleo. Dependiendo del gancho que utilice, los programas eBPF tienen, por ejemplo:

  • Acceso de lectura y escritura a los datos y metadatos de los paquetes
  • Puede buscar enchufes y rutas
  • Puede establecer las opciones de la toma de corriente
  • Puede redirigir paquetes

48.1. Visión general de las funciones de red de eBPF en RHEL

Puede adjuntar programas de red de Berkeley Paket Filter (eBPF) extendidos a los siguientes ganchos en RHEL:

  • eXpress Data Path (XDP): Proporciona acceso temprano a los paquetes recibidos antes de que la pila de red del núcleo los procese.
  • tc Clasificador eBPF con bandera de acción directa: Proporciona un potente procesamiento de paquetes a la entrada y a la salida.
  • Grupos de control versión 2 (cgroup v2): Permite filtrar y anular las operaciones basadas en sockets realizadas por los programas de un grupo de control.
  • Filtrado de sockets: Permite filtrar los paquetes recibidos de los sockets. Esta función también estaba disponible en el clásico filtro de paquetes de Berkeley (cBPF), pero se ha ampliado para que sea compatible con los programas eBPF.
  • Analizador de flujos: Permite dividir los flujos en mensajes individuales, filtrarlos y redirigirlos a sockets.
  • SO_REUSEPORT selección de socket: Proporciona una selección programable de una toma de corriente receptora de un grupo de tomas de corriente reuseport.
  • Disector de flujo: Permite anular el modo en que el kernel analiza las cabeceras de los paquetes en determinadas situaciones.
  • Llamadas de control de congestión TCP: Permite implementar un algoritmo de control de congestión TCP personalizado.
  • Rutas con encapsulación: Permite crear una encapsulación de túnel personalizada.

Tenga en cuenta que Red Hat no soporta toda la funcionalidad de eBPF que está disponible en RHEL y que se describe aquí. Para más detalles y el estado de soporte de los ganchos individuales, consulte las Notas de la versión de RHEL 8 y la siguiente descripción general.

XDP

Se pueden adjuntar programas del tipo BPF_PROG_TYPE_XDP a una interfaz de red. El núcleo ejecuta entonces el programa en los paquetes recibidos antes de que la pila de red del núcleo comience a procesarlos. Esto permite el reenvío rápido de paquetes en determinadas situaciones, como la caída rápida de paquetes para evitar ataques de denegación de servicio distribuidos (DDoS) y el redireccionamiento rápido de paquetes para escenarios de equilibrio de carga.

También se puede utilizar XDP para diferentes formas de monitorización y muestreo de paquetes. El núcleo permite que los programas XDP modifiquen los paquetes y los pasen para su posterior procesamiento a la pila de red del núcleo.

Están disponibles los siguientes modos de XDP:

  • XDP nativo (controlador): El kernel ejecuta el programa desde el punto más temprano posible durante la recepción del paquete. En este momento, el kernel no ha analizado el paquete y, por lo tanto, no hay metadatos proporcionados por el kernel. Este modo requiere que el controlador de la interfaz de red soporte XDP pero no todos los controladores soportan este modo nativo.
  • XDP genérico: La pila de red del núcleo ejecuta el programa XDP al principio del procesamiento. En ese momento, las estructuras de datos del kernel han sido asignadas y el paquete ha sido preprocesado. Si un paquete debe ser descartado o redirigido, requiere una sobrecarga significativa en comparación con el modo nativo. Sin embargo, el modo genérico no requiere el soporte del controlador de la interfaz de red y funciona con todas las interfaces de red.
  • XDP descargado: El kernel ejecuta el programa XDP en la interfaz de red en lugar de en la CPU del host. Tenga en cuenta que esto requiere un hardware específico y que sólo algunas funciones de eBPF están disponibles en este modo.

En RHEL, cargue todos los programas XDP utilizando la biblioteca libxdp. Esta biblioteca permite el uso controlado por el sistema de XDP.

Nota

Actualmente, existen algunas limitaciones de configuración del sistema para los programas XDP. Por ejemplo, debe desactivar ciertas funciones de descarga de hardware en la interfaz de recepción. Además, no todas las funciones están disponibles con todos los controladores que soportan el modo nativo.

En RHEL 8.3, Red Hat soporta la función XDP sólo si se dan todas las condiciones siguientes:

  • Cargue el programa XDP en una arquitectura AMD o Intel de 64 bits.
  • Se utiliza la biblioteca libxdp para cargar el programa en el kernel.
  • El programa XDP utiliza uno de los siguientes códigos de retorno: XDP_ABORTED, XDP_DROP, o XDP_PASS.
  • El programa XDP no utiliza la descarga de hardware XDP.

Además, Red Hat proporciona el siguiente uso de las características de XDP como Technology Preview no soportado:

  • Carga de programas XDP en arquitecturas distintas de AMD e Intel de 64 bits. Tenga en cuenta que la biblioteca libxdp no está disponible para arquitecturas distintas de AMD e Intel de 64 bits.
  • Los códigos de retorno XDP_TX y XDP_REDIRECT.
  • La descarga de hardware XDP.

AF_XDP

Utilizando un programa XDP que filtre y redirija los paquetes a un determinado socket AF_XDP, puede utilizar uno o más sockets de la familia de protocolos AF_XDP para copiar rápidamente los paquetes del kernel al espacio de usuario.

En RHEL 8.3, Red Hat proporciona esta función como una Muestra de Tecnología no soportada.

Control de tráfico

El subsistema de Control de Tráfico (tc) ofrece los siguientes tipos de programas eBPF:

  • BPF_PROG_TYPE_SCHED_CLS
  • BPF_PROG_TYPE_SCHED_ACT

Estos tipos le permiten escribir clasificadores personalizados de tc y acciones de tc en eBPF. Junto con las partes del ecosistema tc, esto proporciona la capacidad de un potente procesamiento de paquetes y es la parte central de varias soluciones de orquestación de redes de contenedores.

En la mayoría de los casos, sólo se utiliza el clasificador, ya que con la bandera de acción directa, el clasificador eBPF puede ejecutar acciones directamente desde el mismo programa eBPF. La disciplina de colas clsact (qdisc) ha sido diseñada para permitir esto en el lado de entrada.

Tenga en cuenta que el uso de un programa de disector de flujo eBPF puede influir en el funcionamiento de algunos otros clasificadores de qdiscs y tc, como flower.

La función eBPF para tc es totalmente compatible con RHEL 8.2 y posteriores.

Filtro de enchufes

Varias utilidades utilizan o han utilizado el clásico Berkeley Packet Filter (cBPF) para filtrar los paquetes recibidos en un socket. Por ejemplo, la utilidad tcpdump permite al usuario especificar expresiones, que tcpdump traduce en código cBPF.

Como alternativa a cBPF, el kernel permite programas eBPF del tipo BPF_PROG_TYPE_SOCKET_FILTER para el mismo propósito.

En RHEL 8.3, Red Hat proporciona esta función como una Muestra de Tecnología no soportada.

Grupos de control

En RHEL, puede utilizar varios tipos de programas eBPF que puede adjuntar a un cgroup. El kernel ejecuta estos programas cuando un programa en el cgroup dado realiza una operación. Tenga en cuenta que sólo puede utilizar cgroups versión 2.

Los siguientes programas eBPF del cgroup relacionados con la red están disponibles en RHEL:

  • BPF_PROG_TYPE_SOCK_OPS: El kernel llama a este programa durante un TCP connect y permite configurar las operaciones TCP por socket.
  • BPF_PROG_TYPE_CGROUP_SOCK_ADDR: El núcleo llama a este programa durante las operaciones connect, bind, sendto y recvmsg. Este programa permite cambiar las direcciones IP y los puertos.
  • BPF_PROG_TYPE_CGROUP_SOCKOPT: El núcleo llama a este programa durante las operaciones setsockopt y getsockopt y permite cambiar las opciones.
  • BPF_PROG_TYPE_CGROUP_SOCK: El núcleo llama a este programa durante la creación del socket y la vinculación a las direcciones. Puede utilizar estos programas para permitir o denegar la operación, o sólo para inspeccionar la creación de sockets para las estadísticas.
  • BPF_PROG_TYPE_CGROUP_SKB: Este programa filtra los paquetes individuales a la entrada y a la salida, y puede aceptar o rechazar paquetes.
  • BPF_PROG_TYPE_CGROUP_SYSCTL: Este programa permite filtrar el acceso a los controles del sistema (sysctl).

En RHEL 8.3, Red Hat proporciona esta función como una Muestra de Tecnología no soportada.

Analizador de flujos

Un analizador de flujos opera sobre un grupo de sockets que se añaden a un mapa especial de eBPF. El programa eBPF procesa entonces los paquetes que el kernel recibe o envía en esos sockets.

Los siguientes programas eBPF de análisis de flujos están disponibles en RHEL:

  • BPF_PROG_TYPE_SK_SKB: Un programa eBPF analiza los paquetes recibidos del socket en mensajes individuales, y da instrucciones al kernel para que deje esos mensajes o los envíe a otro socket del grupo.
  • BPF_PROG_TYPE_SK_MSG: Este programa filtra los mensajes de salida. Un programa eBPF analiza los paquetes en mensajes individuales y los aprueba o rechaza.

En RHEL 8.3, Red Hat proporciona esta función como una Muestra de Tecnología no soportada.

Selección de socket SO_REUSEPORT

Usando esta opción de socket, puedes enlazar múltiples sockets a la misma dirección IP y puerto. Sin eBPF, el kernel selecciona el socket receptor basándose en un hash de conexión. Con el programa BPF_PROG_TYPE_SK_REUSEPORT, la selección del socket receptor es totalmente programable.

En RHEL 8.3, Red Hat proporciona esta función como una Muestra de Tecnología no soportada.

Disector de flujo

Cuando el núcleo necesita procesar las cabeceras de los paquetes sin pasar por la decodificación completa del protocolo, son dissected. Por ejemplo, esto ocurre en el subsistema tc, en el enrutamiento multitrayectoria, en la vinculación, o cuando se calcula el hash de un paquete. En esta situación el kernel analiza las cabeceras de los paquetes y rellena las estructuras internas con la información de las cabeceras de los paquetes. Puedes reemplazar este análisis interno usando el programa BPF_PROG_TYPE_FLOW_DISSECTOR. Tenga en cuenta que sólo puede analizar TCP y UDP sobre IPv4 e IPv6 en eBPF en RHEL.

En RHEL 8.3, Red Hat proporciona esta función como una Muestra de Tecnología no soportada.

Control de congestión TCP

Puede escribir un algoritmo de control de congestión TCP personalizado utilizando un grupo de programas BPF_PROG_TYPE_STRUCT_OPS que implementan las devoluciones de llamada de struct tcp_congestion_oops. Un algoritmo implementado de esta manera está disponible para el sistema junto con los algoritmos incorporados en el kernel.

En RHEL 8.3, Red Hat proporciona esta función como una Muestra de Tecnología no soportada.

Rutas con encapsulación

Puede adjuntar uno de los siguientes tipos de programa eBPF a las rutas de la tabla de enrutamiento como atributo de encapsulación de túnel:

  • BPF_PROG_TYPE_LWT_IN
  • BPF_PROG_TYPE_LWT_OUT
  • BPF_PROG_TYPE_LWT_XMIT

La funcionalidad de dicho programa eBPF está limitada a configuraciones específicas de túneles y no permite crear una solución genérica de encapsulación o desencapsulación.

En RHEL 8.3, Red Hat proporciona esta función como una Muestra de Tecnología no soportada.