Dovecot Config · 5 min read · Sep 22, 2025
Melhore a proteção contra abuso de spam no dovecot restringindo o acesso às contas de e-mail por endereço IP (por exemplo, com ISPConfig 3)
O que faremos
Este guia mostrará como adicionar restrições de IP a contas de e-mail individuais ao usar dovecot com MySQL.
Isso é especialmente útil se você precisar acessar uma conta de e-mail de apenas um único IP ou alguns IPs ou se quiser bloquear endereços IP específicos de acessar a conta de e-mail (por exemplo, devido a abuso de spam).
Pré-requisitos
- uma instalação do dovecot funcionando com usuários virtuais através do MySQL (preferencialmente gerenciado pelo ISPConfig 3)
Se você não usar o ISPConfig 3, pode ser necessário alterar os nomes das tabelas e/ou colunas do banco de dados nas consultas.
Alterações no seu sistema
Primeiro, precisamos criar uma nova tabela de banco de dados no seu servidor de e-mail. Neste guia, a adicionaremos ao banco de dados do ISPConfig dbispconfig.
Abra o console do MySQL:
mysql -u root -D dbispconfig -p
Quando estiver logado, crie a nova tabela de restrição de IP com 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;Agora você precisa alterar a configuração SQL do dovecot. Em instalações do ISPConfig 3 (por exemplo, Debian/Ubuntu), ela deve estar em /etc/dovecot/dovecot-sql.conf
Altere estas linhas:
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'(se você não estiver usando a versão mais recente do ISPConfig 3, as linhas na sua configuração podem diferir ligeiramente)
para:
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 NULLAgora reinicie o dovecot:
service dovecot restart (ou /etc/init.d/dovecot restart, dependendo do seu sistema)
Fique de olho no log de e-mail e/ou sistema agora! Se você ver erros do seu dovecot, então algo deu errado e você deve verificar suas alterações ou revertê-las.
Se tudo funcionar como antes, então você está pronto para prosseguir.
Como restringir o acesso
Agora você tem diferentes possibilidades para restringir o acesso a uma caixa de correio. Vou mostrar como fazer isso com consultas SQL no console do mysql, mas você pode usar o phpMyAdmin, é claro.
Bloquear IP
Para bloquear um único IP de acessar uma conta de e-mail, você deve adicioná-lo à tabela de restrição com o modo ‘b’:
Primeiro, você precisa do mailuser_id para sua conta de e-mail (por exemplo, [email protected]). Esta é uma consulta SQL simples:
SELECT mailuser_id FROM mail_user WHERE email = ‘ [email protected] ‘;
Isso retornará um número (id) como 12345. Agora adicione a entrada de restrição para este id:
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘’);
Esta entrada bloqueará o IP 123.234.123.234 de acessar todos os serviços (pop3, imap, smtp) da conta de e-mail 12345.
Se você quiser que o IP possa acessar pop e imap, mas impedir que ele use smtp (enviando e-mails), você pode adicionar esta entrada em vez disso:
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘smtp’);
Você pode adicionar vários serviços assim, uma entrada para cada um. Mas tenha em mente que a entrada ‘’ bloqueia todos os serviços.
Restringir a IPs específicos
Assim como você pode bloquear, você também pode restringir o uso de contas de e-mail a IPs únicos. Isso significa que NENHUM outro IP além dos especificados pode acessar a conta. Você simplesmente precisa criar uma entrada com o modo ‘w’ em vez 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 faz o seguinte:
- todos os IPs podem usar imap da conta 12345 ( [email protected])
- apenas o IP 123.234.123.234 pode usar pop3 para esta conta - todos os outros IPs não podem!
- apenas o IP 123.234.123.235 pode usar smtp para esta conta - todos os outros IPs não podem!
Claro que você pode combinar todos os recursos e criar várias entradas de IP para modos e serviços diferentes.
Caso de uso
Ok, algumas coisas da vida real agora. Imagine que você tem um endereço de e-mail que é usado pela sua loja online para enviar e-mails. Ninguém mais deve enviar e-mails com esta conta, mas você gostaria de verificar se alguém responde aos e-mails da sua loja. Isso, novamente, deve ser feito apenas por imap, não por pop3.
Estas são as entradas que você criaria neste caso, onde 10.0.0.101 é o IP do servidor web com sua loja e 12345 é o mailuser_id da sua conta de e-mail.
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’);
Nenhum outro IP além de 10.0.0.101 pode acessar smtp desta conta de e-mail específica e ninguém pode acessar pop3 para ela. Imap está disponível para todos os IPs.
Não se esqueça do IPv6! Se seu servidor ou o cliente que você deseja especificar tiver um endereço ipv4 e um endereço ipv6, você deve adicionar ambos!
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.