SpamAssassin es un filtro antispam de código abierto que analiza cada mensaje con cientos de reglas (cabeceras, contenido, listas DNS, firmas, filtro bayesiano) y le asigna una puntuación. Si la puntuación supera un umbral, marca el mensaje como spam añadiendo cabeceras que tu servidor o tu cliente de correo pueden usar para moverlo a la carpeta de correo no deseado. En este tutorial instalarás SpamAssassin en Ubuntu 24.04, lo conectarás a Postfix para que analice todo el correo entrante, ajustarás su configuración, lo probarás con el mensaje de prueba GTUBE y entrenarás el filtro bayesiano.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS y Postfix recibiendo correo en el puerto 25, por ejemplo un VPS de CubePath.
  • Un usuario no root con privilegios sudo.
  • Al menos 2 GB de RAM: cada proceso de SpamAssassin ocupa entre 80 y 150 MB.
  • Un buzón de prueba en el servidor, en los ejemplos user@your_domain.

Cómo encaja SpamAssassin con Postfix

SpamAssassin se compone de dos programas: spamd, un demonio que mantiene las reglas cargadas en memoria, y spamc, un cliente ligero que le pasa cada mensaje. En esta guía Postfix entregará todo el correo que llegue por SMTP al puerto 25 a un filtro de contenido que ejecuta spamc; este devuelve el mensaje con las cabeceras de SpamAssassin añadidas y lo reinyecta en Postfix con sendmail para su entrega normal.

El correo que envían tus usuarios autenticados por el puerto 587 (submission) no pasa por el filtro, porque solo se modifica el servicio smtp del puerto 25.

Paso 1: Instalar SpamAssassin

Instala el motor, el demonio y el cliente:

sudo apt update
sudo apt install spamassassin spamd spamc

Activa el demonio y arráncalo:

sudo systemctl enable --now spamd

Comprueba que está en ejecución:

systemctl status spamd --no-pager

La salida debe incluir una línea como esta:

     Active: active (running) since Fri 2026-09-25 10:30:12 UTC; 5s ago

spamd escucha solo en 127.0.0.1 y ::1, en el puerto 783, así que no hace falta abrir nada en el firewall.

Paso 2: Descargar las reglas actualizadas

Las reglas que trae el paquete envejecen rápido. sa-update descarga la versión más reciente publicada por el proyecto:

sudo sa-update -v

El comando termina con código 0 si ha descargado reglas nuevas y con código 1 si ya estaban al día; ambos son correctos. Reinicia el demonio para cargar las reglas:

sudo systemctl restart spamd

El paquete de Ubuntu instala un temporizador de systemd que repite esta actualización a diario. Compruébalo con:

systemctl list-timers 'spamassassin*' --no-pager

Paso 3: Ajustar la configuración

La configuración local vive en /etc/spamassassin/local.cf. Ábrelo:

sudo nano /etc/spamassassin/local.cf

El archivo trae casi todo comentado. Añade al final este bloque:

# Puntuación a partir de la cual un mensaje se considera spam (5.0 por defecto)
required_score 5.0

# Añade una etiqueta al asunto de los mensajes marcados como spam
rewrite_header Subject [SPAM]

# 0 = conserva el mensaje original y solo añade cabeceras X-Spam-*
report_safe 0

# Filtro bayesiano con aprendizaje automático
use_bayes 1
bayes_auto_learn 1

Algunas notas sobre estos valores:

  • required_score 5.0 es un buen punto de partida. Bájalo a 4.0 o 4.5 si se cuela demasiado spam, pero no por debajo de 3.0 o empezarás a marcar correo legítimo.
  • Con report_safe 0 el mensaje original llega intacto. El valor por defecto (1) envuelve el spam en un informe como adjunto, lo que complica recuperar falsos positivos.

Comprueba que la sintaxis es correcta. Si el comando no imprime nada, no hay errores:

sudo spamassassin --lint

Reinicia el demonio para aplicar la configuración:

sudo systemctl restart spamd

Paso 4: Conectar Postfix con SpamAssassin

Define en Postfix el filtro de contenido. Haz una copia de seguridad de master.cf y ábrelo:

sudo cp /etc/postfix/master.cf /etc/postfix/master.cf.bak
sudo nano /etc/postfix/master.cf

Localiza la línea del servicio smtp, la primera del archivo sin comentar, y añade debajo la opción content_filter, con la línea de continuación sangrada con espacios:

smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin

Después añade al final del archivo el servicio que ejecuta spamc:

spamassassin unix -     n       n       -       -       pipe
  user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Qué hace cada parte:

  • user=debian-spamd: ejecuta spamc con el usuario sin privilegios que crea el paquete de SpamAssassin.
  • -f: si spamd no responde, spamc devuelve el mensaje sin analizar en lugar de fallar, así no pierdes correo.
  • -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}: reinyecta el mensaje analizado en Postfix con el remitente y los destinatarios originales. Como entra por sendmail y no por el servicio smtp, no vuelve a pasar por el filtro.

Comprueba la configuración y reinicia Postfix:

sudo postfix check
sudo systemctl restart postfix

Si postfix check no imprime nada, la configuración es válida.

Paso 5: Probar el filtro con GTUBE

GTUBE es una cadena de prueba que SpamAssassin reconoce siempre como spam, igual que el archivo EICAR para los antivirus. Instala swaks, una herramienta para enviar mensajes por SMTP:

sudo apt install swaks

Envía un mensaje con la cadena GTUBE a tu buzón a través del puerto 25 del propio servidor, para que pase por el servicio smtp y, por tanto, por el filtro:

swaks --to user@your_domain --server 127.0.0.1 --header "Subject: Prueba GTUBE" --body 'XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X'

Busca en el registro la línea en la que spamd identifica el mensaje:

sudo grep "spamd: identified spam" /var/log/mail.log | tail -n 1
2026-09-25T10:42:07.113245+00:00 mail spamd[4121]: spamd: identified spam (1000.0/5.0) for debian-spamd:112 in 0.4 seconds, 812 bytes.

Abre el mensaje en el buzón: el asunto empezará por [SPAM] y tendrá cabeceras como estas:

X-Spam-Flag: YES
X-Spam-Level: **************************************************
X-Spam-Status: Yes, score=1000.0 required=5.0 tests=GTUBE,...

Envía ahora un mensaje normal sin la cadena GTUBE y comprueba que llega con X-Spam-Status: No. Esa cabecera confirma que todo el correo entrante pasa por SpamAssassin.

Paso 6: Añadir remitentes a listas de confianza y de bloqueo

Si un remitente legítimo acaba marcado como spam o uno molesto se cuela siempre, añádelo a /etc/spamassassin/local.cf. SpamAssassin 4 usa los nombres welcomelist y blocklist:

# Nunca marcar como spam si además pasa SPF o DKIM
welcomelist_auth [email protected]
welcomelist_auth *@partner.example

# Marcar siempre como spam
blocklist_from *@spam-conocido.example

Usa welcomelist_auth en lugar de welcomelist_from: solo aplica si el mensaje pasa SPF o DKIM para ese remitente, así que un spammer no puede aprovecharla falsificando el From:.

Verifica y aplica los cambios:

sudo spamassassin --lint
sudo systemctl restart spamd

Paso 7: Entrenar el filtro bayesiano

El filtro bayesiano aprende las palabras y patrones del correo que recibe tu servidor y es una de las reglas más efectivas, pero no se activa hasta que ha aprendido al menos 200 mensajes de spam y 200 legítimos (ham). El aprendizaje automático ayuda, pero entrenarlo a mano con tu propio correo acelera mucho el proceso.

Como spamc se ejecuta con el usuario debian-spamd, la base de datos bayesiana está en /var/lib/spamassassin/.spamassassin. Si tus buzones usan el formato Maildir, entrena con una carpeta de spam y con la bandeja de entrada de un buzón (ajusta las rutas a las de tu servidor):

sudo sa-learn --dbpath /var/lib/spamassassin/.spamassassin --spam /home/user/Maildir/.Junk/cur
sudo sa-learn --dbpath /var/lib/spamassassin/.spamassassin --ham /home/user/Maildir/cur
Learned tokens from 212 message(s) (215 message(s) examined)

Como has ejecutado sa-learn con sudo, devuelve la propiedad de la base de datos al usuario del filtro:

sudo chown -R debian-spamd:debian-spamd /var/lib/spamassassin/.spamassassin

Comprueba cuántos mensajes ha aprendido:

sudo -u debian-spamd sa-learn --dump magic | grep -E "nspam|nham"
0.000          0        212          0  non-token data: nspam
0.000          0        347          0  non-token data: nham

Cuando ambos valores superen 200, verás reglas BAYES_* en la cabecera X-Spam-Status de los mensajes nuevos. Repite el entrenamiento de vez en cuando, sobre todo con el spam que se haya colado y con los falsos positivos.

Solución de problemas

Los mensajes llegan sin cabeceras X-Spam-*: el correo no pasa por el filtro. Comprueba que la línea -o content_filter=spamassassin está justo debajo del servicio smtp y empieza por espacios, y que el mensaje entró por el puerto 25 (el correo enviado localmente con mail o sendmail no pasa por ese servicio).

spamd no arranca: consulta el motivo con sudo journalctl -u spamd -n 50 --no-pager. La causa más habitual es un error en local.cf; sudo spamassassin --lint lo señala.

En X-Spam-Status aparece URIBL_BLOCKED: las listas DNS rechazan las consultas que llegan desde resolvedores públicos compartidos. Esas reglas dejan de puntuar y el filtro pierde eficacia. La solución es usar un resolvedor DNS recursivo propio en el servidor en lugar de uno público.

Correo legítimo marcado como spam: mira qué reglas han sumado puntos en su cabecera X-Spam-Status. Si el remitente es de confianza, añádelo con welcomelist_auth; si el problema es general, entrena el mensaje como ham con sa-learn --ham antes de tocar required_score.

Postfix acumula correo en la cola con errores del servicio spamassassin: revisa sudo grep spamassassin /var/log/mail.log | tail. Suele ser una errata en la línea argv= de master.cf; tras corregirla, ejecuta sudo postfix check, reinicia Postfix y reenvía la cola con sudo postqueue -f.

Conclusión

Has instalado SpamAssassin en Ubuntu 24.04, lo has conectado a Postfix como filtro de contenido para todo el correo entrante por SMTP, has ajustado la puntuación y las listas de remitentes, lo has comprobado con GTUBE y has entrenado el filtro bayesiano. A partir de ahora cada mensaje entrante llega con su puntuación de spam en las cabeceras.

Como siguientes pasos puedes:

  • Configurar una regla Sieve en Dovecot que mueva los mensajes con X-Spam-Flag: YES a la carpeta de correo no deseado.
  • Instalar los complementos Razor y Pyzor, que consultan redes colaborativas de firmas de spam.
  • Programar un entrenamiento periódico de sa-learn con la carpeta de spam de tus usuarios.