Rspamd es un filtro de spam de alto rendimiento que analiza cada mensaje con cientos de reglas (SPF, DKIM, DMARC, listas DNS, un clasificador bayesiano, heurísticas de contenido) y le asigna una puntuación que decide si se entrega, se marca o se rechaza. Además puede firmar el correo saliente con DKIM, lo que permite prescindir de OpenDKIM. En este tutorial instalarás Rspamd desde su repositorio oficial en Ubuntu 24.04, lo integrarás con un servidor Postfix existente, activarás la firma DKIM y el aprendizaje bayesiano, y añadirás reglas propias.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 1 GB de RAM.
  • Postfix instalado y recibiendo correo para tu dominio your_domain.
  • Un usuario no root con privilegios sudo.
  • Acceso a la zona DNS de your_domain para publicar la clave DKIM.

Si tu servidor ya usa OpenDKIM o SpamAssassin, Rspamd los sustituye. Al final del paso 4 verás cómo retirar OpenDKIM para no firmar dos veces.

Paso 1: Instalar Redis

Rspamd guarda en Redis los datos del clasificador bayesiano, el greylisting, los límites de envío y la caché de resultados. Instala el paquete de Ubuntu:

sudo apt update
sudo apt install redis-server

Por defecto Redis solo escucha en 127.0.0.1, que es lo que necesitas. Comprueba que responde:

redis-cli ping
PONG

Paso 2: Instalar Rspamd desde el repositorio oficial

Ubuntu incluye un paquete rspamd, pero suele ir varias versiones por detrás. El proyecto mantiene un repositorio propio con versiones estables. Instala las herramientas necesarias y añade su clave:

sudo apt install ca-certificates wget gpg lsb-release
sudo install -m 0755 -d /etc/apt/keyrings
wget -qO- https://rspamd.com/apt-stable/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/rspamd.gpg > /dev/null

Añade el repositorio para tu versión de Ubuntu:

echo "deb [signed-by=/etc/apt/keyrings/rspamd.gpg] https://rspamd.com/apt-stable/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rspamd.list

Instala Rspamd:

sudo apt update
sudo apt install --no-install-recommends rspamd

Comprueba que el servicio está en marcha y en qué puertos escucha:

sudo systemctl status rspamd --no-pager
sudo ss -tlnp | grep rspamd
● rspamd.service - rapid spam filtering system
     Active: active (running) since Fri 2026-09-25 10:20:13 UTC; 8s ago
...
LISTEN 0  2048  127.0.0.1:11332  0.0.0.0:*  users:(("rspamd",pid=4121,fd=12),...)
LISTEN 0  2048  127.0.0.1:11333  0.0.0.0:*  users:(("rspamd",pid=4121,fd=13),...)
LISTEN 0  2048  127.0.0.1:11334  0.0.0.0:*  users:(("rspamd",pid=4121,fd=14),...)

Cada puerto corresponde a un proceso: 11332 es el proxy que habla el protocolo milter con Postfix, 11333 el analizador (normal worker) y 11334 el controller, que sirve la interfaz web y recibe las órdenes de aprendizaje.

Paso 3: Configurar Rspamd

Nunca edites los ficheros de /etc/rspamd/ directamente: se sobrescriben al actualizar. Los cambios van en /etc/rspamd/local.d/, cuyos ficheros se combinan con la configuración por defecto.

Indica a Rspamd dónde está Redis:

sudo nano /etc/rspamd/local.d/redis.conf
servers = "127.0.0.1:6379";

Genera un hash para la contraseña de la interfaz web. El comando te pide la contraseña y muestra el hash:

rspamadm pw
Enter passphrase:
$2$qq7wbm9y1t4j5g8k...$u6y9kzb3...

Guarda el hash en la configuración del controller:

sudo nano /etc/rspamd/local.d/worker-controller.inc
password = "$2$qq7wbm9y1t4j5g8k...$u6y9kzb3...";

Confirma que el proxy trabaja en modo milter y analiza los mensajes en el propio servidor:

sudo nano /etc/rspamd/local.d/worker-proxy.inc
milter = yes;
timeout = 120s;
upstream "local" {
  default = yes;
  self_scan = yes;
}

Ajusta los umbrales de puntuación. Con estos valores, un mensaje de 4 puntos o más se retrasa con greylisting, a partir de 6 se entrega con la cabecera de spam y a partir de 15 se rechaza:

sudo nano /etc/rspamd/local.d/actions.conf
greylist = 4;
add_header = 6;
reject = 15;

Por último, pide a Rspamd que añada a cada mensaje cabeceras con su resultado, útiles para depurar y para que el cliente de correo filtre:

sudo nano /etc/rspamd/local.d/milter_headers.conf
use = ["x-spamd-bar", "x-spam-level", "authentication-results"];

Comprueba la sintaxis y reinicia el servicio:

sudo rspamadm configtest
sudo systemctl restart rspamd
syntax OK

Paso 4: Conectar Postfix con Rspamd

Postfix envía cada mensaje al proxy de Rspamd a través del protocolo milter antes de aceptarlo. Añade la configuración con postconf:

sudo postconf -e "smtpd_milters = inet:127.0.0.1:11332"
sudo postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
sudo postconf -e "milter_protocol = 6"
sudo postconf -e "milter_default_action = accept"

smtpd_milters cubre el correo que llega por SMTP y non_smtpd_milters el que se genera en el propio servidor (por ejemplo con sendmail). milter_default_action = accept hace que, si Rspamd no está disponible, Postfix siga entregando el correo sin filtrar en lugar de rechazarlo.

Comprueba la configuración y recarga Postfix:

sudo postconf smtpd_milters non_smtpd_milters
sudo systemctl reload postfix
smtpd_milters = inet:127.0.0.1:11332
non_smtpd_milters = inet:127.0.0.1:11332

Envía un correo a una cuenta de tu servidor desde una cuenta externa y revisa sus cabeceras. Debes ver las que añade Rspamd:

X-Spamd-Bar: /
Authentication-Results: mail.your_domain;
	dkim=pass header.d=gmail.com header.s=20230601 header.b=AbCdEf12;
	spf=pass (mail.your_domain: domain of [email protected] designates 209.85.128.41 as permitted sender) [email protected];
	dmarc=pass (policy=none) header.from=gmail.com

Rspamd comprueba SPF, DKIM y DMARC del correo entrante sin configuración adicional; la cabecera Authentication-Results muestra el resultado.

Paso 5: Firmar el correo saliente con DKIM

Rspamd firma con DKIM los mensajes que envían tus usuarios autenticados y los generados en el propio servidor. Crea el directorio de claves y genera una clave RSA de 2048 bits con el selector mail:

sudo mkdir -p /var/lib/rspamd/dkim
sudo rspamadm dkim_keygen -b 2048 -s mail -d your_domain -k /var/lib/rspamd/dkim/your_domain.mail.key | sudo tee /var/lib/rspamd/dkim/your_domain.mail.pub
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; "
	"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv3n..."
	"...IDAQAB"
) ;

La clave privada solo debe poder leerla el usuario _rspamd, con el que se ejecuta el servicio:

sudo chown -R _rspamd:_rspamd /var/lib/rspamd/dkim
sudo chmod 440 /var/lib/rspamd/dkim/*.key

Indica a Rspamd dónde buscar las claves. Las variables $domain y $selector se sustituyen para cada mensaje, así que el mismo fichero sirve para varios dominios:

sudo nano /etc/rspamd/local.d/dkim_signing.conf
path = "/var/lib/rspamd/dkim/$domain.$selector.key";
selector = "mail";
allow_username_mismatch = true;

allow_username_mismatch = true permite firmar aunque el usuario SMTP no coincida exactamente con la dirección del remitente, algo habitual cuando los usuarios se autentican con un nombre corto.

Reinicia Rspamd:

sudo rspamadm configtest
sudo systemctl restart rspamd

Publica en tu DNS un registro TXT con nombre mail._domainkey y como valor el contenido de las comillas de la salida anterior, unido en una sola cadena (v=DKIM1; k=rsa; p=MIIBIjAN...IDAQAB). Comprueba que resuelve:

dig +short TXT mail._domainkey.your_domain

Envía un correo desde tu servidor a una cuenta de Gmail; en Mostrar original debe aparecer DKIM: 'PASS' con el dominio your_domain.

Paso 6: Entrenar el filtro bayesiano

El clasificador bayesiano aprende a distinguir spam (spam) de correo legítimo (ham) a partir de ejemplos. Rspamd no lo usa hasta que ha aprendido al menos 200 mensajes de cada tipo, así que conviene alimentarlo desde el principio.

Activa el aprendizaje automático, con el que Rspamd aprende como spam los mensajes con puntuación muy alta y como ham los de puntuación muy baja:

sudo nano /etc/rspamd/local.d/classifier-bayes.conf
backend = "redis";
autolearn = true;

Reinicia el servicio:

sudo systemctl restart rspamd

Además, entrénalo con correo real. rspamc acepta ficheros sueltos o directorios completos, como las carpetas de un buzón Maildir. Por ejemplo, si tus usuarios mueven el spam a la carpeta Junk:

sudo rspamc learn_spam /var/mail/vhosts/your_domain/usuario/.Junk/cur/
sudo rspamc learn_ham /var/mail/vhosts/your_domain/usuario/cur/

Ajusta las rutas a la ubicación de los buzones en tu servidor. Comprueba cuántos mensajes ha aprendido:

sudo rspamc stat | grep -A1 BAYES
Statfile: BAYES_SPAM type: redis; length: 0; free blocks: 0; total blocks: 0; free: 0.00%; learned: 245; users: 1; languages: 0
Statfile: BAYES_HAM type: redis; length: 0; free blocks: 0; total blocks: 0; free: 0.00%; learned: 612; users: 1; languages: 0

Si usas Dovecot, puedes automatizar este paso con su plugin imap_sieve para que cada mensaje que un usuario mueve a Junk o saca de ella se envíe a rspamc learn_spam o learn_ham.

Paso 7: Añadir listas blancas y negras propias

El módulo multimap permite crear reglas a partir de listas. Crea dos: una que resta puntos a los dominios de confianza y otra que suma puntos a dominios que no quieres recibir:

sudo nano /etc/rspamd/local.d/multimap.conf
WHITELIST_SENDER_DOMAIN {
  type = "from";
  filter = "email:domain";
  map = "/etc/rspamd/local.d/whitelist_domains.map";
  score = -5.0;
  description = "Dominio remitente de confianza";
}

BLACKLIST_SENDER_DOMAIN {
  type = "from";
  filter = "email:domain";
  map = "/etc/rspamd/local.d/blacklist_domains.map";
  score = 10.0;
  description = "Dominio remitente bloqueado";
}

Los ficheros de mapa contienen un dominio por línea:

sudo nano /etc/rspamd/local.d/whitelist_domains.map
partner-example.com
proveedor-example.es
sudo nano /etc/rspamd/local.d/blacklist_domains.map
spam-example.net

Rspamd vuelve a leer los mapas automáticamente cuando cambian, así que después solo tendrás que editarlos. Tras crear las reglas, valida y reinicia:

sudo rspamadm configtest
sudo systemctl restart rspamd

Las reglas funcionan sobre la dirección From visible, que un atacante puede falsificar. Por eso la lista blanca resta puntos en lugar de aceptar el mensaje directamente: un correo falsificado seguirá penalizado por fallar SPF, DKIM o DMARC.

Paso 8: Revisar los resultados en la interfaz web

El controller escucha solo en 127.0.0.1, así que no está expuesto a Internet. Para abrir la interfaz web desde tu equipo, crea un túnel SSH:

ssh -L 11334:127.0.0.1:11334 your_user@your_server_ip

Con el túnel abierto, visita http://localhost:11334 e introduce la contraseña del paso 3. La pestaña History muestra la puntuación y los símbolos de cada mensaje analizado, y Throughput la proporción de correo por acción. Si ves falsos positivos, pulsa sobre el mensaje para saber qué reglas han sumado puntos.

Solución de problemas

Postfix registra connect to Milter service inet:127.0.0.1:11332: Connection refused. Rspamd no está en marcha, normalmente por un error de configuración. Revisa:

sudo rspamadm configtest
sudo journalctl -u rspamd -n 50 --no-pager

Los mensajes salen sin firma DKIM. Comprueba los permisos de la clave y que el nombre del fichero sigue el patrón dominio.selector.key. En /var/log/rspamd/rspamd.log verás el motivo, por ejemplo que no encuentra la clave o no puede leerla.

El filtro bayesiano no puntúa. Con menos de 200 mensajes aprendidos de spam y otros 200 de ham, el clasificador no se aplica. Revisa los contadores con rspamc stat.

Los mensajes legítimos se retrasan varios minutos. Es el greylisting, que actúa sobre los mensajes con puntuación dudosa. Si te molesta, sube el umbral greylist en actions.conf o desactiva el módulo con enabled = false; en /etc/rspamd/local.d/greylist.conf.

Conclusión

Tu servidor Postfix filtra ahora el correo entrante con Rspamd, verifica SPF, DKIM y DMARC, firma el saliente con DKIM y aprende de tu propio correo con el clasificador bayesiano. Como siguientes pasos, automatiza el aprendizaje desde Dovecot con imap_sieve, revisa el historial de la interfaz web durante las primeras semanas para afinar los umbrales y publica una política DMARC para tu dominio.