sgcWebSockets 2026.6 — Detección de bots en el Firewall

· Componentes

“¿Puedo identificar bots por IP?” es una de las preguntas más frecuentes que recibimos sobre el filtrado del lado del servidor. La respuesta sincera es: la IP por sí sola es un punto de partida, no un veredicto — pero combinada con unas pocas señales bien elegidas se convierte en uno fiable. sgcWebSockets 2026.6 añade un nuevo módulo de Detección de bots al componente TsgcWebSocketFirewall que hace exactamente eso, clasificando cada IP que se conecta mediante cuatro señales independientes.

La Detección de bots se sitúa junto a las funciones del firewall que ya conoces — lista negra / lista blanca, GeoIP, fuerza bruta, limitación de velocidad, puntuación de amenazas — y sigue el mismo diseño basado en propiedades de componente. Este artículo explica cómo funciona y cómo configurarlo.

Cuatro señales, una clasificación

El módulo evalúa cada IP frente a cuatro señales independientes y resuelve un único valor TsgcBotClassification:

El resultado es uno de seis valores:

TsgcBotClassification = (bcUnknown, bcVerifiedCrawler, bcDatacenter,
  bcSuspectedBot, bcBlocklisted, bcHuman);

La detección basada solo en IP tiene limitaciones reales — las direcciones se comparten detrás de CGNAT, rotan y los bots sofisticados se ocultan dentro de grupos de proxies residenciales. Por eso la Detección de bots está concebida para darte una buena puntuación de primera pasada, no una verdad absoluta. Y por eso mismo, por diseño, nunca bloquea una conexión por sí sola.

Activar la Detección de bots

Todo reside bajo la nueva propiedad BotDetection. Activa las señales que quieras y apunta las basadas en archivo a sus datos:

uses
  sgcWebSocket_Server_Firewall;

var
  oFirewall: TsgcWebSocketFirewall;
begin
  oFirewall := TsgcWebSocketFirewall.Create(nil);

  oFirewall.BotDetection.Enabled := True;

  // 1. Verified crawler IP ranges  (file lines: CIDR,botname)
  oFirewall.BotDetection.KnownBotsFile := 'C:\firewall\known-bots.csv';

  // 2. Datacenter / hosting ranges  (file lines: CIDR,asn-name)
  oFirewall.BotDetection.Datacenter.Enabled := True;
  oFirewall.BotDetection.Datacenter.ASNFile := 'C:\firewall\datacenter-ranges.csv';

  // 3. Forward-confirmed reverse DNS verification
  oFirewall.BotDetection.ReverseDNS.Enabled := True;

  // 4. DNSBL reputation lookups
  oFirewall.BotDetection.DNSBL.Enabled := True;
  oFirewall.BotDetection.DNSBL.Zones.Add('zen.spamhaus.org');

  // Resolution tuning
  oFirewall.BotDetection.CacheDurationSec := 3600;   // cache a verdict for 1h
  oFirewall.BotDetection.DNSTimeoutMS     := 2000;

  oServer.Firewall := oFirewall;
end;

Las dos señales basadas en archivo reutilizan el mismo motor CIDR rápido y con búsqueda binaria que impulsa la base de datos GeoIP del firewall, de modo que incluso las listas de rangos grandes se resuelven en microsegundos.

Reverse DNS y DNSBL nunca bloquean el hilo de aceptación

Reverse DNS y DNSBL son consultas DNS en vivo — ejecutarlas en línea en el hilo de aceptación de conexiones sería una denegación de servicio autoinfligida. En su lugar, la Detección de bots las resuelve en un hilo de trabajo en segundo plano y sirve cada clasificación desde una caché. En caso de fallo de caché, la IP se pone en cola para su resolución y la llamada actual devuelve bcUnknown de inmediato; cuando la consulta termina, la caché se actualiza y se dispara el evento OnBotDetected. La propiedad CacheDurationSec controla durante cuánto tiempo se reutiliza un veredicto antes de volver a comprobar la IP.

Solo clasificación: OnBotDetected

La Detección de bots es solo de clasificación. Nunca deniega una conexión por sí misma — dispara un evento, actualiza las estadísticas del firewall (un nuevo contador fvBot) y deja la decisión de política en tus manos. Así se evita que un rastreador verificado mal clasificado sea descartado silenciosamente.

procedure TForm1.FirewallBotDetected(Sender: TObject; const aIP: string;
  aClassification: TsgcBotClassification; const aBotName: string);
begin
  case aClassification of
    bcVerifiedCrawler:
      DoLog(aIP + ' is a verified crawler: ' + aBotName);
    bcDatacenter:
      DoLog(aIP + ' originates from a datacenter / hosting range');
    bcBlocklisted:
      DoLog(aIP + ' is listed on a DNSBL');
  end;
end;

También puedes solicitar un veredicto en cualquier momento con GetBotClassification — útil para adaptar una respuesta en lugar de filtrar una conexión:

if oFirewall.GetBotClassification(vClientIP) = bcVerifiedCrawler then
  // serve a lightweight, cache-friendly variant to the crawler
  ServeStaticSnapshot
else
  ServeFullApp;

Actuar sobre un veredicto: el motor de Reglas personalizadas

Cuando quieres bloquear, lo activas explícitamente a través del motor de Reglas personalizadas existente del firewall. Cada TsgcFirewallRuleItem incorpora una nueva propiedad BotType: configúrala y la regla coincidirá con las conexiones cuya clasificación sea igual a ese valor. Luego puedes denegarlas, vetarlas o registrarlas — reutilizando toda la maquinaria de reglas que ya tienes.

var
  oRule: TsgcFirewallRuleItem;
begin
  oFirewall.CustomRules.Enabled := True;

  // Ban any IP listed on a DNSBL for one hour
  oRule := oFirewall.CustomRules.Rules.Add as TsgcFirewallRuleItem;
  oRule.Name           := 'ban-blocklisted-bots';
  oRule.BotType        := bcBlocklisted;
  oRule.ActionType     := raBan;
  oRule.BanDurationSec := 3600;
end;

Esta separación — clasificación pasiva en el módulo de Detección de bots, aplicación activa solo a través de una regla que tú escribes — significa que la función nunca puede sorprenderte bloqueando tráfico que querías conservar.

Aporta tu propio veredicto: OnResolveBot

Si ya ejecutas un servicio de inteligencia de amenazas, una caché de reputación interna o un feed comercial de mitigación de bots, asigna el evento OnResolveBot. Cuando está establecido, tu manejador proporciona el veredicto y los pasos del resolvedor integrado se hacen a un lado — el mismo patrón de sustitución que el firewall ya usa para el OnResolveCountry de GeoIP.

procedure TForm1.FirewallResolveBot(Sender: TObject; const aIP: string;
  var aClassification: TsgcBotClassification; var aBotName: string);
begin
  // Consult your own threat feed instead of the built-in resolver
  if MyThreatFeed.IsMaliciousBot(aIP) then
  begin
    aClassification := bcBlocklisted;
    aBotName        := 'internal-threat-feed';
  end;
end;

Demo

La demo Firewall en Demos\04.WebSocket_Other_Samples\13.Firewall tiene una nueva pestaña Bot Detection donde puedes activar cada señal, cargar los archivos de rangos de bots conocidos y de centros de datos, configurar las zonas DNSBL y usar un comprobador en vivo “Classify IP” para ver el veredicto de cualquier dirección — con cada clasificación transmitida al registro de eventos.

Disponibilidad

La Detección de bots se incluye en sgcWebSockets 2026.6 y es una incorporación lista para usar: la propiedad BotDetection está desactivada por defecto, de modo que los proyectos existentes no se ven afectados hasta que la actives. La función está disponible para Delphi (7 a 13), C++Builder y la edición .NET.

Los clientes con una suscripción activa pueden descargar la nueva compilación desde el área de clientes. Los usuarios de prueba pueden obtener el instalador actualizado en esegece.com/products/websockets/download.

¿Preguntas, comentarios o ayuda con la migración? Ponte en contacto — recibirás una respuesta de las personas que escribieron el código.