¿Qué es XDP (Express Data Path) en Linux

XDP (o Express Data Path) es una utilidad de red disponible en el núcleo de Linux. XDP se utiliza en muchas empresas populares para resolver algunos problemas de red graves que enfrentan al manejar millones de solicitudes por segundo. Este es un programa de código abierto con licencia MIT fusionado en el núcleo de Linux a partir de la versión 4.8.
XDP es un procesador de paquetes de datos de red programable y de alto rendimiento. Nació para mitigar algunos problemas graves del lado del servidor, como los ataques DDoS (Denegación de Servicio Distribuida) o como equilibrador de carga.
Tabla de Contenidos
- Necesidad de XDP
- Por qué XDP es muy rápido
- Conectar la pila de red con XDP
- Tipos de operación que realiza XDP
- XDP y eBPF
- Casos de uso comunes de XDP y eBPF
- Preguntas Frecuentes
También lee: 5 Consejos Útiles al Compilar tu Propio Núcleo de Linux
Necesidad de XDP
La necesidad de una ruta de datos de red de alto rendimiento es siempre una característica requerida para los servidores Linux. Pero la programabilidad de esas rutas de datos también debe estar presente para que los desarrolladores puedan crear algo utilizable a partir de ella. Aunque XDP tiene una curva de aprendizaje bastante empinada, debido al reciente desarrollo de muchas herramientas y marcos, escribir código XDP es bastante accesible hoy en día.
La gran ventaja de XDP es su velocidad. La funcionalidad principal de XDP es que los desarrolladores pueden construir nuevas funcionalidades para filtrar paquetes sin modificar el núcleo en sí.
Existen algunos escenarios en los que algunos paquetes no necesitan recorrer toda la pila de red solo para decidir si se deben reenviar o descartar. Esto debería hacerse en la primera capa de la pila de red colocando algunos filtros. Estos filtros deben programarse de tal manera que puedan reconocer fácilmente un paquete malicioso y descartarlo justo al principio de la pila. Esto puede ahorrar mucha potencia de procesamiento y tiempo.
Con XDP, esta filtración es posible justo al frente de la pila de red.
Ahora, usando XDP, el desarrollador puede filtrar cualquier paquete que pueda ser enviado por un hacker para realizar un ataque DDoS. Esto puede reducir una gran parte de la sobrecarga en la pila de red del núcleo normal. Esta función fue demostrada recientemente por Cloudflare en su demostración de protección contra DDoS.

Algunas características notables de XDP son las siguientes:
- No requiere hardware especializado: XDP puede ejecutarse en cualquier hardware que le proporciones. Sí, la velocidad puede verse comprometida si no tienes el dispositivo optimizado o sus controladores, pero para propósitos de prueba, no necesitas hardware especializado.
- No requiere omisión del núcleo: XDP se ejecuta antes de que el paquete llegue a la pila de red del núcleo. Se activa una función de retorno de llamada cuando se recibe un paquete y XDP lo procesa lo más rápido posible.
- No reemplaza la pila TCP/IP: XDP está presente en el nivel más bajo de la pila de red. Cuando pasa el paquete, este luego ingresa a la pila de red del núcleo normal, que incluye la pila TCP/IP.
- Trabaja en conjunto con TCP/IP y todas las características de BPF (Berkeley Packet Filter): XDP no reemplaza nada. Incluso utiliza eBPF para procesar paquetes y facilitar al desarrollador la escritura de código.
También lee: Cómo Construir e Instalar un Núcleo Personalizado en Ubuntu
Por qué XDP es muy rápido
XDP es una ruta de datos de red programable y de alto rendimiento basada en eBPF en el núcleo de Linux. La ganancia de rendimiento de XDP se debe al procesamiento de paquetes en metal desnudo en el nivel más bajo de la pila de software. Esto significa que el paquete de datos que proviene de la red impacta primero en XDP antes de cualquier otro proceso del núcleo.
Por lo tanto, los ingenieros pueden programar XDP para optimizarlo para varios casos de uso. Desde protección contra DDoS hasta equilibradores de carga.
XDP se carga directamente en la pila de red. Cuando un paquete es recibido por la pila de red, obtiene una llamada de retorno y procesa los paquetes lo más rápido posible. XDP puede descartar 26 millones de paquetes por segundo por núcleo en hardware estándar.
La razón principal por la que XDP es muy rápido es que se permite al usuario leer o hacer cambios directamente en los datos del paquete de red y tomar decisiones sobre cómo manejar el paquete en una etapa anterior. Esto requiere una sobrecarga de proceso muy baja y resulta en una mejor velocidad.
Conectar la Pila de Red con XDP
Puedes conectarte a la red con XDP por varios medios, pero aquí menciono algunos métodos populares.
- XDP Genérico: En este proceso, XDP se carga en el núcleo, pero obtiene muy poco beneficio de rendimiento. Esta es la forma más fácil de ejecutar un programa XDP sin ningún soporte del hardware.
- XDP Nativo: XDP Nativo se carga por el propio controlador de red. Requiere el soporte del controlador de la tarjeta de red.
También lee: Cómo Arreglar el Error de Datos del Núcleo en Windows
Tipos de Operación que Realiza XDP
Algunas de las operaciones que XDP puede realizar una vez que un paquete es recibido por la interfaz de red son:
- XDP_DROP: Descartar los paquetes y no procesarlos. Usando un programa eBPF para analizar el patrón de tráfico y puede descartar paquetes en tiempo real.
- XDP_PASS: Reenviar los paquetes a la pila de red para su posterior procesamiento. Puede modificar el contenido del paquete antes de que ocurra.
- XDP_ABORTED: Descartar el paquete de datos de la red, dejando una excepción de punto de rastreo.
- XDP_TX: Reenviar los paquetes a la misma interfaz de red que los recibe. Los paquetes pueden ser modificados o no.
- XDP_REDIRECT: Redirigir el paquete a otro NIC (controlador de interfaz de red).

XDP y eBPF
eBPF es la versión extendida de Berkeley Packet Filter. Es como una máquina virtual abstraída corriendo dentro del núcleo de Linux. eBPF se utiliza para ejecutar un programa definido por el usuario dentro de un entorno de sandbox en el núcleo de Linux. Generalmente, se utiliza para ejecutar herramientas de red y monitoreo en servidores Linux para garantizar un rendimiento óptimo.
XDP es un marco utilizado para escribir procesamiento de paquetes de muy alta velocidad en aplicaciones BPF. Para hacerlo aún más rápido, XDP ejecuta BPF inmediatamente después de que un paquete es recibido por la pila de red.
XDP tiene una curva de aprendizaje muy pronunciada. Por lo tanto, los desarrolladores están creando herramientas y marcos para facilitar la programación utilizando eBPF. Esto lo hace muy fácil para escribir código para el procesamiento de redes de muy alta frecuencia utilizando XDP y eBPF. La ventaja principal de XDP es que no requiere que modifiques el núcleo, lo que era un gran dolor de cabeza para los ingenieros.
Pero como se suele decir, un gran poder conlleva una gran responsabilidad. Dado que XDP ejecuta eBPF tan pronto como sea posible antes de que los paquetes sean analizados por el núcleo, los programas eBPF tienen que hacer todo el análisis ellos mismos y no pueden depender del núcleo para hacer algo por ellos.
Como programador, la mayor parte de tu tiempo lo pasas trabajando en la terminal. Esta es una guía para decorar tu prompt de terminal. No dejes de revisarla.
También lee: Cómo Degradar el Núcleo en Linux
Casos de Uso Comunes de XDP y eBPF
- Ataques DDoS: El caso de uso principal de XDP es la protección contra DDoS (Denegación de Servicio Distribuida). Durante un ataque DDoS, el atacante intenta utilizar tantos recursos del servidor como sea posible, sin dejar ningún proceso para el usuario final. Usando XDP como la capa muy rápida de la pila de red, no hay costo de procesamiento asociado para descartar un paquete de datos de red. Después de la filtración de XDP, el paquete pasa por todos los otros métodos de filtrado que proporciona el núcleo de Linux.
- Equilibrador de carga: XDP también se utiliza como un equilibrador de carga para manejar una cantidad enorme de tráfico hacia el servidor. Incluyendo a Facebook, muchas grandes empresas tecnológicas utilizan esta tecnología. Anteriormente, los ingenieros utilizaban un servidor dedicado como equilibrador de carga. Esto es muy difícil de gestionar y debe funcionar muy bien para servir a millones de clientes. Pero imagina utilizar la capa XDP como un equilibrador de carga sin un servidor central, como resultado, sin un único punto de falla.
- Cortafuegos: XDP con eBPF puede ser utilizado para escribir diversas reglas de cortafuegos para proteger el sistema con una sobrecarga mínima.
También lee: Cómo Usar el Comando Rm en Linux
Preguntas Frecuentes
¿Qué es BCC en eBPF?
BCC se basa en eBPF. Es un conjunto de herramientas o marco para programas de seguimiento y manipulación del núcleo que viene con una interfaz de línea de comandos muy útil. BCC ayuda a escribir instrucciones de núcleo en C. También incluye un envoltorio alrededor de LLVM.
¿Qué es libBPF?
LibBPF es un conjunto alternativo de herramientas para hacer una aplicación BPF. Está escrito en el lenguaje de programación C.