Безопасность почты · 4 min read · Sep 22, 2025

Улучшите защиту от спама в dovecot, ограничив доступ к почтовым аккаунтам по IP-адресу (например, с ISPConfig 3)

Что мы сделаем

Этот гид покажет вам, как добавить ограничения по IP для отдельных почтовых аккаунтов при использовании dovecot с MySQL.

Это особенно полезно, если вам нужно получить доступ к почтовому аккаунту только с одного IP или нескольких IP, или если вы хотите заблокировать определенные IP-адреса от доступа к почтовому аккаунту (например, из-за злоупотребления спамом).

Предварительные условия

  • рабочая установка dovecot с виртуальными пользователями через MySQL (предпочтительно управляемая ISPConfig 3)

Если вы не используете ISPConfig 3, вам, возможно, придется изменить имена таблиц и/или столбцов в запросах.

Изменения в вашей системе

Сначала нам нужно создать новую таблицу базы данных на вашем почтовом сервере. В этом руководстве мы добавим ее в базу данных ISPConfig dbispconfig.

Откройте консоль MySQL:
mysql -u root -D dbispconfig -p

После входа создайте новую таблицу ограничений IP с помощью этого запроса:

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;

Теперь вам нужно изменить конфигурацию sql dovecot. На установках ISPConfig 3 (например, Debian/Ubuntu) она должна находиться в /etc/dovecot/dovecot-sql.conf

Измените эти строки:

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'

(если вы не используете последнюю версию ISPConfig 3, строки в вашей конфигурации могут немного отличаться)

на:

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

Теперь перезапустите dovecot:
service dovecot restart (или /etc/init.d/dovecot restart, в зависимости от вашей системы)

Следите за журналом почты и/или системой! Если вы видите ошибки от вашего dovecot, значит, что-то пошло не так, и вам следует проверить ваши изменения или вернуть их обратно.
Если все работает так же, как и раньше, значит, вы готовы к работе.

Как ограничить доступ

Теперь у вас есть разные возможности для ограничения доступа к почтовому ящику. Я покажу вам, как это сделать с помощью SQL-запросов в консоли mysql, но вы также можете использовать phpMyAdmin.

Заблокировать IP

Чтобы заблокировать один IP от доступа к почтовому аккаунту, вам нужно добавить его в таблицу ограничений с режимом ‘b’:

Сначала вам нужен mailuser_id для вашего почтового аккаунта (например, [email protected]). Это простой SQL-запрос:

SELECT mailuser_id FROM mail_user WHERE email = ‘ [email protected] ‘;

Это вернет число (id) вроде 12345. Теперь добавьте запись ограничения для этого id:

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘’);

Эта запись заблокирует IP 123.234.123.234 от доступа ко всем сервисам (pop3, imap, smtp) почтового аккаунта 12345.

Если вы хотите, чтобы IP мог получать доступ к pop и imap, но предотвратить его использование smtp (отправка писем), вы можете добавить эту запись вместо:

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘smtp’);

Вы можете добавлять несколько сервисов таким образом, по одной записи для каждого. Но имейте в виду, что запись ‘’ блокирует все сервисы.

Ограничить доступ к определенным IP

Как вы можете заблокировать, вы также можете ограничить использование почтовых аккаунтов только определенными IP. Это означает, что НИКТО другой, кроме указанных, не может получить доступ к аккаунту. Вам просто нужно создать запись с режимом ‘w’ вместо ‘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’);

Эта запись делает следующее:

  • все IP могут использовать imap аккаунта 12345 ( [email protected])
  • только IP 123.234.123.234 может использовать pop3 для этого аккаунта - все другие IP не могут!
  • только IP 123.234.123.235 может использовать smtp для этого аккаунта - все другие IP не могут!

Конечно, вы можете комбинировать все функции и создавать несколько записей IP для разных режимов и сервисов.

Сценарий использования

Хорошо, теперь немного реальной жизни. Представьте, что у вас есть почтовый адрес, который используется вашим интернет-магазином для отправки писем. Никто другой не должен отправлять письма с этого аккаунта, но вы хотите проверить, отвечает ли кто-то на письма вашего магазина. Это, в свою очередь, должно быть сделано только через imap, а не через pop3.

Вот записи, которые вы бы создали в этом случае, где 10.0.0.101 - это IP веб-сервера с вашим магазином, а 12345 - это mailuser_id вашего почтового аккаунта.

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’);

Никакой другой IP, кроме 10.0.0.101, не может получить доступ к smtp этого конкретного почтового аккаунта, и никто не может получить доступ к pop3 для него. Imap доступен для всех IP.

Не забудьте про IPv6! Если у вашего сервера или клиента, который вы хотите указать, есть адреса ipv4 и ipv6, вам нужно добавить оба!

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.