Inicio › Guías

Monitorización de listas negras: scripts, API y alertas por webhook

Publicado 2026-11-03 / Actualizado 2026-11-03 / Por Yuki Nakazawa

Monitorizar listas negras consiste en consultar periódicamente varias listas de bloqueo DNS (DNSBL) para las IP y los dominios de envío, y lanzar una alerta solo cuando cambia un resultado. Detectar una inclusión en el momento en que se produce, y no cuando los clientes avisan de correos rebotados, deja tiempo para encontrar la causa y solicitar la eliminación antes de que el daño se extienda.

Hay dos formas prácticas de hacerlo: ejecutar uno mismo un pequeño script con dig y cron, o delegar las comprobaciones en un servicio mediante una API y webhooks. En ambos casos, dos detalles deciden si el monitor dice la verdad: las listas como Spamhaus rechazan las consultas enviadas a través de resolvedores públicos, que producen respuestas engañosas, y los códigos de error nunca deben contarse como inclusiones.

Las reglas de los operadores de listas citadas aquí se basan en sus páginas oficiales vigentes en noviembre de 2026. Las políticas cambian, así que conviene confirmarlas antes de fiarse de una configuración. Para entender cómo funcionan las DNSBL, consulte qué es una DNSBL (RBL).

Compruebe gratis si su dominio o dirección IP figura en alguna de unas 345 listas negras.

Qué vigilar y qué listas consultar

Lo primero es anotar los objetos que de verdad hay que vigilar.

El formato de consulta se define en el RFC 5782. En IPv4 se invierten los octetos y se añade la zona de la lista, de modo que 192.0.2.99 en una lista se convierte en 99.2.0.192 seguido del nombre de la zona. En IPv6 la dirección se escribe como 32 nibbles hexadecimales en orden inverso. Un dominio simplemente se antepone a la zona. Una entrada listada devuelve un registro A, por convención dentro de 127.0.0.0/8; una no listada devuelve NXDOMAIN. El RFC señala además que las listas deberían publicar un registro TXT que explique el motivo de la inclusión.

Conviene vigilar varias listas y no solo una, porque no todos los receptores usan las mismas. El significado de cada código de retorno varía según el operador; nuestra guía de códigos de retorno de las DNSBL recoge los más habituales.

Por qué los resolvedores públicos dan respuestas erróneas

Un error habitual en la monitorización casera es enviar las consultas a través de un resolvedor público como Google Public DNS (8.8.8.8) o Cloudflare (1.1.1.1). Las preguntas frecuentes oficiales de Spamhaus sobre el uso de DNSBL explican lo que ocurre:

La principal recomendación de las preguntas frecuentes es usar un resolvedor DNS propio. Para quienes deban seguir con un resolvedor público, Spamhaus remite a su Data Query Service (DQS); conviene revisar sus condiciones para saber qué es gratuito. Las preguntas frecuentes sugieren dig txt whoami.fastly.net para ver qué resolvedor se está usando realmente.

El RFC 5782 añade una comprobación de coherencia integrada: una lista IPv4 debe contener una entrada para 127.0.0.2 y no debe contener 127.0.0.1, y los clientes deberían comprobar periódicamente estas entradas de prueba para confirmar que la lista funciona. En el ejemplo de Spamhaus, 2.0.0.127.zen.spamhaus.org devuelve 127.0.0.10, 127.0.0.4 y 127.0.0.2, mientras que 1.0.0.127.zen.spamhaus.org devuelve NXDOMAIN. Un monitor debería comprobar esto primero y descartar la ejecución si falla.

Opción 1: un script con dig y cron

Este es un script mínimo que comprueba una dirección IPv4 en Spamhaus ZEN y en SpamCop (bl.spamcop.net, que según la documentación de SpamCop responde 127.0.0.2 para una IP listada). Sustituya la dirección y las zonas por las suyas.

#!/bin/sh
# Consultar el resolvedor recursivo propio (p. ej., unbound en el mismo host), nunca uno público
RESOLVER=127.0.0.1
IP=192.0.2.10
ZONES="zen.spamhaus.org bl.spamcop.net"
REV=$(echo "$IP" | awk -F. '{print $4"."$3"."$2"."$1}')

q() {
  out=$(dig +time=3 +tries=1 @"$RESOLVER" "$1" A) || { echo ERR; return; }
  case "$out" in
    *"status: NOERROR"*) a=$(printf '%s\n' "$out" | awk '$4=="A"{print $5}'); echo "${a:-NX}" ;;
    *"status: NXDOMAIN"*) echo NX ;;
    *) echo ERR ;;
  esac
}

for Z in $ZONES; do
  # Si la entrada de prueba 127.0.0.2 no resuelve a un código de inclusión, no fiarse de esta ejecución
  case "$(q "2.0.0.127.$Z")" in
    127.255.255.*|NX|ERR) echo "$Z ERROR test-entry"; continue ;;
    127.*) ;;
    *) echo "$Z ERROR test-entry"; continue ;;
  esac
  A=$(q "$REV.$Z")
  case "$A" in
    NX)            echo "$Z CLEAN" ;;
    ERR)           echo "$Z ERROR no-answer" ;;
    127.255.255.*) echo "$Z ERROR $A" ;;
    127.*)         echo "$Z LISTED $A" ;;
    *)             echo "$Z ERROR unexpected $A" ;;
  esac
done

Qué hace el script:

Después, cron puede comparar cada ejecución con la anterior y enviar correo solo cuando algo haya cambiado:

# Example: run hourly, send mail only when the output differs from the last run
0 * * * * /usr/local/bin/dnsbl-watch.sh > /var/tmp/dnsbl.now 2>&1; cmp -s /var/tmp/dnsbl.now /var/tmp/dnsbl.prev || mail -s "DNSBL status changed" you@example.com < /var/tmp/dnsbl.now; mv /var/tmp/dnsbl.now /var/tmp/dnsbl.prev

El intervalo de una hora es solo un ejemplo. Spamhaus ofrece acceso gratuito para un uso no comercial de bajo volumen, y los clientes que superan su umbral de volumen de consultas necesitan una opción de pago; conviene revisar las condiciones de cada lista a medida que crece el número de IP vigiladas. Las preguntas frecuentes aconsejan además repetir los comandos varias veces para confirmar que los resultados no cambian.

Opción 2: la API por lotes y los webhooks de DNSBL Checker

Si se prefiere no mantener un resolvedor ni reglas de interpretación para cada lista, se puede dejar que un servicio haga las comprobaciones. A continuación se describe la API v1 de este sitio, limitada a lo que hace realmente la implementación del servidor. La referencia está en /en/api-docs y las claves se emiten en la página de miembros, en /account. Para registrarse solo hace falta una dirección de correo, y el inicio de sesión se hace con un enlace enviado por correo.

Autenticación y límites

Comprobaciones por lotes

Envíe un array targets con nombres de dominio o direcciones IP a POST /api/v1/batch:

curl -X POST https://dnsblchecker.com/api/v1/batch \
  -H "X-API-Key: $DNSBL_API_KEY" -H "Content-Type: application/json" \
  -d '{"targets":["example.com"]}'

Si algún destino aún está pendiente de comprobación, la respuesta es 202 con un batch_id. Consulte GET /api/v1/batch/{batch_id} cada pocos segundos hasta que status sea done (ejemplo abreviado; los números y el nombre de la lista son ilustrativos, no un resultado real):

{
  "batch_id": 1, "status": "done", "created": "2026-11-03 09:10:41", "count": 1, "pending": 0,
  "results": [
    {
      "target": "example.com", "type": "domain",
      "status": "done", "verdict": "listed",
      "checked_at": "2026-11-03 09:12",
      "lists_checked": 80, "listed_count": 1, "error_count": 4,
      "listed_on": [
        { "list": "ZapBL RHSBL", "zone": "rhsbl.zapbl.net", "response": "127.0.0.2" }
      ]
    }
  ]
}

Monitorización por webhook

Registre un target y una callback_url con POST /api/v1/monitors. A partir de ahí, cada destino registrado se comprueba una vez al día sin usar la caché (la primera comprobación se hace en el plazo de aproximadamente un día desde el registro), y se envía un POST en JSON a la URL indicada solo en la primera comprobación (monitor.initial) y cuando el veredicto cambia entre listado y limpio (monitor.status_changed).

curl -X POST https://dnsblchecker.com/api/v1/monitors \
  -H "X-API-Key: $DNSBL_API_KEY" -H "Content-Type: application/json" \
  -d '{"target":"example.com","callback_url":"https://your-app.example/hooks/dnsbl"}'
import hmac, hashlib
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
ok = hmac.compare_digest(expected, request.headers.get("X-DNSBL-Signature", ""))

Diseño de alertas: frecuencia, varias listas y falsas alarmas

Un monitor solo es útil si alguien sigue leyendo sus alertas al cabo de unos meses. Uno que salta constantemente acaba ignorado enseguida.

Frecuencia

Varias listas

Falsos positivos y respuestas transitorias

Qué hacer cuando se detecta una inclusión

  1. Confirmarla. Compruebe la página de consulta del propio operador y anote el nombre de la lista, la hora y cualquier motivo que se muestre.
  2. Corregir primero la causa. Busque cuentas comprometidas, formularios web abusados, equipos infectados, mala higiene de las listas y nombres de DNS inverso (PTR) o HELO que no coinciden. Solicitar la eliminación mientras la causa persiste suele llevar a una nueva inclusión.
  3. Seguir el proceso de eliminación de esa lista. La decisión de retirar la inclusión corresponde a cada operador, y presentar una solicitud no garantiza que se levante. Si no se controla la IP, como ocurre en un hosting compartido, hay que contactar con el proveedor de hosting o el ISP.
  4. Dejar que el monitor confirme el resultado. Los receptores también aplican sus propios filtros, así que conviene vigilar la entrega después de que el veredicto vuelva a limpio.

Para una consulta puntual de una IP o un dominio, use el comprobador de listas negras. Si rastrear la causa o gestionar las solicitudes resulta excesivo, puede pedirnos ayuda. Para el proceso completo de diagnóstico cuando el correo rebota, consulte correo bloqueado por listas negras.

Si prefiere no encargarse por su cuenta

Presentamos proveedores que gestionan solicitudes de exclusión, consultoría y asesoramiento (desde JPY 50,000). La exclusión la decide cada operador de la lista y no se puede garantizar.

Solicitar ayuda

Este sitio puede recibir una comisión por recomendación de los proveedores mencionados. About

Preguntas frecuentes

He consultado a través de 8.8.8.8 y no aparece ninguna inclusión. ¿Estoy limpio?

No necesariamente. Las preguntas frecuentes de Spamhaus dicen que las consultas a través de resolvedores abiertos gratuitos como Google Public DNS recibirán en la mayoría de los casos una respuesta de no listado (NXDOMAIN), así que una IP listada puede parecer limpia. Consulte desde un resolvedor propio o use la página de consulta del operador.

He obtenido 127.255.255.254. ¿Significa que estoy listado?

No. Es un código de error que se devuelve a las consultas hechas a través de un resolvedor público o abierto, y Spamhaus indica que no significa que el objeto esté listado. Regístrelo como error y no envíe una alerta de inclusión.

¿Puedo usar simplemente la API por lotes cada día como monitor?

Un lote puede devolver un resultado guardado de hasta 30 días de antigüedad, así que no siempre refleja el estado de hoy. Compruebe checked_at o use la monitorización por webhook (POST /api/v1/monitors), que hace una comprobación nueva cada día.

¿Debo solicitar la eliminación en cuanto salta una alerta?

Primero hay que corregir la causa. Una solicitud hecha mientras el problema persiste suele acabar en una nueva inclusión. La decisión corresponde siempre al operador de la lista.

Páginas oficiales consultadas

Los datos de este artículo se contrastaron con las páginas oficiales que se indican a continuación en el momento de su publicación. Las políticas y el funcionamiento pueden cambiar sin previo aviso, por lo que conviene consultar las páginas oficiales antes de tomar decisiones importantes.

Guías relacionadas

Códigos de retorno DNSBL: 127.0.0.2, 127.255.255.x y NXDOMAIN

Cómo leer códigos de retorno DNSBL: qué significa 127.0.0.2 según el RFC 5782, códigos de Spamhaus, SpamCop y UCEPROTECT, errores y NXDOMAIN o SERVFAIL.

Cómo salir de Spamhaus: exclusión de su IP o dominio

¿Figura en Spamhaus? Vea en qué lista está (ZEN, PBL, XBL, CSS, SBL, DBL), qué significan los códigos de respuesta y cómo pedir la exclusión en cada una.

¿Correo en una lista negra? Cómo leer el rebote y salir de ella

¿Correo bloqueado por una lista negra? Cómo leer el código de rebote, revisar las causas en orden, ver qué listas importan y pedir bien la exclusión.

Todas las guías →