bpfilter - Filtrado de Paquetes Linux Basado en BPF Hoja de Trucos
bpfilter es un daemon que convierte reglas de firewall familiares en programas BPF optimizados. El problema de larga data que aborda: iptables tiene sintaxis bien entendida pero techo de rendimiento de evaluación de regla secuencial, mientras eBPF/XDP puro es rápido pero requiere escribir y mantener código BPF. bpfilter los une — expresas reglas de forma familiar, y las compila en BPF eficiente adjunto en el hook correcto (incluyendo XDP, que procesa paquetes antes de que entren en la pila de red).
Los cambios de firewall pueden bloquearte de un host remoto. Prueba en un sistema con acceso de consola y mantén una ruta de rollback.
Requerimientos
- Kernel Linux moderno con soporte BPF (6.4+ recomendado)
- Privilegios root (carga programas BPF)
libbpf disponible
Instalación
| Método | Cómo |
|---|
| Desde fuente | git clone https://github.com/facebook/bpfilter && make && sudo make install |
| Paquete distro | Disponible en algunas distribuciones más nuevas |
| Iniciar daemon | sudo bpfilter (o vía systemd) |
| Verificar | bpfilter --version |
Arquitectura
| Pieza | Rol |
|---|
daemon bpfilter | Recibe reglas, genera y carga BPF |
bfcli | CLI nativo para expresar reglas |
| Frontend iptables/nftables | Traducir reglas existentes a bpfilter |
| Programas BPF | El filtro compilado adjunto a un hook |
Hooks de Adjunto
| Hook | Dónde se procesan paquetes |
|---|
| XDP | Lo más temprano — en el driver, antes de la pila (más rápido) |
| TC (control de tráfico) | Después de análisis básico, ingreso/egreso |
| cgroup | Filtrado de socket por cgroup |
| Netfilter | Colocación compatible en la ruta clásica |
Elegir XDP da la mayor ganancia de rendimiento, particularmente para descartar tráfico no deseado (mitigación DDoS), porque paquetes rechazados nunca traversan la pila.
Definiendo Reglas con bfcli
# Ruleset conceptual: drop predeterminado, permitir SSH y tráfico establecido
sudo bfcli ruleset set --from-str '
chain BF_HOOK_XDP policy DROP
rule
ip4.proto tcp
tcp.dport 22
ACCEPT
rule
ip4.saddr 10.0.0.0/8
ACCEPT
'
| Comando | Descripción |
|---|
bfcli ruleset set --from-file F | Cargar reglas de archivo |
bfcli ruleset get | Mostrar ruleset activo |
bfcli ruleset flush | Remover todas las reglas |
bfcli chain set | Gestionar una cadena singular |
Matchers
| Matcher | Coincide |
|---|
ip4.saddr / ip4.daddr | IPv4 origen/destino (CIDR soportado) |
ip6.saddr / ip6.daddr | Direcciones IPv6 |
ip4.proto | Protocolo (tcp, udp, icmp) |
tcp.dport / tcp.sport | Puertos TCP |
udp.dport / udp.sport | Puertos UDP |
tcp.flags | Combinaciones de flags TCP |
meta.ifindex | Interfaz |
Veredictos
| Veredicto | Efecto |
|---|
ACCEPT | Permitir el paquete |
DROP | Descartar silenciosamente |
CONTINUE | Caer a la siguiente regla |
Usando Reglas de iptables Existentes
bpfilter envía frontends de traducción para que puedas mantener herramientas existentes:
# Apuntar el frontend compatible con iptables a bpfilter
sudo iptables-bpfilter -A INPUT -p tcp --dport 22 -j ACCEPT
Este es el camino de migración: mantén tu sintaxis de regla y scripts de gestión, gana ejecución de BPF debajo.
Verificando
| Verificar | Comando |
|---|
| Ruleset activo | sudo bfcli ruleset get |
| Programas BPF cargados | sudo bpftool prog list |
| XDP adjunto | ip link show <iface> |
| Contadores | Contadores de regla en bfcli ruleset get |
| Overhead | sudo bpftop para ver costo de programa |
bpfilter vs Alternativas
| Aspecto | bpfilter | iptables | nftables | XDP/eBPF puro |
|---|
| Rendimiento | Alto (BPF/XDP) | Menor (secuencial) | Mejor que iptables | Más alto |
| Sintaxis | Familiar o bfcli | Familiar | Moderno, unificado | Escribir código BPF |
| Madurez | Más nuevo | Muy maduro | Maduro | Depende de ti |
| Mejor para | Velocidad de BPF con reglas familiares | Compatibilidad legada | Netfilter moderno | Datapaths personalizados |
Inspecciona su costo en tiempo de ejecución con bpftop; compara con iptables para la ruta clásica.
Recursos