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

War*_*Kid 15 postfix

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

一般来说,对于我们设置的每个站点,我们都会在我们的系统上为客户提供一个电子邮件帐户。特别是一位客户认为批量发送数千封电子邮件是个好主意。发生这种情况时,邮件服务器将停止响应,并且在处理队列时其他客户的邮件将停止运行。

有没有一种方法可以限制为系统的一个特定用户而不是每个人发送电子邮件的速率?是否还有我们应该更改的设置,以便用户不能做任何事情都会导致邮件服务器开始为其他用户失败?

谢谢

Wto*_*wer 25

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

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

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

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

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

然后创建规则集。创建一个文件,例如/etc/postfwd.cfor/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)
Run Code Online (Sandbox Code Playgroud)

上面的规则集显然有两个规则可以评估所有发件人。rate动作的语法是:

rate (<item>/<max>/<time in sec>/<action>)
Run Code Online (Sandbox Code Playgroud)

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

postfwd -f /etc/postfwd.cf -C
Run Code Online (Sandbox Code Playgroud)

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

postfwd --daemon -f /etc/postfwd.cf -u postfwd -g postfwd 
Run Code Online (Sandbox Code Playgroud)

如果从 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,...
Run Code Online (Sandbox Code Playgroud)

添加check_policy_service inet:127.0.0.1:10040. 请注意,您放置它的顺序smtpd_recipient_restrictions非常重要,您最终可能会花费大量时间来诊断可能出现的问题。正如在这个问题中所解释的,如果一个检查返回 OK 或 REJECT 那么 postfix 不会继续到下一个,所以你应该把这个高。

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

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

grep "RULES" /var/log/mail
Run Code Online (Sandbox Code Playgroud)

其他链接:postfwd 快速入门


Jan*_*nen 9

Postfix-Policyd对此有很大帮助。