Crear un servidor de correo en GNU Linux desde cero
En la web ya hemos tratado servicios de correo, concretamente la instalación y configuración de relay de correo con Postfix, tanto con cuentas de gmail como de Office365. El problema es que dicho servicio sólo funciona para los envíos utilizando smtp. Hoy veremos como instalar un servidor de correo desde cero, utilizando los programas de software libre, Postifx, Dovecot y SpamAssasin, sobre un servidor Ubuntu.
Adquisición de un dominio económico
Antes de nada necesitamos adquirir un dominio, si puede ser económico mejor, ya que lo necesitaremos para el sistema de correo. Para la ocasión he realizado una pequeña adquisición del nombre ochobitsunbyte.pw, por sólo 3 euros y pico al año. Para ellos he utilizado los servicios de namecheap.com, como podéis ver en la imagen.
Primero de todo tenemos que averiguar si el dominio está disponible, para ello utilizaremos el buscador.
Los dominios .pw son muy económicos, por lo que para el tutorial me irá de perlas.
Tal y como vemos en la imagen, añadido al dominio nos ofrecen servicio de Whois anónimo llamado «Free WhoisGuard«, de manera gratuita, por lo que nos irá genial para que nuestros datos no sean públicos. Al confirmar la orden nos enviará a la pasarela de pago, que en mi caso es vía paypal. Una vez adquirido ya podemos pasar a la siguiente parte.
Contratar un VPS
Para el tutorial y para un uso todavía por determinar por mi parte, contrataremos un VPS, es decir, un servidor privado virtual en la nube, esto es, en una granja de servidores situada en alguna parte del planeta. Para ello utilizaremos la web digitalocean.com, con la que tengo muy buena experiencia, desde hace más de un año. Para ello nos iremos a la web.
Yo ya tengo creada una cuenta, que por cierto es gratuita. En el siguiente paso crearemos un VPS o Droplet. Escogeremos un pequeño con 512 MB de memoria, 20 GB de disco duro y 1 núcleo, más que suficiente. Con un sistema operativo con Ubuntu 12.04
En la primera parte tenemos que escoger el nombre para el servidor, en mi caso será correo.ochobitsunbyte.pw, escogemos el servidor con las características que he comentado antes, que tiene un coste de 5 eur al mes.
A continuación elegimos la ubicación del centro de datos. Si vivimos en Europa recomiendo un centro de datos en dicho continente, ya que tiene unas leyes menos invasivas como por ejemplo las de Estados Unidos.
He escogido la ubicación geográfica de Frankfurt en Alemania. En el siguiente paso elegimos el sistema operativo. He escogido Ubuntu en su versión 12.04 de 64 bits. La razón por la que no he escogido Debian, que es mi distribución favorita, es que cuando he realizado la instalación (llevo varios días haciendo pruebas), cuando tenía todo instalado un bug del sistema con el servicio Dovecot me ha fastidiado la fiesta. Dicha versión de Ubuntu es una versión fiable para el fin de ésta guía.
En el último paso podemos seleccionar una llave ssh, en nuestro caso no lo haremos, aunque podéis ver los nombres de las llaves que hasta ahora he ido creando para otros servidores. También podemos añadir una red interna, servicios de copias de seguridad, etcétera.
Y apretamos el botón «Create Droplet«
Al crear el servidor nos llegarán las credenciales a nuestro correo electrónico, para así poder acceder por ssh. La clave que nos envíen la tendremos que cambiar de manera obligatorio al acceder por primera vez.
Para quien esté interesado en utilizar DigitalOcean, puede utilizar el siguiente código promocional y obtener un descuento de 10 USD
Primeros pasos con el servidor
Al acceder vía ssh, debemos cambiar la contraseña. Recomiendo utilizar una contraseña de al menos 8 dígitos y que no sea habitual, podemos utilizar el programa pwgen del que ya hablamos en su día, ya que es una fantástica herramienta de creación de contraseñas.
Otro paso importante para segurizar nuestro servidor es cambiar el puerto por defecto del servicio ssh, tema que también tratamos en otro artículo, también podemos limitar el tiempo de conexión.
Actualizamos las fuentes y los paquetes del servidor a la última versión:
apt-get -y update
apt-get -y upgrade
De ésta manera ya podemos empezar a instalar nuestro servidor de correo.
Requisitos mínimos para el funcionamiento del servidor
Para que todo nos funcione a la perfección primero de todo debemos utilizar un nombre FQDN correcto. Para ello primero modificamos el archivo /etc/hosts y deberá quedar así:
127.0.0.1 localhost
127.0.1.1 correo.ochobitsunbyte.pw correo
nuestra.ip correo.ochobitsunbyte.pw correo
En la última línea debemos sustituir «nuestra.ip» por la IP del servidor.
Otro requisito para el servidor será tener instalado un servicio de base de datos MYSQL Recordar que al instalarlo nos pedirá otra vez una contraseña, es importante que no sea la misma que la del servidor.
Instalamos los paquetes:
apt-get install mysql-server libapache2-mod-auth-mysql php5-mysql
Debemos securizar nuestro servicio de base de datos, siguiendo los pasos del comando:
/usr/bin/mysql_secure_installation
Instalación de Postfix y Dovecot
De Postfix ya hemos hablado mucho en la web. Simplificando se trata de una herramienta para la gestión del correo, mucho más segura y avanzada que otras «marcas» propietarias. Dovecot se trata de un servicio IMAP y POP3 para sistemas GNU Linux, que pone especial hincapié en la seguridad. Todo ello combinado con MYSQL, que ya hemos instalado antes, y que hará que la combinación de los tres tengamos un servidor de correo muy completo.
Realizamos la instalación de los paquetes:
apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql
Nos aparecerá una pantalla donde nos preguntará que tipo de servidor de correo queremos, escogemos «Servidor de Internet«
El siguiente paso le decimos el nombre cualificado para el servidor:
Creación de la base de datos MYSQL
Antes de finalizar la instalación un paso muy importante es crear la base de datos con la que trabajará el sistema de correo. Al igual que en otros casos debemos de llamar a la base de datos con un nombre poco común. Llamaré a la base de datos ‘cronos‘
De la siguiente manera:
mysqladmin -p create cronos
Y a continuación accedemos a la consola MYSQL
mysql -u root -p
Una vez dentro crearemos un nuevo usuario que tendrá privilegios sobre la base de datos ‘cronos‘. A dicho usuario le llamaremos ‘fantastes‘, con nueva contraseña diferente de la de root.
GRANT SELECT ON cronos.* TO 'fantastes'@'127.0.0.1' IDENTIFIED BY 'contraseña';
Y recargamos los privilegios:
FLUSH PRIVILEGES;
Y accedemos la base de datos:
USE cronos;
Crearemos una nuevo tabla para los dominios virtuales de correo:
CREATE TABLE `virtual_domains` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Ahora creamos otra tabla con los datos de los usuarios, correos electrónicos y contraseñas:
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 cualquier servidor de correo que se precie también crearemos una tabla para los «alias», es decir, para las redirecciones de correo:
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;
Otro paso importante es insertar los servidores virtuales con los que vamos a trabajar, recordar que tienen que cumplir con las normas FQDN. En nuestro caso será por una parte el nombre de dominio ochobitsunbyte.pw y por el otro el nombre del servidor correo.ochobitsunbyte.pw
De la siguiente manera:
INSERT INTO `cronos`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'ochobitsunbyte.pw'),
('2', 'correo.ochobitsunbyte.pw');
Ahora añadiremos un correo, con el realizaremos pruebas de funcionamiento a posteriori.
INSERT INTO `cronos`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('contraseña', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'davidochobits@ochobitsunbyte.pw');
Y por último los «Aliases» o redirecciones, en éste caso sólo añadiremos una ficticia.
INSERT INTO `cronos`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', 'alias@ochobitsunbyte.pw', 'davidochobits@ochobitsunbyte.pw');
Por ésta parte ya hemos acabado. Podemos salir con ‘exit‘
Configurar Postfix
Ahora nos toca configurar Postfix. Guardamos el fichero de configuración original:
mv /etc/postfix/main.cf /etc/postfix/main.cf.back
Y creamos uno nuevo utilizando nuestro editor favorito, en mi caso nano:
nano /etc/postfix/main.cf
Utilizaremos los certificador SSL gratuitos disponibles en el sistema, para ellos añadimos éstas primeras líneas:
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
Y añadimos:
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
Decidimos que no queremos conexiones anónimas:
smtp_sasl_security_options = noanonymous
Y los datos referentes a nuestro de dominio y servidor:
mydestination = localhost
myhostname = correo.ochobitsunbyte.pw
Indicamos que vamos a utilizar los servidores virtuales indicados en la tabla de la base de datos:
virtual_transport = lmtp:unix:private/dovecot-lmtp
Por último añadimos las ubicaciones de los ficheros configuración para los dominios, usuarios y 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
Y comenzamos a editar los ficheros de configuración. Creamos el fichero «mysql-virtual-mailbox-domains.cf«
nano /etc/postfix/mysql-virtual-mailbox-domains.cf
Y añadimos en el fichero:
user = fantastes
password = password
hosts = 127.0.0.1
dbname = cronos
query = SELECT 1 FROM virtual_domains WHERE name='%s'
Reiniciamos el servicio:
service postix restart
Utilizando el comando postmap comprobaremos que la configuración del fichero es correcta:
postmap -q ochobitsunbyte.pw mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Si todo ha ido bien nos devolverá un ‘1‘
Vamos a por el segundo de los ficheros:
nano /etc/postfix/mysql-virtual-mailbox-maps.cf
Y añadimos las líneas:
user = fantastes
password = password
hosts = 127.0.0.1
dbname = cronos
query = SELECT 1 FROM virtual_users WHERE email='%s'
Reiniciamos el servicio:
service postfix restart
Comprobamos la configuración:
postmap -q davidochobits@ochobitsunbyte.pw mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Si nos muestra ‘1’ es que todo va bien.
Por último el tercer fichero:
nano /etc/postfix/mysql-virtual-alias-maps.cf
Y su contenido:
user = fantastes
password = password
hosts = 127.0.0.1
dbname = cronos
query = SELECT destination FROM virtual_aliases WHERE source='%s'
Reiniciamos por última vez en éste apartado el servicio:
service postfix restart
Realizamos la comprobación:
postmap -q alias@ochobitsunbyte.pw mysql:/etc/postfix/mysql-virtual-alias-maps.cf
De ésta manera nos tiene que mostrar el correo al cual está redirigido, es decir, davidochobits@ochobitsunbyte.pw
Para poder utilizar la conexión segura por el puerto 587 debemos modificar el fichero /etc/postfix/master.cf
nano /etc/postfix/master.cf
Debemos descomentar las siguientes líneas:
submission inet n - - - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
Si reiniciamos Postfix ya podremos utilizar el puerto 587.
Configurar Dovecot
Los principales ficheros de configuración de Dovecot, los cuales tendremos que modificar son los siguientes:
- /etc/dovecot/dovecot.conf
- /etc/dovecot/conf.d/10-mail.conf
- /etc/dovecot/conf.d/10-auth.conf
- /etc/dovecot/dovecot-sql.conf.ext
- /etc/dovecot/conf.d/10-master.conf
- /etc/dovecot/conf.d/10-ssl.conf
Para ello lo primero que haremos es copiarlos a otro archivo para perder la configuración original:
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
Empezamos a trabajar con el fichero /etc/dovecot/dovecont.conf, lo editamos:
nano /etc/dovecot/dovecot.conf
Y verificamos que la siguiente línea no esté comentada:
!include conf.d/*.conf
Justo debajo de la línea «!include_try /usr/share/dovecot/protocols.d/*.protocol line«, debemos añadir los protocolos a utilizar:
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp
Editamos el siguiente fichero de configuración:
nano /etc/dovecot/conf.d/10-mail.conf
Debemos descomentar la siguiente línea y dejarla tal así:
mail_location = maildir:/var/mail/vhosts/%d/%n
Ahora buscamos ésta otra línea, la descomentamos, y la dejamos tal cual:
mail_privileged_group = mail
Una vez editado el fichero lo guardamos.
Creamos la carpeta donde veremos los registros de la base de datos MYSQL:
mkdir -p /var/mail/vhosts/ochobitsunbyte.pw
Creamos el usuario y grupo ‘vmail‘ con la ID 5000
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail
Asignamos el nuevo usuario y grupo al directorio /var/mail utilizando el comando chown:
chown -R vmail:vmail /var/mail
Editamos el siguiente fichero:
nano /etc/dovecot/conf.d/10-auth.conf
Editamos la línea a continuación añadiendo el parámetro ‘yes‘:
disable_plaintext_auth = yes
Modificamos la línea ‘auth_mechanisms’ con los parámetros:
auth_mechanisms = plain login
Comentamos la línea:
#!include auth-system.conf.ext
Y descomentamos la línea referida a la autorización MYSQL:
!include auth-sql.conf.ext
En el paso siguiente creamos el fichero /etc/dovecot/conf.d/auth-sql.conf.ext para la información de autentificación:
nano /etc/dovecot/conf.d/auth-sql.conf.ext
Y añadimos el contenido:
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
Guardamos y pasamos al siguiente fichero, en este caso se trata de /etc/dovecot/dovecot-sql.conf, donde indicamos la información MYSQL
nano /etc/dovecot/dovecot-sql.conf.ext
Descomentamos y añadimos el parámetro ‘mysql‘ :
driver = mysql
Descomentamos y añadimos nuestros datos de base de datos:
connect = host=127.0.0.1 dbname=cronos user=fantastes password=password
Ahora descomentamos y modificamos el parámetro «default_pass_scheme«, añadiendo el cifrado «SHA512-CRYPT«
default_pass_scheme = SHA512-CRYPT
Descomentamos «password_query» y añadimos la información:
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
Modificamos permisos y asignamos nuevo usuario a la carpeta /etc/dovecot
chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot
Abrimos y modificamos el fichero /etc/dovecot/conf.d/10-master.conf, modificando varios parámetros, para que quede de la siguiente manera:
nano /etc/dovecot/conf.d/10-master.conf
La primera parte debe quedar así:
##Descomentamos inet_listener_imap y lo modificamos por port 0
service imap-login {
inet_listener imap {
port = 0
}
#Creamos el socket LMTP con esta configuracion
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
#inet_listener lmtp {
# Avoid making LMTP visible for the entire internet
#address =
#port =
#}
}
Modificamos el parámetro «unix_listener» dentro del apartado «service_auth» :
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
}
Modifcamos el apartado «service auth-worker» para que quede 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
}
Guardamos y pasamos al fichero /etc/dovecot/conf.d/10-ssl.conf, lo revisamos y si un caso lo modificamos, para que quede de la siguiente manera:
nano /etc/dovecot/conf.d/10-ssl.conf
Comprobamos que el parámetro «ssl» es el siguiente:
ssl = required
Verificamos y modificamos, si es necesario, los parámetros «ssl_cert» y «ssl_key» :
Reiniciamos el servicio Dovecot:
service dovecot restart
EDITADO ABRIL 2016
Gracias a la colaboración de los usuarios de la web, hemos visto que debido a diferentes problemas de certificado ssl, el servidor no funcionaba. Tanto en su parte IMAP en lo que a Dovecot, como en la parte SMTP de Postfix. Para solucionarlo vamos a ver primero la parte de Dovecot, la solución al final no es complicada, en el fichero /etc/dovecot/conf.d/10-ssl.conf, debemos descomentar la línea:
ssl_ca = /etc/ssl/certs/ca.pem
Y dejar como la tengo yo. A continuación nos iremos a la carpeta /etc/ssl/certs/ y descargaremos el certificado:
wget http://www.startssl.com/certs/ca.pem
Para comprobar que la parte de Dovecot, está lista lo comprobamos con el siguiente comando:
dovecot -f
Respecto a la parte de Postfix, añadimos al siguiente línea en el fichero /etc/postfix/main.cf:
smtpd_tls_CAfile = /etc/postfix/cacert.pem
Ahora copias el respectivo certificado a la carpeta de Postfix
cat /etc/ssl/certs/Equifax_Secure_CA.pem >> /etc/postfix/cacert.pem
Con esto ya lo tendremos solucionado.
Ahora reinciaremos el sevidor y probaremos la cuenta davidochobits@ochobitsunbyte.pw en el cliente de correo Thunderbird.
Para ello primero modificaremos los DNS de nuestro dominio para crear un registro A y MX, por seguridad recomiendo que los registros apunten a CloudFlare, si no tenéis cuenta os podéis crear una, son gratuitas. Por defecto namecheap.com ya apunta sus DNS a CloudFlare, así que no tendremos que hacer ninguna modificación.
En CloudFlare debemos añadir o modificar:
- Registro «A» ochobitsunbyte.pw que apunte a nuestra IP
- Registro «A»correo que apunte a nuestra IP
- Registro «MX» de ochobitsunbyte.pw que apunte a correo.ochobitsunbyte.pw
Escogeremos el plan «Free Plan» que no tiene coste. El cambio de DNS puede tardar un poco, de hecho, hasta varias horas.
En Thunderbird los parámetros deberían ser como sigue:
- Nombre a mostrar: davidochobits
- Cuenta de correo: davidochobits@ochobitsunbyte.pw
- Contraseña: ‘nuestro password’
- Servidor de entrada: IMAP, correo.ochobitsunbyte.pw, Puerto 993, SSL/TLS, contraseña normal
- Servidor de salida: SMTP, correo.ochobitsunbyte.pw, Puerto 587, Automático, contraseña normal
- Usuario: davidochobits@ochobitsunbyte.pw
Y con esto nos debería funcionar, aquí os dejo una muestra:
En el fichero de log /var/log/mail.log podemos ver todo lo que sucede con nuestro server de correo.
Configurar SpamAssasin
Con SpamAssasin podremos evitar en gran medida el abuso del spam contra nuestras cuentas de correo. Pertenece al proyecto Apache
Para instalar el programa en nuestro servidor:
apt-get install spamassassin spamc
Para su funcionamiento necesitamos crear el usuario ‘spamd‘ :
adduser spamd --disabled-login
Debemos modificar el fichero /etc/default/spamassassin
nano /etc/default/spamassassin
Cambiamos el parámetro:
ENABLED=1
Las siguientes líneas deben de quedar así:
SPAMD_HOME="/home/spamd/"
OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log"
PIDFILE="${SPAMD_HOME}spamd.pid"
CRON=1
Guardamos y ahora modificamos el fichero /etc/spamassassin/local.cf De ésta manera configuraremos el nivel de seguridad. Podemos utilizar los siguientes parámetros de ejemplo:
rewrite_header Subject ***** SPAM _SCORE_ *****
report_safe 0
required_score 5.0
use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1
skip_rbl_checks 0
use_razor2 0
use_dcc 0
use_pyzor 0
Por último modificamos uno de los ficheros de configuración de Postfix, para que cuenta con el servicio SpamAssassin :
nano /etc/postfix/master.cf
De las dos líneas siguientes, debemos buscar la primera y añadir a continuación la segunda:
submission inet n - - - - smtpd
-o content_filter=spamassassin
Y añadir justo al final del fichero:
spamassassin unix - n n - - pipe
user=spamd argv=/usr/bin/spamc -f -e
/usr/sbin/sendmail -oi -f ${sender} ${recipient}
Ahora ya podemos encender el servicio spamassassin y reiniciar postfix
service spamassassin sart
service postfix restart
Pues ya tenemos montado nuestro servidor de correo, con POSTFIX, DOVECOT y SPAMASSASIN, espero que haya sido de vuestro interés.
Me he ayudado de las siguientes fuentes:
Menudo curro la vín compae! 😉
Pues sí, de unos cuantos días mister Yoyo 🙂
Al final todo ha salido bien.
Muy bien explicado todo! Lo pondré en practica a ver como sale!
Un saludo!
Hola,
Genial, ya contarás tu experiencia.
Saludos!
¿Este servidor tiene la funcionalidad de dejar copia de todo lo que envía en el propio servidor.?
Gracias
El servidor guarda los correos cifrados mientras espera a enviarlos al destinatario.
Saludos
no, pero postfix trabaja entubando los procesos. puedes hacer un script que haga lo que necesitas
Bello post, excelente explicación, aunque hubiera preferido MariaDB (cosa de gustos 🙂 ). Ya lo redditeo /r/GNULinuxEsp y lo paso por las redes libres.
Saludos.
Genial Rogger,
También se puede utilizar MariaDB o PostgreSQL
Mercés por compartir.
Saludos!
Muy bueno. Voy a probarlo a ver como queda.Un saludo.
Gracias, ya me contarás : )
Está genial el post, completo y muy bien explicado.
A este paso, voy tener que hacerle una carpetita a firefox con tus manuales, que ya se está llenando la cosa 🙂
Gracias! Esa es la intención. Pues ves haciendo sitio, hay muchas más en camino 😉
Menudo pedazo de cacho de trozo de tuto, sencillamente excelente, este tipo de articulos son para guardar como referencia y eso hare. Un saludo compañero
Gracias Liher, lo cierto que para mi es una recompensa que amigos de la comunidad bloguera piensen así 🙂
Un saludo!
Los que tenemos un blog sabemos el curro que lleva un articulo como este y lo valoramos en consonancia. De verdad, muy bueno el post.
Demasiado bueno el artículo!!!!
Siempre he querido montar un Servidor de Correo propio, y ahora tengo toda la información disponible, muchísimas gracias.
Muchas gracias a ti por pasarte : )
Ya contarás tu experiencia. Un saludo!
Muy buen post! Solo ha faltado SquirrelMail
Gracias Galliko, esa es la intención.
El tema de la interfaz web SquirrelMail (o alguna similar) lo tengo pensado para de aquí a unos días.
Saludos!!
hola, bueno el tutorial.
te comento tengo un problema , al reiniciar dovecot me da:
[….] Restarting IMAP/POP3 mail server: dovecotdoveconf: Fatal: Error in configuration file /etc/dovecot/conf.d/10-ssl.conf line 12: ssl_cert: Can’t open file /etc/ssl/certs/dovecot.pem: No such file or directory
y bueno tambien cuendo verifico el puerto 993 y 995 (imap y pop3 seguro), no muestran como puertos abirtos
no logro conectar con un cliente de correo.
perdona pero hay algo que no realice bien.
no logro encontrar el detalle del error.
lo estoy corriendo en Debian 8.2
saludos.
Saludos davidochobits,
Te escribo por que instale el servidor de correo correctamente haciendo todos los pasos, pero cuando configuro el correo en el cliente Thunderbird no me funciona.
Te agradeceria tu ayuda.
Muchas gracias.
Hola Joan,
Entiendo que has seguido las instrucciones que indico al final del tutorial, justo en la parte de configurar el cliente Thunderbird. ¿Que error te da?
Ya me dices. Piensa también que los puertos deben estar abiertos en el firewall de tu empresa, tanto de entrada como de salida.
Saludos
Hola y gracias por compartir conocimiento, quería preguntarte si es posible añadir a un servidor como este diferentes dominios, gracias.
Hola.
En teoría entiendo que sí, pero nunca lo he probado.
Muchas gracias por este trozo de post, estoy tratando de replicarlo, pero como soy novato en linux, estoy teniendo algunos pequeños inconvenientes y dudas existenciales, por ejemplo en el archivo /etc/postfix/master.cf el: «-o smtpd_client_restrictions=permit_sasl_authenticated,reject» no es igual al que me aparece a mi en mi caso sale «-o smtpd_client_restrictions=$mua_client_restrictions», pero más abajo sale «-o smtpd_relay_restrictions=permit_sasl_authenticated,reject». Mi duda existencia es: ¿Cual debo descomentar o las descomento ambas?
De ante mano muchas gracias. BUENA VIBRA!!!! 😀
Hola César,
Primero de todo gracias por pasarte y comentar.
Respecto a la duda entiendo que es la segunda línea, la que deberías descomentar, esto es:
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject”
Ya me dirás si te ha funcionado bien.
Saludos!!
No me funciono amigo y cambie de versión de ubuntu y puse la misma del post y esa duda ya no fue problema para mí. Pero no me conecta, si reconoce que hay un servidor de correo pero dice que hay un error en usuario o clave ( cosa que no es así) pero no se que podrá ser.
Hola César,
Ya he encontrado el problema. Resulta que la configuración del fichero /etc/postfix/master.cf difiere de la configuración correcta. Ya he modificado el artículo, pero básicamente tendría que quedar:
submission inet n – – – – smtpd
-o content_filter=spamassassin
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
Te agradezco tus comentarios, si no fuera por ellos no hubiera dado con el error.
Saludos!
Hola davidochobits,
El cliente servidor no quiere conectar. y quiero saber si es por que yo no tengo instalado el certificado de seguridad ssl.
Si puedes ayudarme hacerlo te lo agradecería y si quieres puedes ponerte en contacto con migo atravez de mi correo para pagarte por tu ayuda.
Muchas gracias
Hola Joan,
¿Cuando te refieres a que no quiere conectar, te refieres a un cliente tipo Thunderbird?
Si asi es. Estoy haciendo un projecto y quiero hacer esa conexion si me puedes dar un numero de contacto directo.
Si puedes por favor.
Hola, mi nombre en Telegram es ‘davidochobits’, también me puedes encontrar en Jabber/XMPP con el nombre ‘davidochobits@openmailbox.org’
no estaría demás agregar que no funciona para instalaciones locales y solo para el VPS
Hola ssa,
Hombre, si indico todos los pasos para contratar el VPS en Digitalocean y los DNS en Cloudflare, será por algo?
tranquilo viejo que no soy un chico rata ni ando de troll fue un comentario sin afán de ofender pero si te ofendí una disculpa
y además me agradaría poder replicar en muchos casos el uso de un vps y en mi experiencia que en lo sumo es ínfima a la tuya claro está muchos de los tutoriales que hacen uso de un vps se pueden desarrollar en ya sea maquinas virtuales o maquinas físicas o viceversa
y no estaría demás mencionar que el tutorial quedaría obsoleto el 27 de abril del siguiente año si mal no recuerdo, ya que se dejaría de ofrecer soporte a esta versión de ubuntu y como repito todo esto es sin un afán de ofender es a manera de observación y si causo molestias de antemano una disculpa
Gracias por pasarte y comentar. Un saludo.
Funciona si configuro en un cliente con Microsoft Outlook y Pop ?
Hola, Sí, funciona en todos los clientes, Thunderbird es un ejemplo.
Saludos
entonces cual seria el puerto para POP3
Hola,
Lo ideal es trabajar con IMAP, que utiliza el puerto 993, y para SMTP 587. El POP3 sería 995.
Saludos
y que mantencion tendría que hacerse a este servidor .
Pues eso es a gusto de consumidor, esto es, se tendría que ir actualizando, a nivel de paquetes, se pueden añadir reglas de IPTABLES para mejorar su seguridad, etcétera.
ok , gracias por tus respuestas , una ultima consulta , aquí los correos quedan en un buzón ?
o se borran apenas uno los baja.
Al utilizar el protocolo IMAP se sincronizan los correos entre el cliente y el servidor. En cualquier caso se puede configurar en el cliente, por ejemplo Thunderbird, para que se borren del servidor una vez se descarguen en el cliente.
Saludos
gracias , todo bien , solo tengo un error que cuando habilito el cloudflare en A que creamos los correos no llegan , pero lo deshabilito y llegan sin problemas.
Hola… excelente documentación… Existe alguna instalacion de HORDE o ROUNDCUBE ? Se complica con la validación con mysql…
Si alguien tiene algo… gracias..
deseo subscribirme
Gracias por el tuto, un curro tremendo. Justo quiero montar un servidor de correo, y listas de correo.
Nunca he montado uno, principalmente tengo 2 dudas:
Según he entendido todos los correos se almacenan en MySQL no? osea que pueden estar en otra maquina.
Postfix y Dovecot parecen los mejores por lo que leo no?
Saludos!!
Has usado easyengine? tengo dudas para la configuracion del servidor de correo
Hola,
No lo he probado, quizás puede ser interesante para un artículo en la web.
Salu2
Hola soy novato en linux , gracias por el tuto, una duda es posible configurar el server de correo y configurar el cliente en otro equipo que no este en la lan?? lograria conectarse por internet a ese server ?? Gracias
Hola Enrique,
Claro, el servidor de correo debe tener una IP pública, a la que los clientes se conectarán.
Saludos
estimado , que antivirus se le podria instalar para el tema de correos
Hola, muchas gracias por la guia, excelente!, sin embargo tengo un error del certificado si a alguien le ha pasado?
doveconf: Fatal: Error in configuration file /etc/dovecot/conf.d/10-ssl.conf line 12: ssl_cert: Can’t open file /etc/ssl/certs/dovecot.pem: No such file or directory
Muchas gracias
Hola,
Eso es debido a que no encuentra los certificados, si no los lleva el sistema los debes crear, te dejo un enlace que explica la manera:
https://www.ochobitshacenunbyte.com/2015/09/30/crear-servidor-correo-gnu-linux-desde-cero/
Saludos
Buenas,
En mi equipo (debian 9) no encuentro: «Equifax_Secure_CA.pem»
Quería ver como agregarla para que estuviera el certificado, pero el link que has puesto es el de este mismo tutorial.
Excelente Post!
Una duda si quiero manejar los registros MX y A desde Digital Ocean como lo puedo hacer?
Hola,
Debes apuntar los registros desde tu DNS a la IP del servidor.
Saludos
Realice todo el proceso pero no puedo conectarme al puerto 993 me da un mensaje de refused.
Como podira solucionarlo
Hola,
Tienes que revisar los pasos del artículos, también puedes consultar los logs del directorio /var/log
Un saludo
Gran post. Una cuestion, esta configuración y este modelo de servidor, valdria para configurar las cuentas de correo de otros dominios alojados en otra máquina? Es que tengo un servidor dedicado virtualizado con proxmox y tengo una vps con plesk para 20 dominios, pero me sobra máquina y me gustaria montar otro vps solo para correo.
Gracias por tan grande aportacion
Hola David, muy buenas tardes… Me interesa mucho montar un servidor como el que expones pero crees que funcione en CentOS??
Saludos y muchísimas gracias por el Post…
Hola Claudio,
Entiendo que sí, pero piensa que los comandos y librerías serán otros, así que te tocará investigar un poco. Siempre puedes utilizar NethServer, que funcione sobre CentOS:
https://www.ochobitshacenunbyte.com/2015/10/19/domina-servidor-nethserver/
https://www.ochobitshacenunbyte.com/2016/05/30/servidor-de-correo-con-nethserver/
Salu2!
Hola David!! antes que nada permiteme felicitarte por este post y agradecerte por compartir tu conocimiento de manera tan tremenda, me ha sido de mucha ayuda.
Siguiendo las indicaciones que haces ya he logrado recibir correos de cuentas de hotmail y enviar correos a esas mismas cuentas por línea de comando, aunque adicionalmente utilice registros SPF y DKIM para que mis correos no fueran tratados como spam y no he implementado el SpamAssassin.
Sin embargo no puedo conectarme utilizando un cliente (Thunderbird y Outlook) instalado en mi maquina de casa; Thunderbird me indica que hubo un fallo para encontrar los ajustes de mi cuenta de email y outlook durante el intento de inicio de sesión me dice que el servidor finalizó inesperadamente la conexión; revise el tema de los certificados que mencionas y cambie mi servicio DNS a cloudfare haciendo el registro MX correspondiente pero aún así no funciona, en el mail.log no tengo ningún error al respecto.
Esto lo monte en un droplet de digital ocean en el cual tengo un sitio web con ese mismo dominio.
Cabe señalar que mi archivo /etc/postfix/master.cf quedo exactamente así
submission inet n – – – – smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
el estado de los puertos es:
587/tcp open submission
993/tcp open imaps
Espero puedas orientarme para saber que podría estar pasando 🙁
Hola,
El error en Thunderbird es algo bastante típico, ya que no recoge la configuración por defecto del nuestro servidor. Si me pasas a mi correo personal davidochobits@openmailbox.org, un pantallazo de la configuración quizás te pueda ayudar.
La información que indicas del master.cf parece estar correcta además. En cualquier caso también puedes mirar los logs del sistema, ya que es una buena herramienta para ver los posibles errores. Generalmente ubicados en /var/log/messages, o bien /var/log/mail, depende del sistema.
Un saludo
David, buen día. Anto todo, muy buen tuto.
Pude configurar exitosamente todo,
(en debian7, los certificados indicados estan en
smtpd_tls_cert_file=/etc/ssl/certs/dovecot.pem
smtpd_tls_key_file=/etc/ssl/private/dovecot.pem
)
Tengo un problema con la autentificacion, me rechaza la contraseña y en los logs tengo esta advertencia.
«Dec 5 10:05:22 myserver dovecot: auth: Fatal: mysql: Missing value in connect string: default_pass_scheme»
pero si me fijo en :
nano /etc/dovecot/dovecot-sql.conf.ext
La linea está:
default_pass_scheme = SHA512-CRYPT
Dec 5 10:56:22 myserver dovecot: auth-worker(15477): mysql(127.0.0.1): Connected to database maildovecot
Dec 5 10:56:37 myserver dovecot: imap-login: Disconnected (auth failed, 3 attempts in 15 secs): user=, method=PLAIN, rip=181.95.XXX.XXX, lip=81.4.XXX.XXX, TLS, session=
La constaseña que le estoy colocando para hacer la prueba es «constraseña» insetada en este paso:
INSERT INTO `maildb`.`virtual_users` (`id`, `domain_id`, `password` , `email`) VALUES
(‘1’, ‘2’, ENCRYPT(‘contraseña’, CONCAT(‘$6$’, SUBSTRING(SHA(RAND()), -16))), ‘yo@midominio.com.ar’),
El resto parece ir bien. Me queda la duda si Encrypt esta correctamente configurado
Saludos.
Genere la clave con:
#doveadm pw -s SHA512-CRYPT
y la reemplace en Mysql
> update `maildb.`virtual_users` SET `password`=’$6$8WpX1CAAF1gfghg5$WUxQnEf/mBhmdx32yO9swsAQSY1uk/hF2F09z1IxGuhER6n.FgwLxOCsCpsewoTit4OrHdv3jYR2su19Siuj9/’ where `id` = 2;
Ahi funciono IMAP.
SMTP aun no funciona en el log:
Dec 5 13:47:29 myserver dovecot: imap-login: Login: user=, method=PLAIN, rip=181.95.XXX.XXX, lip=81.4.XXX.XXX, mpid=15837, TLS, session=
Dec 5 13:47:30 myserver dovecot: auth-worker(15830): Warning: mysql: Query failed, retrying: Table ‘maildb.users’ doesn’t exist
Dec 5 13:47:30 myserver dovecot: auth-worker(15830): Error: sql(usuario@dominio.com.ar,181.95.XXX.XXX): User query failed: Table ‘maildb.users’ doesn’t exist (using built-in default user_query: SELECT home, uid, gid FROM users WHERE username = ‘%n’ AND domain = ‘%d’)
Dec 5 13:47:30 myserver dovecot: imap-login: Login: user=, method=PLAIN, rip=181.95.XXX.XXX, lip=81.4.XXX.XXX, mpid=15838, TLS, session=
Arreglado también lo anterior, el problema estaba que por defecto debían instala como MTA sendmail que bloquea el puerto 25. Lo maté, volví a recargar postfix y comenzaron a llegar los mails. Puedo descargar y ver los mails.
Anduvo todo !
Lo primero, muchas gracias por la aportación.
Lo segundo, me falla el servidor. Tras realizar toda la instalación (menos el SpamAssasin), incluida la actualización de 2016, no puedo conectarme mediante Thundermail y en el /var/log/mail.log encuentro lo siguiente:
dovecot: imap-login: Error: SSL: Stacked error: error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca: SSL alert number 48
El ca.pem está establecido tal y como explicas en el tutorial. El sistema que uso es Ubuntu 16.04, no sé hasta que punto puede influir eso en la gestión de certificados.
Gracias de antemano.
He conseguido solventar el error obteniendo un certificado mediante letsencrypt y estableciéndolo en postfix y dovecot.
Ahora me encuentro ante otro problema. Puedo enviar emails (incluso a gmail), pero no recibirlos. Ni de fuera ni desde el propio servidor.
Muy completo. Me ha sido de mucha utilidad. Felicidades.
Gracias, esa es la intención. Saludos
hola como descargase el certificado ssl ca.pem si el servidor ya esta caido?
Puedo enviar emails (incluso a gmail), pero no recibirlos. Ni de fuera ni desde el propio servidor.
Hola
Ante todo muy agradecido del curro que te has metido con este manual.
Estoy intentando configurar el servidor postfix en mi vps.
Yo creo que tienes alguna linea mal, pero corrígeme si me equivoco.
«smtp_sasl_security_options = noanonymous» tendría que sustituirse por:
«smtpd_sasl_security_options = noanonymous»
las lineas:
query = SELECT 1 FROM virtual_domains WHERE name=’%s’
query = SELECT 1 FROM virtual_users WHERE email=’%s’
Tendrían que sustituirse por:
«query = SELECT id FROM virtual_domains WHERE name=’%s'»
«query = SELECT id FROM virtual_users WHERE email=’%s'»
A mi personalmente me esta dando problemas instalarlo. pero bueno si sigo así ya comentare por aquí.
Saludos
Hola Santi,
Primero de todo gracias por pasarte y comentar. Ten en cuenta que el tutorial lo hice hace tiempo con Ubuntu 12.04 como sistema operativo, ¿Estás utilizando el mismo? Así que es bastante probable que desde entonces algunas cosas hayan cambiado. Un saludo
Perdona por tardar en contestarte.
Si ya me había dado cuenta que el tutorial es de hace tiempo y es para ubuntu 12.04.
Tengo Debian jessie y no he tenido grandes problemas para guiarme con tus instrucciones funciona genial.
Saludos.
Hola como seria para crearle unos mx personalizados para que desde otros dominios puedan enviarlos mail por este vps
hola la pagina de ssl ca.pem ya no exite como puedo descargar esta ceritficacion?
Hola,
¿Qué versión de sistema operativo estás utilizando?
Excelente, consulta sabrias como poner un login de registro de usuario, en roundcube por ejemplo.
Saludos
Con tu articulo recorde proque NO me gusta ninguna distro LINUX,. todo un chorro para algo tan simple mejor vuelvo al confiable Windows
Buenas tardes tengo este error (fatal bad string length 0 1 virtual_mailbox_base =) que no he podido solucionar quiciera saber si conoce el motivo. felicidades por el blog muy bueno
Hola, estoy intentando poner en marcha un servidor de email en Debian 9 pero he llegado a un punto que no puedo descargar el fichero http://www.startssl.com/certs/ca.pem como ya han comentado por ahí arriba.
¿Que solución hay?
Gracias por el post tan completo.
Hola, el artículo lo escribí hace unos años y utilicé Ubuntu 12. De esa versión a las actuales hay un abismo en lo que respecta a la paquetería.
En cualquier caso algún otro usuario quizás te puede ayudar.
Saludos
Hola, quiero hacer una consulta, yo estoy trabajando con un servidor local, no compré alojamiento y lo que quiero saber es si al momento de las configuraciones el nombre que se le da al servidor influye en su funcionamiento? si tiene que tener una estructura FQDN? porque el nombre de que le diste en el parametro de droplet hostname tiene una estructura FQDN.
Cuales son los cuidados que debo tener con los nombres de dominio y nombres del servidor??
De antemano muchas gracias.
Una pregunta … por ejemplo si en el vps la cual se monta el.server de email .. si quiero q varios dominios utilizen el servicio y muchas cuentas dd emails como se haria ?
Hola buenas, siguiendo el tutorial me ha fallado en dos partes:
«dovecot -f» da error: dovecot: invalid option — ‘f’
«cat /etc/ssl/certs/Equifax_Secure_CA.pem >> /etc/postfix/cacert.pem» da error: cat: /etc/ssl/certs/Equifax_Secure_CA.pem: No such file or directory
Y al final al intentar hacer la prueba con el Thunderbird, dice que no se puede conectar a la cuenta.
Una pena porque me he tirado facil un par de horas haciendo todo y el final no ha funcionado 🙁
Hola,
Esta entrada la escribí hace 8 años, así que me parece que actualmente no debe ser muy fiable.
Siento la pérdida de tiempo. Por lo menos habrás visto como instalarlo. Lo más probable que las nuevas versiones de los programas deben funcionar algo diferente.
Un saludo