BLOG | OFICINA DEL CTO

eBPF: Todo es cuestión de observabilidad

Miniatura de James Hendergart
James Hendergart
Publicado el 14 de junio de 2022


De vez en cuando, una tecnología novedosa alcanza un punto de inflexión en el que las necesidades comerciales reales se cruzan con los puntos fuertes de esa tecnología. Esto hace que la tecnología no sólo sea plausible sino también práctica. Berkeley Packet Filter (BPF) llegó recientemente a este punto entre los desarrolladores de Linux. BPF es un punto de intercepción y procesamiento extremadamente eficiente en un host Linux que promete expandirse a servidores Windows más pronto que tarde. La gama de datos disponibles es amplia y se suma directamente a la visibilidad total para las tareas de operaciones de ingeniería de confiabilidad del sitio (SRE). También se alinea naturalmente con la solución de desafíos relacionados con la seguridad y la gestión del tráfico. La gama de ganchos es igualmente amplia y proporciona una atractiva variedad de puntos de activación útiles para aplicações BPF que atraen a especialistas en observabilidad, seguridad y redes. BPF es la tecnología adecuada para permitir la observabilidad sin gastar una fortuna. Y todo comienza con la observabilidad.

El diseño fundamental de BPF lo convierte en un método lo más eficiente posible para el trabajo computacional ($ por vatio). Mejor aún, las cadenas de herramientas producen el código de bytes para que usted pueda concentrarse en el resultado deseado y no en la programación de bajo nivel en lenguaje ensamblador. ¿Cómo? Estas dos características de diseño hacen que BPF destaque:

Diseño de conjunto de instrucciones

El diseño del software de BPF se modeló deliberadamente según el de las arquitecturas de CPU modernas emergentes. De hecho, se utiliza la terminología de procesador porque describe con precisión los elementos y el uso de BPF. BPF tiene registros e instrucciones. Están diseñados para el consumo directo por parte de las CPU. BPF, basado en el diseño de filtro de paquetes BSD (1992), es una máquina de filtro de captura de paquetes rediseñada que se adapta mejor a las arquitecturas de CPU basadas en registros actuales. Este diseño recibió un impulso natural en 2014 cuando se lanzó “Enhanced Berkeley Packet Filter” o eBPF en la versión 3.18 del kernel de Linux. eBPF fue una distinción importante del Classic Berkeley Packet Filter (cBPF) en los primeros días después de su lanzamiento. Hoy en día la distinción es menos crucial dado que todas las versiones compatibles del kernel contienen las mejoras de 2014. Cabe destacar: Registros más amplios (de 32 bits a 64 bits significa que se realiza más trabajo por línea de caché/ciclo de reloj), más registros (de 2 a 10 significa más mapeo 1 a 1 entre los registros de CPU modernos y las ABI del kernel) y un puñado de mejoras adicionales en el conjunto de instrucciones que hacen que los programas BPF sean más seguros y útiles.

Capa de enlace

BPF consta de una toma de red y un filtro de paquetes. El toque funciona en la capa de enlace de datos a medida que los paquetes salen del cable hacia una interfaz de red determinada. Copia paquetes para que el filtro los interrogue. Este punto de inserción le proporciona visibilidad completa de la ruta de red del host Linux. Para el tráfico de ingreso, esto significa antes de que el procesador del host comience a trabajar en él, y para el tráfico de salida, significa justo antes de que llegue al cable para salir del host. Este diagrama muestra cómo BPF intersecta la ruta del paquete de ingreso en la capa de enlace de datos .

Ruta de entrada

La gama de datos disponibles es amplia y aumenta directamente la visibilidad total para las tareas de operaciones de SRE. En este ejemplo, nos centramos en algunos de los campos más utilizados del encabezado IPv4 .

Ruta de entrada

Utilizando estos datos, se pueden definir políticas para personalizar el filtrado de paquetes. Los siguientes filtros de políticas para paquetes TCP destinados a una dirección IP de destino específica.

Ruta de entrada

Aprovechar eBPF para la observabilidad tiene un beneficio BOGO (compre uno, llévese otro): Los datos observados se pueden utilizar para otros fines además de la observación. Por ejemplo, el enrutamiento del tráfico o la seguridad.

Volviendo al conjunto de datos que compartimos anteriormente, partes de ese conjunto de datos utilizadas para observar la ruta de ingreso de tráfico de un host Linux son útiles para otras cosas. Por ejemplo, la IP de origen, la IP de destino, el host de destino y el puerto son útiles tanto para enrutar el tráfico de ingreso como para limitar el acceso.

Independientemente del uso, todo comienza con la copia del paquete por parte del grifo BPF. Una vez que se toma la copia, los datos se pueden colocar en la memoria (ver más en BPF Maps ) y luego exportarse como un flujo de telemetría y también pueden aprovecharse simultáneamente por otros programas BPF que especifican políticas y acciones de filtrado. Aquí es donde se produce la transición desde la observabilidad a la gestión del tráfico y la seguridad. Para aprovechar la extrema eficiencia del BPF, el punto de partida es una imagen clara de qué datos se necesitan y cómo se utilizan. En la próxima publicación de esta serie, mi colega, Muhammad Waseem Sarwar, explorará opciones para la programación BPF en varias ubicaciones en la pila de red Linux.