Postfix Spam Filter · 13 min read · Nov 14, 2025

Filtro de Spam de Postfix usando Ubuntu Dapper, MailScanner, SpamAssassin, Razor, Pyzor, DCC y ClamAV - Página 2

2 Configurando Postfix

Necesitamos algunos archivos de ejemplo del código fuente de Postfix, nota que el código fuente que obtenemos aquí es el código fuente original, antes de que sea modificado por los mantenedores de paquetes de Ubuntu/Debian:

cd /usr/local/src  
  
wget http://us.archive.ubuntu.com/ubuntu/pool/main/p/postfix/postfix_2.3.3.orig.tar.gz  
  
tar xzvf postfix_2.3.3.orig.tar.gz

Detener Postfix:

postfix stop

ASEGÚRATE de responder “n” a “¿sobrescribir?” Haz cada sección por separado:

cp -i /usr/share/postfix/main.cf.debian /etc/postfix/main.cf  
  
cp -i /usr/local/src/postfix-2.3.3/conf/* /etc/postfix  
  
cp -i /etc/postfix/header_checks /etc/postfix/body_checks  
  
cp -i /etc/postfix/access /etc/postfix/sender_access

2.1 Editar master.cf

Por cierto, ten cuidado con los dos archivos de configuración de Postfix, ambos ubicados en la carpeta /etc/postfix. ¡Más de un administrador se ha confundido entre master.cf y main.cf!

Primero, haz una copia de seguridad del master.cf actual:

cp /etc/postfix/master.cf /etc/postfix/master.cf-orig

Editar master.cf:

vi /etc/postfix/master.cf

Necesitamos agregar dos elementos debajo del tipo de servicio pickup. El servicio pickup “recoge” el correo local (local significa “en esta máquina”) y lo entrega. Más tarde crearemos un informe diario/semanal que esta caja nos enviará y, dado que el informe contendrá contenidos que clasificarán el informe como spam, esta es una forma de eludir el filtrado de contenido para el correo generado por esta máquina.

Agrega esto justo debajo del tipo de servicio ‘pickup’:

         -o content_filter=
         -o receive_override_options=no_header_body_checks

Debería verse así cuando termines:

pickup    fifo  n       -       -       60      1       pickup
         -o content_filter=
         -o receive_override_options=no_header_body_checks

2.2 Editar main.cf

Este es el archivo de configuración principal para Postfix. Para más información, por favor lee los comentarios en el archivo main.cf, la documentación en /usr/local/src/postfix-2.3.3/README_FILES, o el sitio web de Postfix http://www.postfix.org/documentation.html.

Primero necesitamos hacer una copia de seguridad del archivo main.cf.

cp /etc/postfix/main.cf /etc/postfix/main.cf-orig

Dado que estamos configurando nuestro filtro de spam para reenviar todo su correo a otro servidor, utilizaremos lo que Postfix considera una “clase de dirección de dominio de reenvío”, lo que esencialmente significa que utilizaremos, de los más de 300 parámetros configurables en Postfix, un pequeño grupo de parámetros que mejor sirven a nuestro propósito. Esta clase de dirección se describe aquí: http://www.postfix.org/ADDRESS_CLASS_README.html#relay_domain_class. También estamos actuando como un MX primario para otro servidor, así que por favor lee esta sección apropiada: http://www.postfix.org/STANDARD_CONFIGURATION_README.html#backup.

Es común en Postfix almacenar elementos en tablas de búsqueda. Vamos a usar varias tablas hash para almacenar datos que Postfix utilizará. Una vez que tengamos datos en texto plano en estas tablas, usamos el comando postmap para crear archivos binarios (formato Berkeley DB) que Postfix utilizará para recuperar los datos. Por ejemplo, si tienes un archivo llamado “sampletext” y haces postmap sampletext, se crea un nuevo archivo “sampletext.db”. Postfix recuperará datos de “sampletext.db”, no de “sampletext”. Hay más de una docena de otros tipos de archivos de datos que Postfix puede usar para almacenar datos. Las tablas hash son una opción apropiada para varias tablas que usaremos, y pcre (Expresiones Regulares Compatibles con Perl) es apropiado para un par de tablas que usaremos para contener datos de filtrado de contenido. En su forma más simple, una tabla hash se compone de 2 piezas de datos, una clave y un valor; típicamente referidos como el par clave/valor. La clave y el valor están separados por un espacio en blanco (típicamente un espacio o tabulación). Los datos en una tabla típica que usamos en Postfix se verían algo así:

[email protected] OK
[email protected] OK
[email protected] OK

Lectura sugerida: http://www.postfix.org/DATABASE_README.html.

Usaremos postconf para editar main.cf en lugar de escribir los parámetros en el archivo con vi. Las comillas “” son requeridas como aparece en los cuadros de comandos.

2.2.1 alias_maps

Simplemente necesitamos hacer una corrección a la configuración predeterminada aquí:

postconf -e "alias_maps = hash:/etc/aliases"

Crear el archivo de alias:

newaliases

Verás que ahora hay un archivo aliases.db en el directorio /etc/. Eso es lo que Postfix suele leer. Ahora que tienes un archivo de alias adecuado y porque vamos a configurar nuestro sistema para reenviar todo el correo (no se entregará correo localmente), el archivo de alias será ignorado por Postfix. En su lugar, configuraremos virtual_alias_maps para redirigir direcciones. Otros programas pueden no funcionar correctamente si falta el archivo /etc/aliases, así que no lo elimines.

2.2.2 myorigin

El nombre de dominio del que parece provenir el correo creado en esta máquina. Por ejemplo, si cron envía correo a “ [email protected] “ parecerá provenir de “ [email protected] “.

postconf -e "myorigin = example.com"

Obviamente, en lo anterior, y en todos los siguientes comandos, reemplaza mis parámetros de ejemplo, como “example.com”, con tus propios valores específicos.

2.2.3 myhostname

El nombre de dominio completamente calificado (FQDN) de la máquina que ejecuta el sistema Postfix.

postconf -e "myhostname = sfa.example.com"

2.2.4 mynetworks

Estas son las máquinas en las que confío, y que reenviarán correo para cualquier destino. Generalmente, esto se establece en mi LAN, o solo en una, o algunas servidores de correo internos de confianza. Junto con relay_domains, este es uno importante que debe configurarse correctamente para no correr el riesgo de convertirse en un “reenvío abierto”. En otras palabras, tu máquina podría aceptar y reenviar correo a dominios para los cuales no tiene razón de hacerlo. Ser un reenvío abierto es un problema serio, y puede hacer que te incluyan en listas negras de varios servicios anti-spam de Internet, entre otros problemas. Puedes especificar una sola computadora, múltiples computadoras individuales, o cualquier computadora en una red especificada. También puedes excluir ciertos hosts en tu red precediendo la dirección IP con un signo de exclamación. Si vas a tratar con múltiples servidores de correo internos, y/o quieres permitir que varias máquinas y/o subredes reenvíen a través de este servidor (¡cuidado!), simplemente agrégalas a este parámetro en formato CIDR y separa las redes así:

postconf -e "mynetworks = 127.0.0.0/8, 222.222.222.222/24, 10.10.10.10/24"

Lo anterior permitirá que las máquinas en las redes 222.222.222.222/24, y 10.10.10.10/24 reenvíen correo smtp a través de esta máquina. El 127.0.0.0/8 está ahí para permitir que el servidor local envíe, necesitas al menos poner este. También podrías especificar la dirección IP de una sola computadora. Si solo conoces tu máscara de red decimal con puntos (es decir, 255.255.255.240) y necesitas convertirla a formato CIDR, prueba el http://www.wildpackets.com/products/free_utilities/ipsubnetcalc/overview. (Ingresa una dirección IP en tu red, selecciona la pestaña de información de subred, selecciona tu máscara de subred, tu red es Subnet ID/Mask Bits.) O simplemente echa un vistazo a http://www.belchfire.net/webtools/cidr_conversion_table.html.

Si no tienes ninguna red o computadora que reenvíe a través de este servidor, ejecuta este comando solo con la dirección 127.0.0.0/8.

2.2.5 message_size_limit

Tamaño máximo de correo electrónico que Postfix permitirá en la “puerta de entrada”.

postconf -e "message_size_limit = 10485760"

Lo anterior permite correos electrónicos de hasta 10MB, el valor está en bytes (1010241024). Los correos más grandes que esto pueden ser eludidos por el escáner antivirus (ClamAV). Podrías aumentar esto si también configuras ClamAV para escanear archivos más grandes de 10MB. Si permites mensajes más grandes de 10MB, mantén un ojo en la RAM.

2.2.6 local_transport

Devuelve un mensaje de error para los intentos de entrega local.

postconf -e "local_transport = error:No local mail delivery"

2.2.7 mydestination

Un mydestination vacío le dice a Postfix que esta máquina no es el destino final.

postconf -e "mydestination = "

2.2.8 local_recipient_maps

Un local_recipient_maps vacío le dice a Postfix que no hay buzones locales.

postconf -e "local_recipient_maps = "

2.2.9 virtual_alias_maps

Nuestro filtro de spam debe poder recibir correo para postmaster@yourIP. Se informa que algunas cosas realmente esperan que esta capacidad exista. También permitiremos correo a abuse@yourIP. Dado que no permitimos entrega de correo local, el correo dirigido a la dirección IP de nuestro filtro de spam será rechazado con un mensaje de error. Configurar virtual_alias_maps permite que el correo a estas dos cuentas se reenvíe a una dirección interna. Asegúrate de que tu servidor Exchange esté configurado para recibir mensajes dirigidos a “root”, “postmaster” y “abuse”.

Configura una referencia al archivo virtual:

postconf -e "virtual_alias_maps = hash:/etc/postfix/virtual"

Luego edita el archivo virtual:

vi /etc/postfix/virtual

Agrega estas dos líneas en la parte superior del archivo virtual:

postmaster [email protected]
abuse [email protected]

Guarda y sal del archivo, luego crea el archivo binario que Postfix utilizará:

postmap /etc/postfix/virtual

2.2.10 relayhost

/etc/postfix/relayhost le dice a nuestro filtro de spam cómo se debe enviar el correo electrónico saliente. relayhost contendrá la IP o FQDN del servidor de correo que deseas usar para enviar correo saliente. En otras palabras, correo no local, correo destinado a dominios que no sean el nuestro. No debe confundirse con el archivo /etc/postfix/transport, el transporte se utiliza para enrutar el correo entrante destinado a uno de nuestros dominios locales. Llegaremos al transporte en un momento.

Si relayhost está en blanco, o no está configurado, entonces nuestro filtro de spam se utilizará para ese propósito.

Nota: Los corchetes [] son requeridos en este comando.
postconf -e "relayhost = [mymailserver.example.com]"

Opcionalmente, puedes configurar tu filtro de spam como tu servidor SMTP saliente, pero primero debes tener tu registro DNS inverso en su lugar y, por supuesto, tu registro “A” y registro “MX” para que otros servidores en Internet acepten tu correo. Cuando reconfigures tus clientes y otros servidores SMTP para usar nuestro filtro de spam para su correo saliente, ese correo pasará por el mismo proceso de escaneo que tu correo entrante (a menos que encuentres algunos ajustes ingeniosos para prevenirlo). Si estos aún no están en su lugar, es muy útil configurar temporalmente relayhost con tu servidor de correo saliente actual y funcional.

Además, asegúrate de que el relayhost que designes esté configurado para aceptar correo de esta máquina y QUE esa máquina no esté usando ESTA máquina para SU correo saliente (¿puedes decir “bucle”?).

2.2.11 relay_recipient_maps

Vamos a construir una tabla de cada usuario en cada dominio para el que aceptamos correo. Esta tabla se utilizará para rechazar correo que esté dirigido a usuarios inexistentes en nuestros dominios. NO TE ASUSTES AÚN… En este momento solo vamos a configurar la estructura de la tabla. Si estás usando Exchange, hay HOWTOs disponibles que describen cómo automatizar el proceso de construcción de la tabla relay_recipients. Ha sido muy común últimamente que los spammers lancen ataques de diccionario; enviando miles de mensajes a un dominio usando nombres de usuario fabricados. Nuestro filtro de spam tendría que procesar cada uno de estos a menos que pongas usuarios válidos en la tabla relay_recipients. No subestimes la importancia de esto y asegúrate de que no eres el único en tu organización que sabe cómo hacer cambios en este archivo. Volveremos a automatizar esto después de que tu filtro de spam esté funcional. Si tienes un número manejable de usuarios, ingrésalos manualmente.

Configura una referencia a un archivo que crearemos para almacenar los datos:

postconf -e "relay_recipient_maps = hash:/etc/postfix/relay_recipients"

Luego edita relay_recipients:

vi /etc/postfix/relay_recipients

Por el momento, vamos a aceptar correo para todos los usuarios en nuestros dominios, así que ingresa cada dominio para el que aceptas correo en el siguiente formato:

@example.com OK
@example2.com OK
@example3.com OK

Luego crea el archivo binario que Postfix utilizará:

postmap /etc/postfix/relay_recipients

Las entradas anteriores son temporales. Son comodines que permiten el correo a tus dominios. DEBES eliminar las entradas anteriores en algún momento en el futuro cercano y reemplazarlas con cada una de las direcciones de correo electrónico válidas de tus destinatarios. Cuando estés listo para ingresar cada usuario individualmente en el archivo relay_recipients, primero debes eliminar (o comentar) los datos anteriores que permiten el correo a todos los usuarios en el dominio, y luego listar cada usuario individualmente en la forma:

[email protected] OK
[email protected] OK
[email protected] OK

En realidad, en este archivo particular, el valor “OK” listado después de cada usuario no se utiliza para nada, pero debe haber algo allí porque una tabla hash requiere un valor después de la clave. Ten en cuenta que al eliminar [email protected] de este archivo, puedes evitar que los usuarios de Internet envíen correo a [email protected], pero no hagas esto si algunos de tus propios servidores necesitan usar esta máquina para enviar correo a root. Si usas Exchange, aquí están los HOWTOs. Incluso si no usas Exchange, encontré útil la información sobre transferencias de archivos. http://www2.origogeneris.com:4000/relay_recipients.html - http://www-personal.umich.edu/~malth/gaptuning/postfix/ - http://www.unixwiz.net/techtips/postfix-exchange-users.html - http://postfix.state-of-mind.de/patrick.koetter/mailrelay/ - http://doc.nettools.ru/Unix/Postfix&intserver/

2.2.12 transport_maps

Le dice a Postfix dónde buscar un archivo de transporte. Usamos el archivo de transporte para decirle a Postfix dónde reenviar correo válido para nuestros dominios. Configurar el transporte es similar a configurar relay_recipients.

Crea una referencia a él en main.cf:

postconf -e "transport_maps = hash:/etc/postfix/transport"

Luego edita transport:

vi /etc/postfix/transport

Agrega 1 nueva línea para cada dominio para el cual manejarás correo, similar al ejemplo a continuación. La dirección IP es la de cualquier servidor que sea el destino final de los mensajes dirigidos a nuestros dominios (nuestro servidor Exchange). No importa dónde coloques estos elementos en el archivo, pero me gusta ponerlos en la parte superior.

example1.com smtp:[10.10.10.100]
example2.com smtp:[10.10.10.101]
example3.com smtp:[10.10.10.102]

¡INCLUYE los corchetes en estas líneas!). También puedes usar el nombre de host FQDN en lugar de una dirección IP (es decir, smtp:[exchange1.example.com]).

Ahora para crear el archivo binario que Postfix utilizará:

postmap /etc/postfix/transport

2.2.13 relay_domains

Qué dominios de destino (y subdominios de estos) este sistema reenviará correo. Quieres listar aquí SOLO dominios por los que eres responsable de aceptar correo. Además de permitir que el correo se reenvíe a estos dominios, esta configuración también implica que no reenviamos correo a dominios no listados aquí y, por lo tanto, este es un componente crítico para evitar que el filtro de spam se convierta en un reenvío abierto.

postconf -e "relay_domains = hash:/etc/postfix/relay_domains"

Editar relay_domains:

vi /etc/postfix/relay_domains

Agrega 1 nueva línea para cada dominio para el cual manejarás correo, similar al ejemplo a continuación:

example1.com OK
example2.com OK
example3.com OK

Este archivo actualmente tiene un formato muy similar al de relay_recipients, no confundas los dos. Este archivo no puede tener ‘@’ delante del nombre de dominio. Solo quería mencionarlo, algunas personas muy inteligentes han sido conocidas por haber hecho esto…

Luego crea el archivo binario que Postfix utilizará:

postmap /etc/postfix/relay_domains
NOTA: relay_recipients, relay_domains y transport son archivos con los que te familiarizarás mucho. Cada vez que necesites agregar usuarios a un dominio, agregar un dominio o eliminar un dominio de tu lista, necesitas ir a los tres archivos y editarlos. Después de la edición, ejecuta un postmap en cada uno y reinicia Postfix con 'postfix reload'. En la última página hay una parte de 'Mantenimiento' que contiene un README que se puede copiar a tu filtro de spam como referencia rápida para algunas tareas comunes.

2.2.14 recipient_delimiter

Si tu servidor SMTP/POP3/IMAP actual está configurado para usar extensiones de dirección (por ejemplo [email protected]) entonces recipient_delimiter debe configurarse para coincidir con el delimitador que estás utilizando actualmente para separar el nombre de usuario de la extensión de dirección. Esto no tiene nada que ver con la coma que estás usando para separar a varias personas a las que envías correo ( [email protected], [email protected], [email protected]) usando tu cliente de correo electrónico (MUA). Podrías estar familiarizado con esto si usas GMail. Si tienes una cuenta de GMail, puedes enviar correo a ella en este formato, por ejemplo [email protected] y configurar un filtro en GMail para etiquetar todo con la ‘testtag’ en la dirección a y omitir la bandeja de entrada. Recientemente, un uso común para esta función es usar estas etiquetas cuando te suscribes a cualquier servicio web y luego filtrar según la etiqueta. De todos modos, si lo tienes, lo sabrás; si no tienes idea de lo que estoy hablando, sigue las instrucciones “No uso delimitadores de destinatarios”.

3 Configuraciones típicas - Elige una.

  1. No uso delimitadores de destinatarios:
postconf -e "recipient_delimiter = "
  1. Actualmente uso el signo más:
postconf -e "recipient_delimiter = +"
  1. Actualmente uso el signo menos:
postconf -e "recipient_delimiter = -"

2.2.15 Configuraciones de NAT/Proxy (Opcional)

Si (y solo si) la dirección IP que presentas al mundo no es la dirección IP de tu filtro de spam (estás configurado para funcionar detrás de un firewall NAT o un servidor proxy) adelante y agrega las siguientes dos líneas a main.cf, luego descomenta y configura proxy_interfaces (60.50.40.30 representa la dirección IP pública):

# Especifica tu dirección EXTERNA de NAT/proxy aquí.
#proxy_interfaces = 60.50.40.30
Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.