Arquitectura

Cómo encajan el plano de control y el de datos, qué transporta gRPC y cómo llega la política al edge.

8 min de lectura Editar esta página en GitHub

PingWAF se divide en dos procesos que comparten un único binario. El plano de control posee todo el estado; el plano de datos transporta tráfico y aplica políticas. El plano de datos no tiene base de datos propia, ni debe tenerla.

Plano de control

pingwaf server expone tres superficies:

SuperficiePuertoUso
API REST + consola9080 (HTTPS)Sitios, reglas, logs, versiones de configuración
gRPC ControlPlane9090Registro de agentes, heartbeat, sincronización, logs y métricas
PostgreSQL5432Único almacén duradero; Elasticsearch es opcional para logs

La consola se compila en el binario con rust-embed, así que no hay un frontend separado que mantener sincronizado con la API.

Plano de datos

pingwaf agent acepta tráfico en :80 y :443, evalúa reglas WAF, termina TLS y hace proxy a los grupos de origen. Mantiene una caché de reglas en disco bajo cache_dir y reconstruye su proveedor en memoria cuando cambia el hash de esa caché, aproximadamente cada cinco segundos. Las peticiones siempre leen el proveedor actual mediante ArcSwap, así que un cambio de política nunca requiere reinicio.

Contrato gRPC

La fuente única es pingwaf-proto/proto/control_plane.proto, con siete RPC:

RPCTipoUso
RegisterAgentunarioUne el agente a la flota; devuelve agent_id, agent_token, intervalo de heartbeat y configuración inicial
Heartbeatflujo bidireccionalLiveness, estadísticas y estado de certificados; comandos hacia el agente
SyncRulesflujo del servidorNuevos paquetes de reglas tras cada cambio
ShipLogsflujo del clienteLogs de petición y ataque por lotes
ShipCertEventsflujo del clienteEventos de emisión y renovación ACME
ShipMetricsflujo del clienteMétricas de tráfico y caché
GetSiteConfigunarioConfiguración completa de un sitio

El mismo servicio atiende el login de visitantes, passkeys y validación de sesión del flujo de desafíos; esas llamadas se autentican con el token de agente y fallan cerradas si el plano de control no responde.

Cómo llega un cambio al edge

  1. Una escritura REST guarda la configuración en PostgreSQL.
  2. El plano de control registra una instantánea del ámbito afectado.
  3. notify_config_changed empuja un nuevo SiteConfig a cada agente que sirve ese sitio.
  4. El agente persiste el paquete en su caché, el hash cambia y el proveedor se sustituye en memoria.

Comportamiento ante fallos

fail_open decide qué hace un agente sin plano de control: true (por defecto) sigue sirviendo con la última política sincronizada; false devuelve 503 a los hosts sin reglas sincronizadas. La política por sitio prevalece sobre el valor global y se guarda en la configuración.

Modos de ejecución

ModoComandoRol
Plano de controlpingwaf serverAPI, gRPC, consola y base de datos; no hace proxy
Plano de datospingwaf agentConecta al plano remoto y hace proxy en :80/:443
All-in-onepingwaf all-in-oneAmbos en un proceso; el agente usa loopback

PINGWAF_MODE selecciona el mismo modo cuando se omite el subcomando.

Versiones de configuración

Cada cambio se versiona por ámbito, con retención de 50 versiones por ámbito, 30 días y instantáneas de hasta 2 MiB. Un rollback toma un bloqueo de asesoramiento, escribe una instantánea pre-rollback, restaura el estado anterior y registra el resultado como una versión nueva: el rollback es auditable y reversible.