eBPF: observabilidad en el kernel sin recompilar
Actualizado: 2026-05-03
eBPF (extended Berkeley Packet Filter) es una de las tecnologías más transformadoras de los últimos años en Linux, y sin embargo sigue siendo desconocida fuera de círculos especializados. Es la base sobre la que se construyen muchas de las herramientas modernas de observabilidad, networking y seguridad — Cilium, Pixie, Falco, Tetragon y otras. Este artículo cubre qué es, por qué importa y dónde lo encontrarás en tu stack, probablemente sin saberlo.
Puntos clave
- eBPF permite cargar programas en el kernel dinámicamente, sin recompilar ni reiniciar, con verificación estática de seguridad.
- Es la base de Cilium, Pixie, Falco, Tetragon y otras herramientas clave del ecosistema Cloud Native.
- Proporciona observabilidad fina con overhead pequeño — una mejora fundamental respecto a herramientas anteriores como SystemTap.
bpftracees el punto de entrada más accesible para explorar eBPF en la práctica.- Las restricciones del verificador (stack de 512 bytes, loops acotados) son intencionales — son lo que hace seguro el modelo.
La idea central
Tradicionalmente, modificar el comportamiento del kernel de Linux requería tres opciones costosas:
- Compilar un módulo y cargarlo (riesgo: un bug produce kernel panic).
- Patchear el kernel y recompilar (impráctico en producción).
- Usar utilidades en userspace que solo veían lo que el kernel exponía (limitado).
eBPF cambia esto. Permite cargar pequeños programas en el kernel que ejecutan en respuesta a eventos (syscalls, paquetes de red, accesos a archivos, cambios de proceso). Estos programas:
- Se cargan dinámicamente — no requieren recompilar ni reiniciar.
- Son verificados estáticamente antes de ejecutarse — el verificador del kernel rechaza programas que pueden colgarlo, acceder a memoria no permitida o iterar sin fin.
- Se ejecutan en una máquina virtual dentro del kernel, con tipos restringidos y stack limitado.
- Son JIT-compilados a código nativo para performance.
El resultado: instrumentas el kernel en tiempo real, con seguridad similar a userspace y rendimiento cercano al código nativo.
Por qué importa
Antes de eBPF, observar qué pasaba dentro del kernel requería herramientas pesadas (SystemTap, DTrace en sus versiones limitadas en Linux) que ralentizaban significativamente el sistema. eBPF cambió esa ecuación: observabilidad fina con overhead pequeño.
Los casos de uso que se abren:
- Tracing de syscalls y procesos sin agente extra ni reinicios.
- Filtrado de paquetes sin pasar por iptables/nftables (mayor performance).
- Visibilidad de tráfico cifrado observando antes y después de la encriptación en el kernel.
- Auditoría de seguridad en runtime con detalles que auditd no captura.
- Profiling de aplicaciones con resolución de stack a nivel de función sin instrumentar el binario.
Esto complementa bien las capas de OpenTelemetry y el stack de observabilidad con Grafana: eBPF aporta la visibilidad del nivel kernel que esas herramientas no alcanzan.
Herramientas construidas sobre eBPF
El ecosistema de productos que dependen de eBPF es notable:
- Cilium[1]: networking de Kubernetes con eBPF en lugar de iptables. Mejor performance y observabilidad (Hubble) en el mismo paquete. Ver el artículo dedicado en cilium-red-ebpf.
- Pixie[2]: observabilidad de Kubernetes que captura HTTP, MySQL, DNS, etc. sin instrumentar las aplicaciones.
- Falco[3]: detección de amenazas en runtime. Originalmente con módulo kernel; migrado a eBPF para mayor compatibilidad.
- Tetragon[4]: enforcement de seguridad runtime con políticas declarativas.
- bcc/bpftrace: librerías y herramientas para escribir programas eBPF de forma más accesible.
- Parca: profiling continuo de bajo overhead de procesos en producción.
Si usas Cilium o Pixie, ya estás usando eBPF aunque no lo sepas.

Un ejemplo con bpftrace
Para ver eBPF en acción, bpftrace es la entrada más simple. Contar syscalls por proceso en una línea:
sudo bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'Este programa se carga en el kernel, se dispara en cada syscall, indexa por nombre de proceso (comm) e incrementa un contador. Imprime resultados al hacer Ctrl-C. Sin tocar el código de las apps, sin reiniciar nada.
Otros one-liners útiles:
- Latencia de
read()por proceso:bpftrace -e 'kprobe:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid]/ { @ns[comm] = hist(nsecs - @start[tid]); delete(@start[tid]); }' - TCP retransmisiones:
bpftrace -e 'tracepoint:tcp:tcp_retransmit_skb { @[comm] = count(); }'
Restricciones que conviene conocer
eBPF no es magia y tiene límites diseñados intencionalmente:
- Verificador estricto. El verificador rechaza programas que considera no seguros aunque funcionarían. A veces hay que reescribir lógica para pasar la verificación.
- Sin recursión libre. Los loops están permitidos en kernels modernos pero con iteraciones acotadas.
- Stack limitado (512 bytes). No puedes crear estructuras grandes en el stack.
- Compatibilidad de kernel. Las features avanzadas requieren kernels relativamente nuevos. RHEL 9, Debian 12 y Ubuntu 22.04 son razonables; RHEL 7 tiene soporte muy limitado.
- Curva de aprendizaje. Escribir eBPF directamente es complejo. La mayoría usa bpftrace o frameworks como bcc.
Cómo empezar
Tres recursos y pasos para profundizar:
- ebpf.io[5] — sitio centralizado con tutorials, ecosistema y referencias.
- Brendan Gregg tiene los mejores recursos públicos sobre tracing y eBPF — su libro BPF Performance Tools (2019) sigue vigente.
- Lab práctico: instala bpftrace en tu Linux, prueba los one-liners de la documentación, luego escribe los tuyos. Para programación seria, aprende Rust o C con el framework libbpf-rs / Aya.
Conclusión
eBPF ha redefinido qué es posible observar y modificar en un sistema Linux moderno. Está debajo de muchas de las herramientas de Kubernetes y observabilidad que ya usas — entender al menos los conceptos te ayuda a elegir entre alternativas y a depurar cuando esas herramientas se comportan de forma inesperada. No tienes que escribir eBPF directamente para beneficiarte, pero saber que está ahí amplía tu repertorio.