exim4 - Почему ограничение исходящей почты на смарт-хост работает только с acl_not_smtp?
Чтобы ограничить количество исходящих писем для каждого получателя (все письма отправляются одним и тем же пользователем), я провел некоторое тестирование в очень простой среде:
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 на каждого получателя.
Однако, если я попытаюсь использовать эту же конфигурацию в ACL, связанном с SMTP, например:
acl_smtp_connect
acl_smtp_rcpt
acl_smtp_mail
Тогда запись ACL, ограничивающая скорость, не перехватывается и все 10 сообщений отправляются.
Почему ограничение скорости не применяется, когда оно помещено в ACL, связанный с SMTP?
1 ответ
acl_not_smtp
эквивалентно acl_data
для SMTP-трафика. Попробуйте ограничение скорости в этом ACL. SMTP-соединения дают вам больше возможностей ACL, где вы можете разместить сообщение. (Заметка: discard
это вариант черной дыры accept
так что вы не увидите сообщения об отклонении.) Отбрасывание довольно радикально, и я бы использовал defer
или же deny
для SMTP-трафика.
Ограничение скорости описано в главе 42, раздел 38 спецификации Exim. Вы можете тестировать с измененной конфигурацией, чтобы вы могли оценить ограничение более жестко во время тестирования, чем когда бы вы его не внедрили. Дайте время, чтобы пределы теста очистились перед внедрением.
Попробуйте добавить следующее к вашему 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 доставка. Ограничение скорости должно быть сделано с использованием ACL не-SMTP.