A continuación te enseño a instalar un servidor de correo electrónico usando Postfix, Dovecoy y MariaDB/MySQL. Un servidor de correo propio puede ser una herramienta ideal para el desarrollo de muchas aplicaciones de alto nivel.
Preparación e Instalación del Servidor de Correo
En esta lección, vamos a configurar un servidor de correo usando Postfix, Dovecot, y MariaDB (o MySQL), adicionalmente, aunque opcional se instalará SpamAssassin y RoundCube. Esta lección fue probada en Ubuntu Server y Debian 10.
Para esta lección lo más importante es agregar dominios virtuales, usuarios y alias en MySQL y futuramente crear un sistema con base en esto, puede ser CakePHP o algún otro lenguaje que nos permita administrar nuestro servidor fácilmente.
Requisitos
Antes de realizar y configurar, es necesario que nuestro servidor tenga lo siguiente:
- Un dominio. Para el ejemplo se usará dominio.com
- MySQL instalado y configurado.
- Un usuario con privilegios de root.
- Opcional: certificado SSL.
Iniciaremos como root para homologar la instalación de paquetes como usuario root, así los siguientes comandos para Ubuntu o para Debian.
En Ubuntu
sudo su
En Debian
su
Introduce la contraseña de tu usuario (Ubuntu) o usuario root (Debian). Una vez que tengas éxito, verás que el símbolo $ cambia a #. A partir de aquí todos los comandos son iguales para ambos sistemas operativos.
Instalar paquetes
apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql
Cuando se solicite la configuración de Postfix, puede darte una explicación previa, le das OK.
┌────────────────────────┤ Postfix Configuration ├────────────────────────┐ │ │ │ Please select the mail server configuration type that best meets your │ needs. │ │ No configuration: │ Should be chosen to leave the current configuration unchanged. │ Internet site: │ Mail is sent and received directly using SMTP. │ Internet with smarthost: │ Mail is received directly using SMTP or by running a utility such │ as fetchmail. Outgoing mail is sent using a smarthost. │ Satellite system: │ All mail is sent to another machine, called a 'smarthost', for │ delivery. │ Local only: │ │ <Ok> │ │ └─────────────────────────────────────────────────────────────────────────┘
En la siguiente opción debes elegir Internet Site.
┌──────┤ Postfix Configuration ├───────┐ │ General type of mail configuration: │ │ │ │ No configuration │ │ Internet Site │ │ Internet with smarthost │ │ Satellite system │ │ Local only │ │ │ │ │ │ <Ok> <Cancel> │ │ │ └────────────────── ────────────────────┘
La configuración de Postfix te preguntará sobre el nombre de correo del sistema; puedes usar tu FDQN o dominio principal. En el caso del ejemplo: dominio.com.
┌─────────────────────────┤ Postfix Configuration ├─────────────────────────┐ │ The "mail name" is the domain name used to "qualify" _ALL_ mail │ │ addresses without a domain name. This includes mail to and from: │ │ please do not make your machine send out mail from root@example.org │ │ unless root@example.org has told you to. │ │ │ │ This name will also be used by other programs. It should be the single, │ │ fully qualified domain name (FQDN). │ │ │ │ Thus, if a mail address on the local host is foo@example.org, the │ │ correct value for this option would be example.org. │ │ │ │ System mail name: │ │ │ │ dominio.com______________________________________________________________ │ │ │ │ │ │ │ └───────────────────────────────────────────────────────────────────────────┘
Crear base de datos MySQL, dominios virtuales, usuarios y alias
En esta lección asumimos que ya tienes instalado el servidor MySQL/MariaDB instalado y configurado y ya tienes instalados todos los paquetes de la lección anterior. Recuerda ejecutar cualquier comando bash como Root.
Una vez que finalice la instalación, vamos a crear una base de datos MySQL para configurar tres tablas:
- Una para dominios, en la que registraremos las direcciones de correo, ejemplo: dominio.com.
- Una para usuarios, que representarán personas únicas dentro del sistema. La ventaja de hacerlo en Base de Datos es evitar crear usuarios dentro del sistema operativo, agregando más seguridad a nuestro servidor.
- Una para alias. Los alias sirven para crear múltiples cuentas para un mismo usuario.
Vamos a nombrar la base de datos servermail, pero se puede usar cualquier nombre.
Pasos para crear la base de datos
mysqladmin -p create servermail
Inicia sesión como usuario root de MySQL
mysql -u root -p
Ingresa tu contraseña de root de MySQL; Si tienes éxito, verás:
mysql >
Primero debemos crear un nuevo usuario, específico para la autenticación de correo, y le daremos permiso a SELECT. Recuerda cambiar el texto en color rojo.
GRANT SELECT ON servermail.* TO 'usermail'@'127.0.0.1' IDENTIFIED BY 'mailpassword';
Después de eso, necesitamos volver a cargar los privilegios de MySQL para asegurarnos de que aplica esos permisos con éxito
FLUSH PRIVILEGES;
Finalmente, necesitamos usar la base de datos para crear tablas e introducir nuestros datos
USE servermail;
Es momento de crear una tabla para los dominios específicos reconocidos como dominios autorizados.
CREATE TABLE `virtual_domains` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Vamos a crear una tabla para presentar a los usuarios. Aquí agregarás la dirección de correo electrónico y las contraseñas. Es necesario asociar a cada usuario con un dominio.
CREATE TABLE `virtual_users` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`password` VARCHAR(106) NOT NULL,
`email` VARCHAR(120) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Como último paso, crearemos una tabla de alias virtuales para especificar todos los correos electrónicos que reenviará al otro correo electrónico.
CREATE TABLE `virtual_aliases` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`source` varchar(100) NOT NULL,
`destination` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Hemos creado las tres tablas con éxito. Ahora vamos a introducir datos.
Dominios virtuales
Aquí vamos a introducir tus dominios dentro de la tabla virtual_domains. Puedes agregar todos los dominios que desees, en la lección dominio.com y tu FQDN (hostname.dominio.com).
INSERT INTO `servermail`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'dominio.com'),
('2', 'hostname.dominio.com');
Correos electrónicos virtuales
Vamos a introducir la dirección de correo electrónico y las contraseñas asociadas a cada dominio. Asegúrate de cambiar toda la información con tu información específica.
INSERT INTO `servermail`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('password1', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'usuario1@dominio.com'),
('2', '1', ENCRYPT('password2', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'usuario2@dominio.com');
Alias virtuales
Vamos a introducir la dirección de correo electrónico (origen) que vamos a reenviar a la otra dirección de correo electrónico (destino).
INSERT INTO `servermail`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', 'alias@dominio.com', 'usuario1@dominio.com');
Para finalizar salir de MySQL
exit
Configurar Postfix
Vamos a configurar Postfix para manejar las conexiones SMTP y enviar los mensajes para cada usuario introducido en la base de datos MySQL. Recuerda estar autenticado en la consola como Root.
Primero debemos crear una copia del archivo predeterminado, en caso de que desees volver a la configuración predeterminada.
cp /etc/postfix/main.cf /etc/postfix/main.cf.bk
Abre el archivo main.cf para modificarlo:
nano /etc/postfix/main.cf
Primero debemos comentar los parámetros TLS y añadir otros parámetros. En este tutorial, estamos utilizando los certificados SSL gratuitos, pero puedes modificarlos según tus configuraciones personales.
# TLS parameters
#smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#smtpd_use_tls=yes
#smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_cert_file=/etc/ssl/certs/dovecot.pem
smtpd_tls_key_file=/etc/ssl/private/dovecot.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
Luego, vamos a agregar los siguientes parámetros debajo de la configuración de TLS que hemos cambiado en el paso anterior:
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
Necesitamos comentar la configuración mydestination predeterminada y reemplazarla con localhost. Este cambio le permite a tu VPS usar los dominios virtuales dentro de la tabla MySQL.
#mydestination = example.com, hostname.example.com, localhost.example.com, localhost
mydestination = localhost
Verifica que el parámetro myhostname esté configurado con tu FQDN.
myhostname = hostname.dominio.com
Agrega la siguiente línea para la entrega de correo local a todos los dominios virtuales listados dentro de la tabla MySQL.
virtual_transport = lmtp:unix:private/dovecot-lmtp
Finalmente, necesitamos agregar estos tres parámetros para decirle a Postfix que configure los dominios virtuales, los usuarios y los alias.
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Puedes comparar estos cambios con este archivo para detectar errores o fallas.
Vamos a crear los tres archivos finales que agregamos en el archivo main.cf para decirle a Postfix cómo conectarse con MySQL.
Primero necesitamos crear el archivo mysql-virtual-mailbox-domains.cf. Es necesario cambiar los valores dependiendo de tu configuración personal.
nano /etc/postfix/mysql-virtual-mailbox-domains.cf
Agregar
user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_domains WHERE name='%s'
Ahora necesitamos reiniciar Postfix.
service postfix restart
Debemos asegurarnos de que Postfix encuentre tu dominio, por lo que debemos probarlo con el siguiente comando. Si tiene éxito, debería devolver 1:
postmap -q xigmad.net mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Entonces necesitamos crear el archivo mysql-virtual-mailbox-maps.cf.
nano /etc/postfix/mysql-virtual-mailbox-maps.cf
Agregamos
user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_users WHERE email='%s'
Necesitamos reiniciar Postfix de nuevo.
service postfix restart
En este momento, nos aseguraremos de que Postfix encuentre tu primera dirección de correo electrónico con el siguiente comando. Debería devolver 1 si tiene éxito:
postmap -q usuario1@dominio.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Para finalizar, vamos a crear el último archivo para configurar la conexión entre Postfix y MySQL.
nano /etc/postfix/mysql-virtual-alias-maps.cf
agregar
user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT destination FROM virtual_aliases WHERE source='%s'
Reinicia Postfix
service postfix restart
Necesitamos verificar que Postfix pueda encontrar tus alias. Ingresa el siguiente comando y debería devolver el correo que se reenvía al alias:
postmap -q alias@dominio.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Si deseas habilitar el puerto 587 para conectarse de forma segura con los clientes de correo electrónico, es necesario modificar el archivo /etc/postfix/master.cf
nano /etc/postfix/master.cf
Necesitamos descomentar estas líneas y añadir otros parámetros:
submission inet n - - - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
Importante: Antes de los -o de las líneas anteriores debe haber exactamente dos espacios, sino tendrás un error tipo
/usr/sbin/postconf: fatal: file /etc/postfix/master.cf: line 19: bad field count
postfix/postfix-script: fatal: cannot execute /usr/sbin/postconf!
En algunos casos, necesitamos reiniciar Postfix para asegurarnos de que el puerto 587 esté abierto.
service postfix restart
Configurar Dovecot
Vamos a copiar los 7 archivos que vamos a modificar, para que puedas revertirlos a los valores predeterminados si lo necesitas. Ingresa los siguientes comandos uno por uno:
cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig
Debes editar el archivo de configuración de Dovecot.
nano /etc/dovecot/dovecot.conf
Verifica que esta opción esté sin comentar.
!include conf.d/*.conf
Vamos a habilitar los protocolos (agregar pop3 si quieres) debajo de !include_try /usr/share/dovecot/protocols.d/*.protocol
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp
Luego vamos a editar el archivo de configuración de correo:
nano /etc/dovecot/conf.d/10-mail.conf
Encuentre la línea mail_location, descoméntala y coloca el siguiente parámetro:
mail_location = maildir:/var/mail/vhosts/%d/%n
Busca y encuentra la línea mail_privileged_group, elimina el comentario y agrega el parámetro de correo así:
mail_privileged_group = mail
Verificar permisos
Ingresa este comando:
ls -ld /var/mail
Asegúrate de que los permisos esten así:
drwxrwsr-x 3 root mail 4096 Jan 24 21:23 /var/mail
Vamos a crear una carpeta para cada dominio que registramos en la tabla MySQL:
mkdir -p /var/mail/vhosts/dominio.com
Debes crear un usuario y grupo de vmail con un ID de 5000
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail
Necesitamos cambiar el propietario de la carpeta /var/mail al usuario de vmail.
chown -R vmail:vmail /var/mail
Entonces necesitamos editar el archivo /etc/dovecot/conf.d/10-auth.conf:
nano /etc/dovecot/conf.d/10-auth.conf
Quita el comentario de plain text authentication y agrega esta línea:
disable_plaintext_auth = yes
Modifica el parámetro auth_mechanisms:
auth_mechanisms = plain login
Comenta esta línea:
#!include auth-system.conf.ext
Habilita la autorización de MySQL descomentando esta línea:
!include auth-sql.conf.ext
Necesitamos crear el archivo /etc/dovecot/dovecot-sql.conf.ext con tu información para la autenticación:
nano /etc/dovecot/conf.d/auth-sql.conf.ext
Ingresa el siguiente código en el archivo:
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
Necesitamos modificar el archivo /etc/dovecot/dovecot-sql.conf.ext con nuestra información personalizada de MySQL:
nano /etc/dovecot/dovecot-sql.conf.ext
Descomenta el parámetro del controlador y configura mysql como parámetro:
driver = mysql
Elimina el comentario de la línea de conexión e introduce tu información específica de MySQL:
connect = host=127.0.0.1 dbname=servermail user=usermail password=mailpassword
Descomenta la línea default_pass_scheme y cámbiala a SHA-512.
default_pass_scheme = SHA512-CRYPT
Debes descomentar la línea password_query y agregar esta información:
password_query = SELECT email as user, password FROM virtual_users WHERE email=’%u’;
Cambia el propietario y el grupo de la carpeta dovecot al usuario de vmail:
chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot
Abre y modifica el archivo /etc/dovecot/conf.d/10-master.conf (ten cuidado porque se cambiarán diferentes parámetros).
nano /etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
#port = 993
#ssl = yes
}
# Muchos comentarios
}
#Create LMTP socket and this configurations
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
# Comentarios
}
Modifica el parámetro unix_listener a service_auth así:
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
#group =
}
#unix_listener /var/spool/postfix/private/auth {
# mode = 0666
#}
user = dovecot
}
Modifica service auth-worker así:
service auth-worker {
# Auth worker process is run as root by default, so that it can access
# /etc/shadow. If this isn’t necessary, the user should be changed to
# $default_internal_user.
user = vmail
}
Finalmente, vamos a modificar el archivo de configuración SSL de Dovecot (omite este paso si vas a utilizar la configuración predeterminada).
nano /etc/dovecot/conf.d/10-ssl.conf
Cambia el parámetro ssl a requerido:
ssl = required
Y modifica la ruta para ssl_cert y ssl_key:
#ssl_cert = </etc/dovecot/private/dovecot.pem
#ssl_key = </etc/dovecot/private/dovecot.key
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem
Reinicia Dovecot
service dovecot restart
Debes verificar que el puerto 993 esté abierto y en funcionamiento (en caso de que habilites pop3; también debes verificar el puerto 995).
telnet example.com 993
Felicidades.
Has configurado correctamente tu servidor de correo y puedes probar tu cuenta utilizando un cliente de correo electrónico:
- Username: email1@dominio.com
- Password: password
- IMAP: dominio.com
- SMTP: dominio.com
Nota: usa el puerto 993 para IMAP seguro y el puerto 587 o 25 para SMTP.
Más información en