Назад | Перейти на главную страницу

Postfix и PostFWD (Postfix Firewall Daemon) - интеграция двух

Мне нужен был способ агрессивно ограничивать количество писем, отправляемых в определенный домен (весь домен), любое письмо, которое превышает лимит скорости, должно быть отклонено или отброшено. Не отсрочено или отложено.

Я не могу использовать Exim, вот и мы, с Postfix и PostFWD, и с парой проблем.

Некоторые версии ..

Postfix v2.6.6
PostFWD v1.3.5
CentOS 6.8 x64

Итак, для начала я проверяю, что мое правило ограничения скорости существует в postfwd и правильно интерпретируется из postfwd.cf в каталоге postfix (это так):

[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 ~]#

Вышеуказанная скорость ограничивает всю исходящую почту, предназначенную для чего-либо @ dave-byrne.co.uk, до 3 писем в течение 30-минутного окна. Этот домен принадлежит мне для тестирования, но в производственной среде это будет ограничивать скорость сообщений, привязанных к внешнему шлюзу электронной почты на 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 ~]#

Затем я запускаю образцы запросов на сервере PostFWD, который прослушивает внутренний порт 10040. Вы можете видеть, что 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, показывающая ограничение скорости, применяемое к 4-му сообщению выше

Oct 19 17:15:47 monitoringtest postfwd[25933]: [RULES] rule=0, id=davelimit001, client=root@monitoringtest.co.uk[168.100.1.7], 
sender=<root@monitoringtest.co.uk>, recipient=<admin@dave-byrne.co.uk>, 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 и отправляю электронные письма администратору [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: root@monitoringtest.co.uk
250 2.1.0 Ok
RCPT TO: admin@dave-byrne.co.uk
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 раз, четвертый должен иметь ограниченную скорость, как это было при использовании netcat для прямого запуска их в PostFWD. Но это не так, postfix просто весело занимается своими делами, ретранслируя почту так, как считает нужным. Я могу послать сотню и даже не подумает об ограничении скорости. За это время PostFWD НИЧЕГО не выводит в журналы, он вообще не попадает, ничего не передает, ничего не блокирует. Postfix не использует PostFWD, хотя он установлен в smtpd_recipient_restrictions как check_policy_service.

И здесь я застрял. Прошло 3 дня, и я ничего не понял. Кто-нибудь когда-либо раньше успешно использовал PostFWD (Postfix Firewall Daemon) с любым типом набора правил, независимо от ограничения скорости. Я открыт для многих предложений, однако я не могу перейти с постфикса, я не могу изменить ОС и не могу передать на внешний промежуточный почтовый ретранслятор из-за проблем с безопасностью и проблем рабочего процесса с тем, что на самом деле отправляется.

Всем спасибо, Дэйв.

Сразу после того, как я задал этот вопрос, я понял, что ограничения получателей постфикса выполняются в том порядке, в котором они появляются в 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 ~]#

Возвращал жесткое «ОК» на «permission_mynetworks». ОК остановит обработку дальнейших ограничений.

Я решил свою проблему, поместив check_policy_service в начало списка ограничений получателя smtp. Если PostFWD передает письмо, он отвечает «DUNNO» или, скорее, «DUNNO / OK», это проходит, но продолжает выполнять дальнейшие ограничения smtp.

При этом PostFWD мог свободно пересылать почту, которая не активировала ограничение скорости, но как только это произошло, он ответил с отказом 421. Именно то, что я хотел.

Так что имейте в виду, порядок, в котором вы ограничиваете, и то, что вы фактически ограничиваете, имеет большое значение.

Обратите внимание, что это частный внутренний почтовый сервер, который служит одной очень конкретной цели. Не используйте этот код для рабочего или общего почтового сервера.