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 NULL

Agora 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!

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.