POSTFIX:限制特定用户可以发送电子邮件的速率


13

我们有一个服务器CentOS服务器设置,该服务器托管我们的网站和电子邮件服务器(使用POSTFIX)。我们分别使用Virtualmin和Webmin管理系统。

通常,对于我们设置的每个站点,我们都会在系统上为客户提供一个电子邮件帐户。尤其是一位客户认为,批量发送数千封电子邮件是一个好主意。发生这种情况时,邮件服务器将变得无响应,并且在处理队列时,其他客户的邮件也会掉线。

有没有一种方法可以限制为系统的某个特定用户而不是每个用户发送电子邮件的速率?还有是否应该更改设置,以便用户无法执行的任何操作都可能导致其他用户的邮件服务器开始出现故障?

谢谢

Answers:



23

令我惊讶的是,这个老问题的所有其他答案都是仅链接的。因此,我将用几句话来描述如何为这项工作实现我最喜欢的解决方案。

链接@ 84104曾建议,虽然很有用,不能用正确实现每发件人率。smtpd_client限制不是为了流量控制,而是为了帮助客户端软件:“针对建立过多连接的客户端采取措施”。虽然人们可以找到建议,如这一个,它肯定会有所帮助。作为@E。Yazici建议,需要一个用于后缀的插件。我个人觉得policyd所推荐的@Janne皮卡赖宁相当麻烦的,虽然它被认为是一个标准。

我最喜欢的插件是postfwd,因为它既轻便又容易。还值得注意的是,这在Plesk或其他类似产品中非常容易使用,而不会影响Plesk复杂的配置文件集。Plesk中的电子邮件速率限制仅在版本12中实现,但策略功能仍然受到限制。

首先从上面的网站下载最新的插件。我相信与Ubuntu和Debian相比,CentOS没有rpm。但是,建议使用最新版本。更具体地说,版本1.32(例如,Ubuntu 14.04LTS存储库中存在)有一个令人讨厌的错误,阻止了它正常运行。1.35版对此进行了整理。

确保存在这些 PERL模块。如果使用Debian或Ubuntu,则可以从存储库中安装,以便所有依赖项自动得到整理,然后替换/usr/sbin/postfwd为最新版本。

然后创建规则集。创建一个诸如/etc/postfwd.cf或的文件,/etc/postfix/postfwd.cf并添加:

id=R001; sender=~/.*/; action=rate(sender/100/86400/REJECT only 100 messages per day for $$sender)
id=R002; sender=~/.*/; action=rate(sender/50/3600/REJECT only 50 messages per hour for $$sender)

上面的规则集显然有两个对所有发件人进行评估的规则。该rate动作的语法为:

rate (<item>/<max>/<time in sec>/<action>)

其他费率示例可以在此处找到。可以在文档中找到有关语法的参考。类似的讨论可以在这里找到。如果实施了SASL(例如鸽舍),则可以安全地替换sendersasl_username。您可以使用以下-C选项测试规则集的有效性:

postfwd -f /etc/postfwd.cf -C

之后,您可以选择创建一个专用用户和组,postfwd在该用户和组下将运行并启动postfwd:

postfwd --daemon -f /etc/postfwd.cf -u postfwd -g postfwd 

如果是从apt(Debian,Ubuntu等)安装的,则下面还应该有一个配置文件/etc/default/postfwd,您可以正确启动该服务,例如sudo service postfwd start

然后查看日志以验证postfwd正在侦听。Postfwd使用与postfix相同的日志(例如/var/log/mail/usr/local/psa/var/log/maillog等),并使用postfwd 1.35 ready for input适当的一行。

然后,让postfix知道使用postfwd。编辑postfix conf文件(通常为/etc/postfix/main.cf),并在以下行中:

smtpd_recipient_restrictions = permit_mynetworks,...

添加check_policy_service inet:127.0.0.1:10040。请考虑放置此顺序的顺序smtpd_recipient_restrictions非常重要,最终可能会花费大量时间来诊断可能出了什么问题。正如在解释这个问题,如果检查返回OK或拒绝那么后缀不会继续到下一个,所以你应该把这个高。

最后,要检查该设置是否有效,您可以指定一个非常小的限制(例如1),甚至可以添加一个规则id=DEFAULT; action=dunno。无论如何,任何规则命中都会被记录下来。另请注意,每个发件人的速率限制不区分具有单个收件人的多个电子邮件或具有多个收件人的单个电子邮件。

然后从一个帐户(在该服务器中)发送电子邮件并查看日志:

grep "RULES" /var/log/mail

其他链接:postfwd quickstart


1
过去这个问题引起了轰动!感谢您抽出宝贵的时间来提供这样一个经过深思熟虑的答案。我很佩服!
WarpKid 2015年

1
我在任何smtpd_recipient_restrictions带有空格的条目上使用的postfix barfs版本,因此我必须postfwd_ratelimit = check_policy_service inet:127.0.0.1:10040在/etc/postfix/main.cf中进行定义,然后在/etc/postfix/master.cf中对其进行引用,例如smtpd_recipient_restrictions=...,$postfwd_ratelimit,...
Tom McClure

要在Ubuntu中重新启动后缀:sudo postfwd -f /etc/postfix/postfwd.cf --pidfile=/var/run/postfwd.pid --reload
Wtower

至少使用Ubuntu 16.04,我发现我需要更改规则中的通配符以使用.+(至少1个)而不是.*(至少0个),以便规则不匹配缺少的字段。
TommyPeanuts



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.