我们会做什么
这个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地址,则必须添加两者!