Безопасность почты · 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, вам нужно добавить оба!
Get new posts in your inbox
No spam. Unsubscribe anytime.