Servidor de correo · 10 min read · Nov 12, 2025
Cómo configurar el servidor de correo ISP con usuarios/dominios virtuales en Centos 5.0 usando Postfix, Dovecot, MySQL, phpMyAdmin, TLS/SSL - Página 2
Configuración:
SMTP-AUTH/TLS
Primero configuramos SMTP-AUTH y TLS. Para esto edita /usr/lib/sasl2/smtpd.conf con tu editor favorito.
vi /usr/lib/sasl2/smtpd.confy realiza los cambios como se indica a continuación.
pwcheck_method: saslauthd
mech_list: plain loginCrea directorios, luego la clave privada y por último el certificado.
mkdir -p /etc/postfix/ssl/mailserver
cd /etc/postfix/ssl/mailserver
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
chmod 600 smtpd.key
openssl req -new -key smtpd.key -out smtpd.csr
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
openssl rsa -in smtpd.key -out smtpd.key.unencrypted
mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650Se han creado claves privadas y certificados. Más adelante le diremos a postfix que los use.
MySQL:
Ahora crearemos una base de datos llamada mail, para esto emitiremos los comandos dados a continuación;
mysql -u root -pIngresa la contraseña y estarás en el prompt de MySQL ( mysql>).
CREATE DATABASE mail;Dale todos los privilegios sobre mail al usuario mail.
GRANT ALL PRIVILEGES ON mail.* TO 'mail'@'localhost' IDENTIFIED BY 'mail';
FLUSH PRIVILEGES;
quitEstablece la contraseña para el usuario mail. Esto se hará mediante la siguiente declaración.
mysqladmin -u mail password newpasswordLuego crearemos las tablas necesarias para nuestra nueva base de datos (mail) que contiene información sobre dominios, usuarios, alias y buzones.
mysql -u mail -pDespués de ingresar la contraseña estarás en el prompt de MySQL.
show databases;Mostrará todas las bases de datos, incluyendo nuestra base de datos “mail”. Usaremos “mail”.
USE mail;- Crea la tabla de dominios.
CREATE TABLE domain ( domain varchar(255) NOT NULL default '', description varchar(255) NOT NULL default '', aliases int(10) NOT NULL default '0', mailboxes int(10) NOT NULL default '0', maxquota int(10) NOT NULL default '0', transport varchar(255) default NULL, backupmx tinyint(1) NOT NULL default '0', created datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (domain), KEY domain (domain) ) TYPE=MyISAM COMMENT=' Dominios Virtuales';- La segunda tabla más importante es el buzón, así que crea el buzón.
CREATE TABLE mailbox ( username varchar(255) NOT NULL default '', password varchar(255) NOT NULL default '', name varchar(255) NOT NULL default '', maildir varchar(255) NOT NULL default '', quota int(10) NOT NULL default '0', domain varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (username), KEY username (username) ) TYPE=MyISAM COMMENT='Buzones Virtuales';- Crea la tabla de alias.
CREATE TABLE alias ( address varchar(255) NOT NULL default '', goto text NOT NULL, domain varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (address), KEY address (address) ) TYPE=MyISAM COMMENT='Alias Virtuales';Hemos creado las tablas necesarias, así que sal de MySQL.
quitPostfix MySQL:
Postfix necesita saber dónde y cómo puede buscar toda la información relacionada con los buzones. Para este propósito crearemos los siguientes archivos en /etc/postfix. Las versiones recientes de Postfix pueden usar eso en lugar de las otras declaraciones, y en ese caso, simplemente comenta todas las líneas y descomenta la última.
- Crea el archivo mysql_virtual_alias_maps.cf para reenviar correos electrónicos de una dirección de correo a otra.
vi /etc/postfix/mysql_virtual_alias_maps.cfuser = mail
password = mail
hosts = localhost
dbname = mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'- Crea el archivo mysql_virtual_domains_maps.cf, para el mapeo de dominios virtuales. Los dominios virtuales se consultan utilizando la información proporcionada en este archivo.
vi /etc/postfix/mysql_virtual_domains_maps.cfuser = mail
password = mail
hosts = localhost
dbname = mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'- Crea el archivo mysql_virtual_mailbox_maps.cf. Que es generalmente el mapeo de direcciones de correo a la ubicación del buzón del usuario en tu disco duro. Si guardaste el correo electrónico entrante en el disco duro usando el agente de entrega virtual incorporado de Postfix, entonces se consultaría para averiguar la ruta del buzón.
vi /etc/postfix/mysql_virtual_mailbox_maps.cfuser = mail
password = mail
hosts = localhost
dbname = mail
table = mailbox
select_field = CONCAT(domain,'/',maildir)
where_field = username
additional_conditions = and active = '1'
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'- Por último, crea el archivo mysql_virtual_mailbox_limit_maps.cf que se utilizará para mapear el límite de cuota de los buzones de los usuarios.
vi /etc/postfix/mysql_virtual_mailbox_limit_maps.cfuser = mail
password = mail
hosts = localhost
dbname = mail
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active = '1'
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'- Da a los archivos mysql_virtual la propiedad y permisos apropiados.
chown root:postfix *.cf
chmod 644 *.cfPostfix:
En la sección de configuración de Postfix editaremos el archivo main.cf ubicado en el directorio de configuración de postfix ( /etc/postfix), para ingresar alguna información básica necesaria para Postfix.
mv /etc/postfix/main.cf /etc/postfix/main.cf.orig
vi /etc/postfix/main.cf############## Postfix###############
#Fecha Modificada 17 de junio de 2008
#-------------------------------------------------------
smtpd_banner = $myhostname
biff = no
append_dot_mydomain = no
relayhost =
mynetworks = 192.168.49.0/24
inet_interfaces = 192.168.49.81
mailbox_size_limit = 0
recipient_delimiter = +
alias_database = hash:/etc/postfix/aliases
alias_maps = $alias_database
myhostname = example.co.tz
mydomain = rnd
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain, $transport_maps
mail_spool_directory = /var/spool/mail
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5
disable_vrfy_command = no
readme_directory = /usr/share/doc/postfix-2.2.10/README_FILES
sample_directory = /usr/share/doc/postfix-2.2.10/samples
sendmail_path = /usr/sbin/sendmail
html_directory = no
setgid_group = postdrop
command_directory = /usr/sbin
manpage_directory = /usr/share/man
daemon_directory = /usr/libexec/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
queue_directory = /var/spool/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 450
####################sección de postfix termina aquí###############Información del usuario virtual de Postfix:
Nuevamente editaremos el archivo main.cf para agregar soporte para usuarios virtuales. El “virtual_minimum_uid” y “virtual_uid_maps” apuntan al id de usuario 150 en mi caso, que es un usuario que creé específicamente para manejar correo virtual. Utiliza el grupo estándar “mail” con el gid predeterminado 12. Así que primero crea el usuario emitiendo el comando useradd o adduser.
useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Buzón virtual" vmail
chmod 770 /var/vmail/ (crea el directorio si no existe)
chown vmail:mail /var/vmail
vi /etc/postfix/main.cf#######################Usuarios y buzones de dominios virtuales###############
virtual_mailbox_domains = mysql:$config_directory/mysql_virtual_domains_maps.cf
virtual_mailbox_base = /var/vmail
virtual_mailbox_maps = mysql:$config_directory/mysql_virtual_mailbox_maps.cf
virtual_alias_maps = mysql:$config_directory/mysql_virtual_alias_maps.cf
virtual_minimum_uid = 150
virtual_uid_maps = static:150
virtual_gid_maps = static:12
##############################La sección virtual de main.cf termina##############Autenticación SASL/TLS de Postfix:
Finalmente volveremos a editar el archivo main.cf para habilitar la autenticación SASL/TLS. Anteriormente creamos algunos certificados, los usaremos aquí para asegurar el servidor de correo.
vi /etc/postfix.main.cf#################### Autenticación SASL/TLS###########################
######PARTE SASL#########
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain =
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
######PARTE TLS###########
smptpd_tls_cert_file = /etc/postfix/ssl/mailserver/smtpd.crt
smtpd_tls_key_file = /etc/postfix/ssl/mailserver/smtpd.key
smtpd_tls_CAfile = /etc/postfix/ssl/mailserver/cacert.pem
smtp_tls_auth_only = no
smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_received_header = no
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
tls_random_source = dev:/dev/urandom
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_recieved_header = yes
###########################La autenticación SASL/TLS termina aquí#############Para mi conveniencia he dividido main.cf en tres secciones { Postfix, dominios virtuales, usuarios y buzones, autenticación SASL/TLS}. La autenticación SASL/TLS se divide aún más en ( PARTE SASL y PARTE TLS). Para mostrarte cada sección y sus parámetros he editado el mismo archivo tres veces. Ahora copia el /etc/aliases y /etc/aliases.db a /etc/postfix/ y ejecuta newaliases.
cp /etc/aliases* /etc/postfix/
newaliasesDovecot v1.x IMAP y POP:
Configuremos Dovecot que proporciona tanto un servicio POP3 como IMAP. El archivo de configuración para Dovecot es /etc/dovecot.conf. Haremos una copia de seguridad del archivo original a dovecot.conf.orig, y modificaremos el archivo en ejecución según nuestras necesidades. Para manejar usuarios virtuales con dovecot crearemos el archivo /etc/dovecot-mysql.conf.
vi /etc/dovecot-mysql.conf######dovecot-mysql.conf debería verse así##########
# NOTA: '\' la división de líneas se usa solo para legibilidad, actualmente Dovecot no lo soporta
# El socket mysqld.sock puede estar en diferentes ubicaciones en diferentes sistemas
driver = mysql
default_pass_scheme = plain
#connect = host=/var/run/mysqld/mysqld.sock dbname=mail user=root password=default
# Alternativamente, también puedes conectarte a localhost:
connect = host=localhost dbname=mail user=mail password=mail
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, 150 AS uid, 12 AS gid, concat('dirsize:storage=',quota) AS quota FROM mailbox WHERE username ='%u' AND active ='1'
####################termina aquí####################Ahora pasemos a configurar dovecot.conf, para autenticar al usuario virtual usando el método mysql_auth. Ten en cuenta que los usuarios normales de Linux no pueden iniciar sesión en el servidor de correo. Porque no hemos habilitado el método de autenticación Pam en nuestra configuración de dovecot. Además, first_valid_uid y last_valid_uid están configurados en 150, lo que significa que solo el usuario con uid 150 podrá iniciar sesión. Los protocolos pop3 y pop3s están disponibles.
cp -p /etc/dovecot.conf /etc/dovecot.conf.orig
vi /etc/dovecot.conf(Solo edita las siguientes líneas)
##############dovecot configurado para trabajar con usuarios virtuales############
base_dir = /var/run/dovecot/
protocols = imap pop3 imaps pop3s
listen = [::]
login_dir = /var/run/dovecot-login
mail_location = mbox:/var/vmail/%d/%n
mbox_read_locks = fcntl
log_timestamp = "%Y-%m-%d %H:%M:%S "
log_path = /var/log/maillog
mail_extra_groups = mail
first_valid_uid = 150
last_valid_uid = 150
maildir_copy_with_hardlinks = yes
userdb sql {
args = /etc/dovecot-mysql.conf
}
passdb sql {
args = /etc/dovecot-mysql.conf
}
####################################termina aquí######################Después de esto, estableceremos la propiedad y los derechos de acceso en /etc/dovecot-mysql.conf.
chmod 600 /etc/dovecot/*.conf
chown vmail /etc/dovecot/*.confInstalación y configuración de Roundcube:
Basado en NOTAS DE INSTALACIÓN (Roundcube)
- Descomprime y coloca esta carpeta en algún lugar dentro de tu raíz de documentos ( /var/www/html/mail)
- Asegúrate de que los siguientes directorios (y los archivos dentro) sean escribibles por el servidor web
- /temp
- /logs
- Crea una nueva base de datos y un usuario de base de datos para RoundCube (ver CONFIGURACIÓN DE BASE DE DATOS)
- Apunta tu navegador a http://url-to-roundcube/installer/
- Sigue las instrucciones del script de instalación (o consulta la CONFIGURACIÓN MANUAL)
- Después de crear y probar la configuración, elimina el directorio del instalador
- ¡Listo!
CONFIGURACIÓN DE BASE DE DATOS
- MySQL 4.1.x/5.x
Para la versión de MySQL 4.1 y superior, se recomienda crear la base de datos para RoundCube con el conjunto de caracteres utf-8. Aquí hay un ejemplo del procedimiento de inicialización:
mysql -u root -pCREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'password';
quitmysql -u mail -p roundcubemail < SQL/mysql5.initial.sqlNota: ‘password’ es la contraseña maestra para el usuario roundcube. Se recomienda encarecidamente que reemplaces esto con una contraseña más segura. Ten en cuenta: Necesitas especificar esta contraseña más tarde en ‘config/db.inc.php’.
Sección HTTP:
Para comenzar a usar la interfaz web del servidor de correo, editaremos el archivo /etc/httpd/conf/httpd.conf.
vi /etc/httpd/conf/httpd.confY agrega las declaraciones dadas a continuación.
#Acceso frontal al correo usando roundcube
DocumentRoot /var/www/html/mail
ServerName mail.example.co.tz
Guarda la configuración y sal.
Creando usuarios y dominios virtuales:
- Ahora crearemos dominios virtuales y usuarios virtuales en nuestra base de datos de correo.
mysql -u mail -p- Ingresa la contraseña y estarás en el prompt mysql>.
USE mail;- Primero crea un dominio virtual en la tabla de dominios (example.co.tz) usando el comando dado a continuación.
INSERT INTO domain (domain,description,aliases,mailboxes,maxquota,transport,backupmx,active) VALUES ('example.co.tz','Dominio virtual','10','10', '0','virtual', '0','1');- Ahora crea dos usuarios virtuales en la tabla de buzones. He creado ( [email protected] & [email protected]) como nombres de usuario para kiiza y hoboka.
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES ('[email protected]','mwamaLis', 'Hoboka Mwamakunge ','hoboka/', '0','example.co.tz','1');
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES ('[email protected]','gekman', 'Kiiza Mutungi','kiiza/', '0','example.co.tz','1');
quitAhora que hemos creado usuarios virtuales y un dominio virtual, queremos probar nuestro servidor de correo iniciando sesión y enviando correo de una cuenta de usuario a otra. Así que comencemos los demonios de Dovecot, Postfix, MySQL y el servidor web. También queremos que se inicien automáticamente en el próximo reinicio. Para esto emitimos los siguientes comandos.
chkconfig -level 235 mysqld on
chkconfig -level 235 saslauthd on
chkconfig -level 235 postfix on
chkconfig -level 235 dovecot on
chkconfig -level 235 httpd on
/etc/init.d/saslauthd start
/etc/init.d/mysqld start
/etc/init.d/postfix start
/etc/init.d/dovecot start
/etc/init.d/httpd startRecibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.