Postfix puede recibir correo para direcciones que no corresponden a ningún usuario del sistema y para más de un dominio en el mismo servidor. Para ello usa tres mecanismos: los alias locales de /etc/aliases, los alias virtuales, que redirigen direcciones de cualquier dominio a otras direcciones, y los buzones virtuales, que almacenan el correo de dominios adicionales sin crear cuentas de Linux. En este tutorial configurarás los tres en Ubuntu 24.04, junto con una dirección catch-all y las extensiones de dirección, y comprobarás cada cambio con una entrega real.
Requisitos previos
Para seguir esta guía necesitas:
- Un servidor con Ubuntu 24.04 LTS y Postfix instalado como "Internet Site" que ya recibe correo para tu dominio principal, por ejemplo un VPS de CubePath.
- Un usuario no root con privilegios
sudoy un usuario del sistema que recibe correo, en los ejemplosyour_user. - Registros MX de cada dominio adicional apuntando al nombre de tu servidor de correo (
mail.your_domain).
En los ejemplos se usan tres dominios. Sustitúyelos por los tuyos:
| Dominio | Uso en esta guía |
|---|---|
your_domain | Dominio principal, entregado a usuarios del sistema (mydestination). |
example.net | Dominio de alias virtual: todo su correo se reenvía a otras direcciones. |
example.org | Dominio de buzones virtuales: tiene sus propios buzones en el servidor. |
Cómo elige Postfix el tipo de entrega
Postfix decide qué hacer con un mensaje según la lista en la que esté el dominio del destinatario:
| Parámetro | Tipo de dominio | Quién recibe el correo |
|---|---|---|
mydestination | Local | Usuarios de Linux y alias de /etc/aliases. |
virtual_alias_domains | Alias virtual | Solo reenvía a otras direcciones, no tiene buzones propios. |
virtual_mailbox_domains | Buzón virtual | Buzones en disco sin cuenta de sistema. |
Cada dominio debe estar en una sola de estas listas. Aparte, las entradas de virtual_alias_maps se aplican a cualquier dominio, así que también sirven para redirigir direcciones del dominio principal o del de buzones virtuales.
Consulta la configuración actual antes de empezar:
postconf mydestination alias_maps recipient_delimiter
mydestination = $myhostname, your_domain, localhost.localdomain, localhost
alias_maps = hash:/etc/aliases
recipient_delimiter = +
Paso 1: Configurar alias locales
Los alias de /etc/aliases redirigen direcciones de los dominios de mydestination a usuarios del sistema, a otros alias o a direcciones externas. Son la forma más sencilla de crear direcciones como soporte@your_domain sin crear usuarios nuevos.
Abre el archivo:
sudo nano /etc/aliases
Deja los alias del sistema que ya contiene y añade los tuyos. La sintaxis es alias: destino1, destino2:
postmaster: root
root: your_user
abuse: root
soporte: your_user
ventas: your_user, [email protected]
Con esta configuración, el correo de root (incluidos los avisos del sistema) llega a your_user, y ventas@your_domain se entrega a la vez al buzón local y a una dirección externa. Los alias postmaster y abuse deben existir siempre: las normas de correo los exigen y los proveedores los usan para avisarte de problemas.
Postfix no lee el archivo de texto, sino una base de datos generada a partir de él. Regenérala:
sudo newaliases
Comprueba cómo se resuelve un alias:
postalias -q ventas /etc/aliases
your_user, [email protected]
Los cambios en /etc/aliases se aplican en cuanto ejecutas newaliases; no hace falta recargar Postfix.
Paso 2: Crear un dominio de alias virtual
Un dominio de alias virtual es útil cuando un dominio adicional no necesita buzones propios: por ejemplo, una marca secundaria cuyas direcciones deben llegar a los buzones del dominio principal.
Declara el dominio y el archivo donde definirás sus direcciones:
sudo postconf -e 'virtual_alias_domains = example.net'
sudo postconf -e 'virtual_alias_maps = hash:/etc/postfix/virtual'
Crea el archivo de alias virtuales:
sudo nano /etc/postfix/virtual
Cada línea contiene la dirección de entrada y uno o varios destinos separados por comas:
[email protected] your_user@your_domain
[email protected] your_user@your_domain, [email protected]
[email protected] [email protected]
Postfix solo acepta correo para las direcciones que aparecen en el archivo. Cualquier otra dirección de example.net se rechaza durante la conversación SMTP con el error User unknown in virtual alias table, lo que evita que el servidor acepte spam para direcciones inexistentes.
Genera la base de datos y recarga Postfix:
sudo postmap /etc/postfix/virtual
sudo systemctl reload postfix
Comprueba la resolución de una dirección:
postmap -q [email protected] hash:/etc/postfix/virtual
your_user@your_domain
Recuerda ejecutar sudo postmap /etc/postfix/virtual cada vez que edites el archivo. Los cambios en el mapa no requieren recargar Postfix, aunque puede tardar hasta un minuto en usarlos.
Probar la entrega
Instala swaks para enviar mensajes de prueba por SMTP:
sudo apt install swaks
Envía un mensaje a la dirección virtual a través del propio servidor:
swaks --to [email protected] --server 127.0.0.1
Busca la entrega en el registro. La línea con status=sent muestra la dirección final (to=) y la original (orig_to=):
sudo grep "orig_to=<[email protected]>" /var/log/mail.log | tail -n 1
2026-09-25T11:02:31.418552+00:00 mail postfix/local[5120]: 6A1B2C0F12: to=<your_user@your_domain>, orig_to=<[email protected]>, relay=local, delay=0.05, delays=0.03/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)
Notacuando reenvías correo a un proveedor externo, el mensaje sale desde tu IP con el remitente original, y el SPF de ese remitente fallará en el destino. Si reenvías mucho correo a buzones externos, instala
postsrsd, que reescribe el remitente del sobre para que SPF pase.
Paso 3: Añadir una dirección catch-all
Una dirección catch-all recibe el correo de cualquier dirección de un dominio que no tenga una entrada propia. Se define en /etc/postfix/virtual con @dominio como clave:
[email protected] your_user@your_domain
[email protected] your_user@your_domain, [email protected]
[email protected] [email protected]
@example.net your_user@your_domain
Las entradas concretas tienen prioridad, así que [email protected] sigue llegando a [email protected] y todo lo demás a your_user. Regenera el mapa:
sudo postmap /etc/postfix/virtual
Comprueba que la entrada del catch-all está en el mapa:
postmap -q @example.net hash:/etc/postfix/virtual
your_user@your_domain
postmap -q solo busca la clave exacta que le pasas; la búsqueda de @example.net cuando una dirección no tiene entrada propia la hace Postfix al recibir el mensaje. Para comprobar el comportamiento real, envía un mensaje a una dirección inventada:
swaks --to [email protected] --server 127.0.0.1
Debería terminar con 250 2.0.0 Ok: queued y aparecer en el registro con orig_to=<[email protected]>.
Advertenciaun catch-all recibe todo el spam dirigido a direcciones aleatorias de tu dominio (ataques de diccionario). Úsalo solo si lo necesitas de verdad, por ejemplo durante una migración, y prefiere definir las direcciones explícitamente.
Paso 4: Usar extensiones de dirección
Con las extensiones, una dirección como your_user+facturas@your_domain se entrega a your_user@your_domain. Así puedes dar direcciones distintas a cada servicio y filtrar o detectar filtraciones sin crear alias. El separador lo define recipient_delimiter, que en Ubuntu ya viene configurado con +. Compruébalo:
postconf recipient_delimiter
recipient_delimiter = +
Si la salida está vacía, actívalo:
sudo postconf -e 'recipient_delimiter = +'
sudo systemctl reload postfix
Prueba la entrega con una extensión:
swaks --to your_user+prueba@your_domain --server 127.0.0.1
El mensaje llega al buzón de your_user, y la extensión queda visible en la cabecera Delivered-To, que puedes usar en reglas de filtrado. Las extensiones también funcionan con los alias virtuales: [email protected] se entrega como [email protected].
Paso 5: Alojar buzones virtuales para otro dominio
Cuando un dominio adicional necesita buzones propios, independientes de los del dominio principal, lo más limpio es un dominio de buzones virtuales. Todo su correo se guarda con un único usuario del sistema, sin crear una cuenta de Linux por cada buzón.
Crea el usuario y el grupo propietarios de los buzones, con el directorio base /var/mail/vhosts:
sudo groupadd -g 5000 vmail
sudo useradd -u 5000 -g vmail -s /usr/sbin/nologin -d /var/mail/vhosts -m vmail
Configura Postfix para el nuevo dominio:
sudo postconf -e 'virtual_mailbox_domains = example.org'
sudo postconf -e 'virtual_mailbox_base = /var/mail/vhosts'
sudo postconf -e 'virtual_mailbox_maps = hash:/etc/postfix/vmailbox'
sudo postconf -e 'virtual_uid_maps = static:5000'
sudo postconf -e 'virtual_gid_maps = static:5000'
Crea la lista de buzones:
sudo nano /etc/postfix/vmailbox
Cada línea asocia una dirección con una ruta relativa a virtual_mailbox_base. La barra final indica formato Maildir (un archivo por mensaje), que es el que debes usar:
[email protected] example.org/ana/
[email protected] example.org/luis/
Genera la base de datos y recarga Postfix:
sudo postmap /etc/postfix/vmailbox
sudo systemctl reload postfix
Los alias de este dominio se definen en el mismo /etc/postfix/virtual del paso 2. Por ejemplo, para que [email protected] llegue a Ana, añade:
Y regenera ese mapa con sudo postmap /etc/postfix/virtual.
Envía un mensaje de prueba y comprueba que se ha creado el buzón:
swaks --to [email protected] --server 127.0.0.1
sudo ls /var/mail/vhosts/example.org/ana/new
1790334551.V801I2a0f3M912331.mail
Postfix crea automáticamente los directorios del buzón en la primera entrega. Para que Ana lea su correo por IMAP, configura Dovecot con esa misma ubicación (mail_location = maildir:/var/mail/vhosts/%d/%n) y una base de usuarios virtuales con sus contraseñas.
Importantesi defines un catch-all (
@example.org) para un dominio de buzones virtuales, tiene prioridad sobre los buzones. Añade en/etc/postfix/virtualuna entrada que apunte cada buzón a sí mismo ([email protected] [email protected]) antes de la línea del catch-all.
Paso 6: Añadir más dominios
Para añadir un dominio a cualquiera de las listas, indica todos los dominios separados por comas; postconf -e sustituye el valor completo:
sudo postconf -e 'virtual_alias_domains = example.net, example.com'
sudo systemctl reload postfix
Después añade sus direcciones al mapa correspondiente, ejecuta postmap y crea sus registros MX. Revisa la configuración final con:
postconf -n | grep -E "^(mydestination|virtual_)"
Solución de problemas
warning: do not list domain example.net in BOTH mydestination and virtual_alias_domains: el dominio aparece en dos listas. Quítalo de mydestination (o de la otra lista) y recarga Postfix.
Relay access denied al enviar a un dominio adicional: el dominio no está en ninguna de las listas de la tabla anterior, así que Postfix lo trata como un dominio externo. Añádelo a virtual_alias_domains o virtual_mailbox_domains.
User unknown in virtual alias table o in virtual mailbox table: la dirección no está en el mapa, o editaste el archivo y olvidaste ejecutar postmap. Comprueba con postmap -q direccion hash:/etc/postfix/virtual.
error: open database /etc/postfix/virtual.db: No such file or directory: el mapa está declarado en main.cf pero nunca se ha generado. Ejecuta sudo postmap /etc/postfix/virtual.
Los buzones virtuales fallan con permission denied: el directorio base no pertenece al usuario de virtual_uid_maps. Corrige la propiedad con sudo chown -R vmail:vmail /var/mail/vhosts.
Conclusión
Has configurado alias locales con /etc/aliases, un dominio de alias virtual que reenvía su correo, una dirección catch-all, extensiones de dirección y un dominio con buzones virtuales propios, y has comprobado cada caso con una entrega real. Con estos mecanismos, un solo servidor Postfix puede atender el correo de varios dominios sin crear cuentas de sistema para cada dirección.
Como siguientes pasos puedes:
- Configurar Dovecot con usuarios virtuales para dar acceso IMAP a los buzones de
example.org. - Publicar SPF, DKIM y DMARC para cada dominio adicional que envíe correo.
- Añadir SpamAssassin para filtrar el correo que reciben todos los dominios.
