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

Постфикс: ACCEPT, если проверки RBL и SPF проходят, DUNNO / greylist в противном случае. Как это сделать?

Я хотел бы принимать всех клиентов, которые проходят проверки RBL и SPF (и, возможно, некоторые проверки, но это минимальные требования для меня), и заносить в серый список тех, кто этого не делает. Когда клиент проходит проверку SPF (запись SPF существует, нет сбоев, нет мягких сбоев), мы можем быть уверены, что это не зомби ботнета, а MTA, который попытается повторить доставку, поэтому нет особого смысла в серых списках таких клиентов.

До сих пор я использовал Белый список, который может реализовать это правило, но он не поддерживался последние 10 лет или около того и недоступен в современных дистрибутивах, поэтому я ищу альтернативы. Насколько я понимаю, Postfix может отклонять только тех клиентов, которые находятся в RBL, но не может использовать RBL как части более сложных условий, поэтому я не вижу способа использовать reject_rbl_client Вот. Есть ли демон политики, который может выполнять такие проверки?

Мои ограничения на получателей в main.cf следующие. Я не знаю, что я могу заменить ???:

smtpd_recipient_restrictions =
        check_sender_access regexp:/etc/postfix/sender_access_regexp,
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_unknown_sender_domain,
        reject_unauth_destination,
        ???,
        check_policy_service unix:postgrey/postgrey.sock

Я не знаю, что я могу заменить ???

А: check_policy_service


Длинный ответ:

Исходный код postfix реализует reject_rbl_client в smtpd/smtpd_check.c
Я ожидаю, что он должен сработать, чтобы добавить туда еще одну функцию, которая реализует копию reject_rbl_addr функция с обратной логикой - без ответа DUNNO но OK для успешной проверки.

--- a/postfix/src/smtpd/smtpd_check.c
+++ b/postfix/src/smtpd/smtpd_check.c
     rbl = find_dnsxl_addr(state, rbl_domain, addr);
     if (!SMTPD_DNSXL_STAT_OK(rbl)) {
-       return (SMTPD_CHECK_DUNNO);
+       return (SMTPD_CHECK_OK);
     } else {

Который затем можно было бы использовать в конфигурации postfix вместо reject_rbl_client.

Но это означает дополнительное постоянное обслуживание, которое необходимо обновлять; исправление исходного кода по мере появления новых выпусков. Так что я не ожидаю, что кто-то пойдет по этому пути.

Вместо этого вы захотите использовать проверку внешней политики, поскольку whitelister программа сделала за вас. Это означает, что вы можете использовать check_policy_service здесь вам просто нужен правильный инструмент / программа для взаимодействия. (Между прочим, неплохо было бы подумать об обновлении с этого, поскольку причина его отказа. Он не проходит проверку ни на одном IPv6-адресе.)

Проверяя альтернативы этому, есть (о которых я знаю, в репозиториях debian)

все они являются реализациями Python, поэтому, хотя они могут не делать то, что вы хотите из коробки (я не проверял), они должны быть довольно легко адаптируемыми.

Остальные

и, возможно, еще тонну. Вы даже можете написать свой собственный, основанный на многих доступных библиотеках SPF.

Документация о check_policy_service немного светлее, только пример рекламного кода объясняет, какие ценности check_policy_service надеется:

Результатом может быть любое действие, разрешенное в карте доступа Postfix (5).

Так доступ следующая остановка, которая (возможно) объясняет, что изменение DUNNO для OK превратится "возможно-пройти, сначала выполните дальнейшие проверки"(> серый список) логику в"почта прошла, остановите обработку правил здесь".

Итак, теперь вы знаете, как превратить любой сервер политики в систему белых списков, даже если он не делает этого из коробки.


Приложение: Как настроить сервер политик из policyd-spf README (хотя я думаю, вы знаете об этом, основываясь на белом списке на postgrey).

Installing
----------

 1. Add the following to /etc/postfix/master.cf:

        policyd-spf  unix  -       n       n       -       0       spawn
            user=policyd-spf argv=/usr/bin/policyd-spf

 2. Configure the Postfix policy service in /etc/postfix/main.cf:

        smtpd_recipient_restrictions =
            ...
            reject_unauth_destination
            check_policy_service unix:private/policyd-spf
            ...

        policyd-spf_time_limit = 3600

    NOTE:  Specify check_policy_service AFTER reject_unauth_destination or
    else your system can become an open relay.

 3. Reload Postfix.

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

В main.cf:

smtpd_recipient_restrictions =
    check_sender_access regexp:/etc/postfix/sender_access_regexp,
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unknown_sender_domain,
    reject_unauth_destination,
    check_policy_service unix:private/policy-spf,
    check_policy_service unix:postgrey/postgrey.sock

в /etc/postfix-policyd-spf-python/policyd-spf.conf:

Mail_From_pass_restriction = permit

Если теория верна, следует установить уже упомянутый postfix-policyd-spf-python и данная реконфигурация. Тестирую прямо сейчас ...