Navigation
Print Share Copy URL
Breadcrumb

eBPF + Rust: Un Nodo Blockchain P2P a Nivel de Kernel

Experimento de programar directamente en el kernel Linux usando eBPF con Rust (Aya framework) y XDP para construir un nodo blockchain P2P con monitoreo de red a nivel de kernel.

[Maximiliano A. Paredes]

eBPF: Programar el Kernel Linux sin Escribir un Driver

eBPF (Extended Berkeley Packet Filter) es una de las tecnologías más revolucionarias del kernel Linux moderno. Permite ejecutar código arbitrario dentro del kernel, de forma segura y verificada, sin necesidad de escribir un módulo de kernel tradicional.

Las aplicaciones son enormes: monitoreo de red de alto rendimiento (como lo hace Cilium), profiling de performance (como lo hace bpftrace), seguridad (como lo hace Falco), y — en este proyecto — un nodo blockchain P2P.

El Proyecto: ebpf-blockchain

La idea es un experimento académico que combina dos tecnologías de bajo nivel:

  • eBPF con el hook XDP (eXpress Data Path) para interceptar paquetes de red a nivel de kernel
  • Rust como lenguaje tanto para el espacio de usuario como para el programa eBPF

XDP: El Hook Más Rápido de Linux

XDP se ejecuta en el driver de red, antes de que el packet suba al stack IP del kernel. Eso significa latencias de nanosegundos y capacidad de procesar millones de paquetes por segundo.

NIC → XDP hook (kernel, eBPF) → Stack IP → Aplicación
  ↑
Aquí ejecuta nuestro código

Stack Tecnológico: Rust a Dos Niveles

La solución completa tiene dos partes en Rust:

1. Programa eBPF (Kernel Space)

Compilado con Rust Nightly target bpfel-unknown-none:

rustup toolchain install nightly
rustup component add rust-src --toolchain nightly
cargo install bpf-linker

2. User Space (Loader + P2P Node)

Compilado con Rust Stable, usando el framework Aya:

# Generar el proyecto con el template de Aya
cargo generate --git https://github.com/aya-rs/aya-template \
  --name ebpf-node \
  -d program_type=xdp \
  -d default_iface=eth0

Infraestructura: LXC para Aislamiento

El entorno de desarrollo usa contenedores LXC para aislar el nodo y evitar comprometer el sistema host (eBPF privilegiado puede hacer cosas peligrosas):

# Montar el directorio de desarrollo en el contenedor
lxc config device add ebpf-blockchain project disk \
  source=/home/maxi/Documentos/source/codecrypto/rust/ebpf-blockchain \
  path=/root/ebpf-blockchain

La configuración del contenedor requiere permisos especiales:

  • security.privileged: "true" — para acceder a la API de eBPF del kernel
  • Montaje de /sys/fs/bpf — para los mapas BPF compartidos entre kernel y user space

Arrancar el Nodo

# Build completo: compila tanto el programa eBPF como el user space
lxc exec ebpf-blockchain -- bash -c \
  "cd /root/ebpf-blockchain/ebpf-node && cargo build"

# Ejecutar con logging de red
lxc exec ebpf-blockchain -- bash -c \
  "RUST_LOG=info ./target/debug/ebpf-node --iface eth0"

Por Qué Esto es Relevante para Blockchain

Las blockchains P2P son, en esencia, sistemas de red intensiva. Los nodos de Ethereum, Bitcoin o Solana pasan la mayor parte del tiempo:

  • Propagando bloques y transacciones entre peers
  • Validando firmas criptográficas
  • Manteniendo estado de la cadena

eBPF + XDP abre la posibilidad de:

  1. Filtrar mensajes de red maliciosos antes de que lleguen al nodo (DDoS mitigation)
  2. Monitorear el tráfico P2P en tiempo real sin overhead de user space
  3. Acelerar validación de paquetes a nivel de hardware

Lecciones de Bajo Nivel

Este proyecto fue el más desafiante del Master. Los aprendizajes clave:

  • Dos toolchains de Rust coexistiendo: Stable para user space, Nightly para el kernel target
  • Verificador de eBPF: El kernel rechaza programas que puedan hacer loop infinito o acceder memoria inválida — el verificador es estricto
  • Mapas BPF: La comunicación entre kernel y user space se hace a través de estructuras de datos compartidas (BPF_MAP_TYPE_HASH, BPF_MAP_TYPE_RINGBUF)
  • LXC vs Docker: Para trabajar con eBPF privilegiado, LXC es más flexible

Código fuente: github.com/87maxi/ebpf-blockchain