Postfix y MySQL · 8 min read · Nov 25, 2025
Usuarios Virtuales Y Dominios Con Postfix, Courier, MySQL Y SquirrelMail (Fedora 13 x86_64) - Página 2
6 Establecer Contraseñas de MySQL y Configurar phpMyAdmin
Inicie MySQL:
chkconfig --levels 235 mysqld on
/etc/init.d/mysqld startLuego establezca contraseñas para la cuenta root de MySQL:
mysql_secure_installation[root@server1 ~]# mysql_secure_installation
NOTA: ¡SE RECOMIENDA EJECUTAR TODAS LAS PARTES DE ESTE SCRIPT PARA TODOS LOS SERVIDORES MySQL EN USO EN PRODUCCIÓN! ¡LEA CADA PASO CUIDADOSAMENTE!
Para iniciar sesión en MySQL y asegurarla, necesitaremos la contraseña actual para el usuario root. Si acaba de instalar MySQL, y no ha establecido la contraseña de root aún, la contraseña estará en blanco, así que solo debe presionar enter aquí.
Ingrese la contraseña actual para root (presione enter para ninguno): <– ENTER
OK, se utilizó la contraseña correctamente, continuando…
Establecer la contraseña de root asegura que nadie pueda iniciar sesión en el usuario root de MySQL sin la autorización adecuada.
¿Establecer contraseña de root? [Y/n] <– ENTER
Nueva contraseña: <– yourrootsqlpassword
Reingrese nueva contraseña: <– yourrootsqlpassword
¡Contraseña actualizada con éxito!
Recargando tablas de privilegios..
… ¡Éxito!
Por defecto, una instalación de MySQL tiene un usuario anónimo, permitiendo que cualquiera inicie sesión en MySQL sin tener que tener una cuenta de usuario creada para ellos. Esto está destinado solo para pruebas, y para hacer que la instalación sea un poco más fluida. Debe eliminarlos antes de pasar a un entorno de producción.
¿Eliminar usuarios anónimos? [Y/n] <– ENTER
… ¡Éxito!
Normalmente, solo se debe permitir que root se conecte desde ‘localhost’. Esto asegura que alguien no pueda adivinar la contraseña de root desde la red.
¿Deshabilitar inicio de sesión remoto de root? [Y/n] <– ENTER
… ¡Éxito!
Por defecto, MySQL viene con una base de datos llamada ‘test’ a la que cualquiera puede acceder. Esto también está destinado solo para pruebas, y debe ser eliminado antes de pasar a un entorno de producción.
¿Eliminar base de datos de prueba y acceso a ella? [Y/n] <– ENTER
- Eliminando base de datos de prueba…
… ¡Éxito! - Eliminando privilegios en la base de datos de prueba…
… ¡Éxito!
Recargar las tablas de privilegios asegurará que todos los cambios realizados hasta ahora surtan efecto de inmediato.
¿Recargar tablas de privilegios ahora? [Y/n] <– ENTER
… ¡Éxito!
Limpiando…
¡Todo listo! Si ha completado todos los pasos anteriores, su instalación de MySQL debería estar ahora segura.
¡Gracias por usar MySQL!
[root@server1 ~]#
Ahora configuramos phpMyAdmin. Cambiamos la configuración de Apache para que phpMyAdmin permita conexiones no solo desde localhost (comentando la sección
vi /etc/httpd/conf.d/phpMyAdmin.conf| # phpMyAdmin - Navegador MySQL basado en la web escrito en php # # Permite solo localhost por defecto # # Pero permitir phpMyAdmin a cualquiera que no sea localhost debe considerarse # peligroso a menos que esté debidamente asegurado por SSL Alias /phpMyAdmin /usr/share/phpMyAdmin Alias /phpmyadmin /usr/share/phpMyAdmin # |
Luego creamos los enlaces de inicio del sistema para Apache y lo iniciamos:
chkconfig --levels 235 httpd on
/etc/init.d/httpd startAhora puede dirigir su navegador a http://server1.example.com/phpMyAdmin/ o http://192.168.0.100/phpMyAdmin/ e iniciar sesión con el nombre de usuario root y su nueva contraseña root de MySQL.
7 Crear La Base De Datos MySQL Para Postfix/Courier
Creamos una base de datos llamada mail:
mysqladmin -u root -p create mailA continuación, vamos a la consola de MySQL:
mysql -u root -pEn la consola de MySQL, creamos el usuario mail_admin con la contraseña mail_admin_password (reemplácelo con su propia contraseña) que tiene privilegios SELECT, INSERT, UPDATE, DELETE en la base de datos mail. Este usuario será utilizado por Postfix y Courier para conectarse a la base de datos de correo:
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;Aún en la consola de MySQL, creamos las tablas que Postfix y Courier necesitan:
USE mail;CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota bigint(20) DEFAULT '10485760',
PRIMARY KEY (email)
) TYPE=MyISAM;CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;quit;Como puede haber notado, con el comando quit; hemos salido de la consola de MySQL y estamos de vuelta en la consola de Linux.
La tabla domains almacenará cada dominio virtual para el cual Postfix debe recibir correos electrónicos (por ejemplo, example.com).
| domain |
| example.com |
La tabla forwardings es para aliasar una dirección de correo electrónico a otra, por ejemplo, reenviar correos electrónicos de [email protected] a [email protected].
| source | destination |
| [email protected] | [email protected] |
La tabla users almacena todos los usuarios virtuales (es decir, direcciones de correo electrónico, porque la dirección de correo electrónico y el nombre de usuario son los mismos) y contraseñas (¡en forma encriptada!) y un valor de cuota para cada buzón de correo (en este ejemplo, el valor predeterminado es 10485760 bytes, lo que significa 10MB).
| password | quota | |
| [email protected] | No9.E4skNvGa. (“secreto” en forma encriptada) | 10485760 |
La tabla transport es opcional, es para usuarios avanzados. Permite reenviar correos para usuarios individuales, dominios enteros o todos los correos a otro servidor. Por ejemplo,
| domain | transport |
| example.com | smtp:[1.2.3.4] |
reenviaría todos los correos electrónicos para example.com a través del protocolo smtp al servidor con la dirección IP 1.2.3.4 (los corchetes [] significan “no hacer una búsqueda del registro MX DNS” (lo cual tiene sentido para direcciones IP…). Si utiliza un nombre de dominio completamente calificado (FQDN) en su lugar, no usaría los corchetes.).
8 Configurar Postfix
Ahora tenemos que decirle a Postfix dónde puede encontrar toda la información en la base de datos. Por lo tanto, tenemos que crear seis archivos de texto. Notará que le digo a Postfix que se conecte a MySQL en la dirección IP 127.0.0.1 en lugar de localhost. Esto se debe a que Postfix se está ejecutando en una cárcel chroot y no tiene acceso al socket de MySQL al que intentaría conectarse si le dijera a Postfix que use localhost. Si uso 127.0.0.1, Postfix utiliza la red TCP para conectarse a MySQL, lo cual no es un problema incluso en una cárcel chroot (la alternativa sería mover el socket de MySQL a la cárcel chroot, lo que causa otros problemas).
Ahora vamos a crear nuestros seis archivos de texto.
vi /etc/postfix/mysql-virtual_domains.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_forwardings.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_mailboxes.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_email2email.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_transports.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |
chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cfAhora creamos un usuario y grupo llamado vmail con el directorio home /home/vmail. Aquí es donde se almacenarán todos los buzones de correo.
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -mA continuación, hacemos algunas configuraciones de Postfix. Asegúrese de reemplazar server1.example.com con un FQDN válido, de lo contrario, su Postfix podría no funcionar correctamente.
postconf -e 'myhostname = server1.example.com'
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'virtual_alias_domains ='
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_maildir_extended = yes'
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'
postconf -e 'virtual_mailbox_limit_override = yes'
postconf -e 'virtual_maildir_limit_message = "El usuario que está intentando alcanzar está sobre la cuota."'
postconf -e 'virtual_overquota_bounce = yes'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'
postconf -e 'inet_interfaces = all'Después creamos el certificado SSL que se necesita para TLS:
cd /etc/postfix
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509Nombre del País (código de 2 letras) [XX]: <– Ingrese el Nombre de su País (por ejemplo, “DE”).
Nombre del Estado o Provincia (nombre completo) []: <– Ingrese el Nombre de su Estado o Provincia.
Nombre de la Localidad (por ejemplo, ciudad) [Ciudad Predeterminada]: <– Ingrese su Ciudad.
Nombre de la Organización (por ejemplo, empresa) [Empresa Predeterminada Ltd]: <– Ingrese el Nombre de su Organización (por ejemplo, el nombre de su empresa).
Nombre de la Unidad Organizativa (por ejemplo, sección) []: <– Ingrese el Nombre de su Unidad Organizativa (por ejemplo, “Departamento de TI”).
Nombre Común (por ejemplo, su nombre o el nombre de host de su servidor) []: <– Ingrese el Nombre de Dominio Completamente Calificado del sistema (por ejemplo, “server1.example.com”).
Dirección de Correo Electrónico []: <– Ingrese su Dirección de Correo Electrónico.
Luego cambie los permisos de smtpd.key:
chmod o= /etc/postfix/smtpd.keyRecibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.