通过按IP地址限制对邮件帐户的访问(例如使用ISPConfig 3)来改善dovecot中的垃圾邮件滥用保护。

通过按IP地址限制对邮件帐户的访问(例如使用ISPConfig 3)来改善dovecot中的垃圾邮件滥用保护。 这个howto会告诉你怎么...

我们会做什么

这个howto将向您展示如何在使用dovecot与MySQL时将单个邮件帐户添加ip限制

如果您需要从一个ip或几个ips访问邮件帐户,或者如果您想阻止特定的IP地址访问邮件帐户(例如,由于垃圾邮件滥用),这是特别有用的。

先决条件

- 通过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;

现在你必须修改dovecot的sql配置。 在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:
服务dovecot重新启动 (或/etc/init.d/dovecot重新启动 ,具体取决于您的系统)

立即关注邮件和/或系统日志! 如果您发现自己的鸽子出现错误,那么发生错误,您应该检查您的更改或恢复。
如果一切都像以前一样运行,那么你准备好了。

如何限制访问

您有不同的可能性来限制对邮箱的访问。 我会告诉你在mysql控制台上使用SQL查询的方法,但是当然可以使用phpMyAdmin。

阻止ip

要阻止单个ip访问邮件帐户,您必须将其添加到模式'b'的限制表中:

首先,您需要邮件帐户的mailuser_id(例如:my@emailaccount.com)。 这是一个简单的SQL查询:

SELECT`mailuser_id` FROM`mail_user` WHERE`email` ='my@emailaccount.com';

这将返回一个数字(id),如12345.现在添加这个id的限制条目:

INSERT INTO`mail_user_ip_restriction` VALUES(NULL,12345,'123.234.123.234','b','');

此条目将阻止ip 123.234.123.234访问邮件帐户12345的所有服务(pop3,imap,smtp)。

如果您希望ip能够访问pop和imap,但是阻止它使用smtp(发送邮件),您可以添加此条目:

INSERT INTO`mail_user_ip_restriction` VALUES(NULL,12345,'123.234.123.234','b','smtp');

您可以添加这样的多个服务,每个服务一个。 但请记住,条目“阻止所有服务”。

限制特定ips

像你可以阻止你甚至可以将邮件帐户的使用限制为单个ips。 这意味着没有其他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');

此条目执行以下操作:
- 所有ips可以使用帐号12345的imap(my@emailaccount.com)
- 只有ip 123.234.123.234可以使用pop3这个帐号 - 所有其他ips不要!
- 只有ip 123.234.123.235可以使用smtp这个帐户 - 所有其他ips不!

当然,您可以组合所有功能,并为不同的模式和服务创建多个ip条目。

用例

好的,现在有一些现实生活中的东西。 想象一下,您有一个邮件地址,由您的在线商店用于发送邮件。 没有其他人应该发送邮件与这个帐户,但你想检查有没有人回复你的商店电子邮件。 这再次只能用imap来完成,而不是pop3。

这些是在这种情况下创建的条目,其中10.0.0.101是您的商店的Web服务器的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。 所有ips都可以使用Imap。

不要忘了IPv6! 如果您要指定的服务器或客户端具有ipv4和ipv6地址,则必须添加两者!