Dovecot configuración · 5 min read · Sep 22, 2025
Mejorar la protección contra el abuso de spam en dovecot restringiendo el acceso a cuentas de correo por dirección IP (por ejemplo, con ISPConfig 3)
Lo que haremos
Este tutorial te mostrará cómo agregar restricciones de IP a cuentas de correo individuales al usar dovecot con MySQL.
Esto es especialmente útil si necesitas acceder a una cuenta de correo desde una sola IP o unas pocas IPs, o si deseas bloquear direcciones IP específicas para que no accedan a la cuenta de correo (por ejemplo, debido al abuso de spam).
Requisitos previos
- una instalación de dovecot funcionando con usuarios virtuales a través de MySQL (preferiblemente gestionada por ISPConfig 3)
Si no usas ISPConfig 3, es posible que debas alterar los nombres de las tablas y/o columnas de la base de datos en las consultas.
Cambios en tu sistema
Primero necesitamos crear una nueva tabla de base de datos en tu servidor de correo. En este tutorial la agregaremos a la base de datos de ISPConfig dbispconfig.
Abre la consola de MySQL:
mysql -u root -D dbispconfig -p
Una vez que hayas iniciado sesión, crea la nueva tabla de restricciones de IP con esta consulta:
CREATE TABLE mail_user_ip_restriction (
restriction_id INT(11) UNSIGNED NOT NULL auto_increment,
mailuser_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
ip VARCHAR(50) NOT NULL DEFAULT '',
mode ENUM('w','b') NOT NULL DEFAULT 'w',
service VARCHAR(10) NOT NULL DEFAULT '',
PRIMARY KEY (`restriction_id`),
KEY `ident` (`mailuser_id`, `mode`, `service`, `ip`)
) ENGINE=MyISAM;Ahora debes alterar la configuración SQL de dovecot. En instalaciones de ISPConfig 3 (por ejemplo, Debian/Ubuntu) debería residir en /etc/dovecot/dovecot-sql.conf
Cambia estas líneas:
password_query = SELECT password FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n'
user_query = SELECT email as user, maildir as home, CONCAT('maildir:', maildir, '/Maildir') as mail, uid, gid, CONCAT('*:storage=', quota, 'B') AS quota_rule, CONCAT(maildir, '/.sieve') as sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND `disable%Ls` = 'n'(si no estás usando la última versión de ISPConfig 3, las líneas en tu configuración pueden diferir ligeramente)
a:
password_query = SELECT m.password FROM mail_user as m LEFT JOIN mail_user_ip_restriction as r ON (r.mailuser_id = m.mailuser_id AND r.mode = 'w' AND r.service IN ('', '%Ls')) LEFT JOIN mail_user_ip_restriction as rb ON (rb.mailuser_id = m.mailuser_id AND rb.ip = '%r' AND rb.mode = 'b' AND rb.service IN ('', '%Ls')) WHERE (m.login = '%u' OR m.email = '%u') AND m.disable%Ls = 'n' AND (r.ip IS NULL OR r.ip = '%r') AND rb.ip IS NULL
user_query = SELECT m.email as user, m.maildir as home, CONCAT('maildir:', m.maildir, '/Maildir') as mail, m.uid, m.gid, CONCAT('*:storage=', m.quota, 'B') AS quota_rule, CONCAT(m.maildir, '/.sieve') as sieve FROM mail_user as m LEFT JOIN mail_user_ip_restriction as r ON (r.mailuser_id = m.mailuser_id AND r.mode = 'w' AND r.service IN ('', '%Ls')) LEFT JOIN mail_user_ip_restriction as rb ON (rb.mailuser_id = m.mailuser_id AND rb.ip = '%r' AND rb.mode = 'b' AND rb.service IN ('', '%Ls')) WHERE (m.login = '%u' OR m.email = '%u') AND m.disable%Ls = 'n' AND (r.ip IS NULL OR r.ip = '%r') AND rb.ip IS NULLAhora reinicia dovecot:
service dovecot restart (o /etc/init.d/dovecot restart, dependiendo de tu sistema)
¡Mantén un ojo en el registro de correo y/o sistema ahora! Si ves errores de tu dovecot, entonces algo salió mal y deberías revisar tus cambios o revertirlos.
Si todo funciona como antes, entonces estás listo para continuar.
Cómo restringir el acceso
Ahora tienes diferentes posibilidades para restringir el acceso a un buzón de correo. Te mostraré cómo hacerlo con consultas SQL en la consola de mysql, pero también puedes usar phpMyAdmin, por supuesto.
Bloquear IP
Para bloquear una sola IP de acceder a una cuenta de correo, debes agregarla a la tabla de restricciones con el modo ‘b’:
Primero necesitas el mailuser_id para tu cuenta de correo (por ejemplo, [email protected]). Esta es una consulta SQL simple:
SELECT mailuser_id FROM mail_user WHERE email = ‘ [email protected] ‘;
Esto devolverá un número (id) como 12345. Ahora agrega la entrada de restricción para este id:
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘’);
Esta entrada bloqueará la IP 123.234.123.234 de acceder a todos los servicios (pop3, imap, smtp) de la cuenta de correo 12345.
Si deseas que la IP pueda acceder a pop e imap pero prevenir que use smtp (enviar correos), puedes agregar esta entrada en su lugar:
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘smtp’);
Puedes agregar múltiples servicios de esta manera, una entrada para cada uno. Pero ten en cuenta que la entrada ‘’ bloquea todos los servicios.
Restringir a IPs específicas
Así como puedes bloquear, también puedes restringir el uso de cuentas de correo a IPs individuales. Esto significa que NINGUNA otra IP que las especificadas puede acceder a la cuenta. Simplemente debes crear una entrada con el modo ‘w’ en lugar de ‘b’:
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘w’, ‘pop3’);
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.235’, ‘w’, ‘smtp’);
Esta entrada hace lo siguiente:
- todas las IPs pueden usar imap de la cuenta 12345 ( [email protected])
- solo la IP 123.234.123.234 puede usar pop3 para esta cuenta - ¡todas las demás IPs no!
- solo la IP 123.234.123.235 puede usar smtp para esta cuenta - ¡todas las demás IPs no!
Por supuesto, puedes combinar todas las características y crear múltiples entradas de IP para diferentes modos y servicios.
Caso de uso
Ok, ahora algunas cosas de la vida real. Imagina que tienes una dirección de correo que es utilizada por tu tienda en línea para enviar correos. Nadie más debería enviar correos con esta cuenta, pero te gustaría verificar si alguien responde a los correos de tu tienda. Esto, nuevamente, solo debe hacerse por imap, no por pop3.
Estas son las entradas que crearías en este caso, donde 10.0.0.101 es la IP del servidor web con tu tienda y 12345 es el mailuser_id de tu cuenta de correo.
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘10.0.0.101’, ‘w’, ‘smtp’);
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘none’, ‘w’, ‘pop3’);
Ninguna otra IP que 10.0.0.101 puede acceder a smtp de esta cuenta de correo específica y nadie puede acceder a pop3 para ella. Imap está disponible para todas las IPs.
¡No olvides IPv6! Si tu servidor o el cliente que deseas especificar tiene una dirección ipv4 y una dirección ipv6, ¡debes agregar ambas!
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.