我需要一种方法来严格限制发送到特定域(整个域)的邮件数量,任何超过速率限制的邮件都需要被拒绝或丢弃。不是延迟或延期。
我无法使用 Exim,因此我们使用 Postfix 和 PostFWD,以及一些问题。
一些版本..
Postfix v2.6.6
PostFWD v1.3.5
CentOS 6.8 x64
因此,首先,我要验证我的速率限制规则是否存在于 postfwd 中,并且是否可以从 postfix 目录中的 postfwd.cf 正确解释(确实如此):
[root@monitoringtest ~]# /usr/local/postfwd/sbin/postfwd -f /etc/postfix/postfwd.cf -C
Rule 0: id->"davelimit001"; action->"rate(recipient_domain/3/1800/421 4.7.1 - Sorry, exceeded 3 messages in 30 minutes.)"; recipient_domain->"==;dave-byrne.co.uk"
[root@monitoringtest ~]#
上述速率限制了 30 分钟内发往 @dave-byrne.co.uk 的所有出站邮件数量,即 3 封。该域是我自己的,用于测试,但在生产中,这将限制发往外部电子邮件到 SMS 网关的消息的速率。
快速检查以确保 Postfix 和 PostFWD 已启动并正在监听(它们确实已启动):
[root@monitoringtest ~]# netstat -anpl | grep ':10040\|:25'
tcp 0 0 127.0.0.1:10040 0.0.0.0:* LISTEN 4093/postfwd.pid
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 4190/master
tcp 0 0 :::25 :::* LISTEN 4190/master
[root@monitoringtest ~]#
然后,我向内部监听端口 10040 的 PostFWD 服务器发送示例请求。您可以看到 PostFWD 传递了(使用其 DUNNO 操作)3 封邮件,然后对第 4 封邮件应用速率限制并以 421 拒绝它。完美。现在只需让 Postfix 使用 PostFWD 即可!
[root@monitoringtest ~]# nc 127.0.0.1 10040 </usr/local/postfwd/tools/request.sample
action=DUNNO
[root@monitoringtest ~]# nc 127.0.0.1 10040 </usr/local/postfwd/tools/request.sample
action=DUNNO
[root@monitoringtest ~]# nc 127.0.0.1 10040 </usr/local/postfwd/tools/request.sample
action=DUNNO
[root@monitoringtest ~]# nc 127.0.0.1 10040 </usr/local/postfwd/tools/request.sample
action=421 4.7.1 - Sorry, exceeded 3 messages in 30 minutes.
[root@monitoringtest ~]#
/var/log/maillog 中的摘录显示了适用于上述第四条消息的速率限制
Oct 19 17:15:47 monitoringtest postfwd[25933]: [RULES] rule=0, id=davelimit001, [email protected][168.100.1.7],
sender=<[email protected]>, recipient=<[email protected]>, helo=<dave-byrne.co.uk>, proto=ESMTP, state=RCPT, rate=rate/4/21.67s, delay=0.00s,
hits=davelimit001, action=421 4.7.1 - Sorry, exceeded 3 messages in 30 minutes.
因此,为了与 Postfix 集成,我在 postfix main.cf 文件中添加了以下内容:
[root@monitoringtest ~]# tail -n 3 /etc/postfix/main.cf
127.0.0.1:10040_time_limit = 3600
smtpd_recipient_restrictions = permit_mynetworks,
check_policy_service inet:127.0.0.1:10040
[root@monitoringtest ~]#
这一切都符合 PostFWD 文档。
然后我在本地使用 telnet 连接到 Postfix 并将电子邮件发送到 admin[at]dave-byrne.co.uk。如下所示:
[root@dedweb ~]# telnet <test-server-IP-here> smtp
Trying xx.xx.xx.xx...
Connected to xx.xx.xx.xx.
Escape character is '^]'.
220 monitoringtest.xxxxxxxxx.com ESMTP Postfix
HELO dave-byrne.co.uk
250 monitoringtest.xxxxxxxxx.com
MAIL FROM: [email protected]
250 2.1.0 Ok
RCPT TO: [email protected]
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
test1.
.
250 2.0.0 Ok: queued as 946B621C15
我这样做了 4、5、6 次,第 4 次应该限制速率,就像使用 netcat 直接向 PostFWD 发送邮件时一样。但事实并非如此,postfix 只是愉快地继续转发邮件,就像它认为应该的那样。我可以发送一百封邮件,它甚至不会考虑速率限制。在此期间,PostFWD 不会在日志中打印任何内容,它根本没有命中,它没有传递任何东西,它没有阻止任何东西。Postfix 不使用 PostFWD,即使它在 smtpd_recipient_restrictions 中设置为 check_policy_service。
这就是我被困住的地方。3 天过去了,我还是一无所知。有没有人曾经成功使用过 PostFWD(Postfix 防火墙守护进程),使用任何类型的规则集,无论速率限制如何。我愿意接受许多建议,但是我无法从 Postfix 更改,无法更改操作系统,也无法交给外部中间邮件中继,因为安全问题和实际发送内容的工作流程问题。
谢谢大家,戴夫。
答案1
问完这个问题后,我立即意识到 Postfix 收件人限制是按照它们在 main.cf 中出现的顺序执行的。所以我的
[root@monitoringtest ~]# tail -n 3 /etc/postfix/main.cf
127.0.0.1:10040_time_limit = 3600
smtpd_recipient_restrictions = permit_mynetworks,
check_policy_service inet:127.0.0.1:10040
[root@monitoringtest ~]#
在“permit_mynetworks”处返回硬性“OK”。OK 将停止处理进一步的限制。
我通过将 check_policy_service 置于 smtp 收件人限制的顶部解决了我的问题。如果 PostFWD 传递了一封邮件,它会回复“不知道”或“不知道/确定”,这样就通过了,但会继续运行进一步的 smtp 限制。
有了这个,PostFWD 可以自由传递未触发速率限制的邮件,但一旦触发,它就会回复 421 拒绝。这正是我想要的。
所以请记住,限制的顺序以及实际限制的内容非常重要。
请注意,这是一个私人内部邮件服务器,仅用于一个非常特定的目的。请勿将此代码用于生产或共享邮件服务器