Email

exim4 - 為什麼只使用 acl_not_smtp 限制出站郵件到智能主機的速率?

  • March 14, 2017

為了限制每個收件人的外發電子郵件(所有電子郵件都由同一使用者發送),我一直在一個非常簡單的環境中進行一些測試:

                                        The Webs              

                                            ^                 
                                            |                 
+-------------------+   SMTP?         +--------+---------+       
|                   +---------------> | mail.example.com |       
| billyw.localhost  |                 |   (smarthost)    |       
|    (exim4)        |                 |                  |       
+-------------------+                 +------------------+       

billyw.localhost是 Debian 機器。使用dpkg-reconfigure exim4-config,我將其設置為mail.example.com用作智能主機。

目前,我通過添加 ACL 來限制速率acl_not_smtp

acl_not_smtp = acl_check_not_smtp

acl_check_not_smtp:

 # Rate limit based on the recipient address
 discard
   ratelimit = 7 / 1m / per_mail / $recipients
   log_message = Rate limit exceeded for $recipients: $sender_rate/$sender_rate_period (max $sender_rate_limit)

 accept

我正在使用以下命令對此進行測試billyw.localhost

for i in {1..10}; do
 mail -s testing billyw@mypersonalemail.com <<< ''
 mail -s testing billyw@myotherpersonalemail.com <<< ''
done

此配置似乎按預期工作;它允許向每個收件人發送 7 封電子郵件,並丟棄每個收件人的最後 3 封電子郵件。

但是,如果我嘗試在與 SMTP 相關的 ACL 中使用相同的配置,例如:

  • acl_smtp_connect
  • acl_smtp_rcpt
  • acl_smtp_mail

然後ACL的限速入口沒有被hook,10條消息全部發送。

為什麼在 smtp 相關的 ACL 中沒有應用速率限制?

acl_not_smtp相當於acl_dataSMTP 流量。嘗試在該 ACL 中進行速率限制。SMTP 連接為您提供了更多的 ACL 選項,您可以在其中放置消息。(注意:discard是一個黑洞變體,accept所以你不會看到拒絕消息。)丟棄是相當激烈的,我會使用deferordeny用於 SMTP 流量。

Exim Specification第 42 章第 38 節介紹了速率限制。您可以使用修改後的配置進行測試,這樣您在測試時可以比實施後更嚴格地限制速率。在實施之前留出時間清除測試限制。

嘗試將以下內容添加到您的acl_smtp_rcpt

defer
 ratelimit = 7 / 1m / $recipients
 message = Rate limit exceeded for $recipients: \
           $sender_rate/$sender_rate_period (max $sender_rate_limit)

/usr/bin/mail執行本地sendmail程序來傳遞郵件,而不是通過網路堆棧進行連接。在您的情況下,exim4 被用作 sendmail 的替代品。郵件將被視為非 smtp 遞送。需要使用非 smtp ACL 進行速率限制。

引用自:https://serverfault.com/questions/614642