后缀:如果 RBL 和 SPF 检查通过,则接受,否则为 DUNNO/灰名单。怎么做?

mic*_*hau 5 postfix spam spf rbl whitelist

我想接受所有通过 RBL 和 SPF 检查(可能还有一些检查,但这些是我的最低要求)的客户,并将那些没有通过的客户列入灰名单。当客户端通过 SPF 检查(存在 SPF 记录,没有失败,没有软失败)时,我们可以非常确定它不是僵尸网络僵尸,而是会重试交付的 MTA,因此将此类客户端列入灰名单毫无意义。

到目前为止,我一直在使用Whitelister,它可以实现这个规则,但它在过去 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
Run Code Online (Sandbox Code Playgroud)

nyo*_*yov 4

我不知道我可以用什么来代替???

A:check_policy_service


长答案:

我希望后缀源实现应该可以reject_rbl_client在 那里添加另一个函数,该函数实现具有逆逻辑的函数的副本 - 不是回复而是成功检查。smtpd/smtpd_check.c
reject_rbl_addrDUNNOOK

--- 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 {
Run Code Online (Sandbox Code Playgroud)

然后您可以在 postfix' 配置中使用它而不是reject_rbl_client.

但这意味着额外的、持续的维护以保持更新;当新版本出现时修补您的源代码。所以我不希望有人走那条路。

相反,您将需要使用外部策略检查,就像该whitelister程序为您所做的那样。这意味着您可以check_policy_service在这里使用,您只需要正确的工具/程序即可进行交互。(顺便说一句,考虑从那里升级是件好事,因为它被丢弃是有原因的。它无法检查任何 IPv6 地址。)

检查替代方案,有(据我所知,在 debian 存储库中)

所有这些都是 Python 实现 - 因此虽然它们可能无法立即执行您想要的操作(我没有检查过),但它们应该相当容易适应。

进一步的还有

  • 后缀-policyd-spf-perl,
  • mtpolicyd (Perl),
  • 更复杂和模块化的“ PolicyD ”(Perl)

可能还有更多。您甚至可以根据许多可用的 SPF 库编写自己的代码。

有关的文档check_policy_service有点简单,只有示例代码简介解释了期望的值check_policy_service

结果可以是 Postfix access(5) 映射中允许的任何操作。

因此,访问是下一站,这(也许)解释了更改DUNNOforOK会将“可能通过,首先运行进一步检查”(> 灰名单)逻辑转换为“邮件已通过,在此停止规则处理”。

现在您知道如何将任何策略服务器转变为白名单系统,即使它不是开箱即用的。


附录:如何设置策略服务器,来自policyd-spf自述文件(尽管我希望您知道这一点,基于 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.
Run Code Online (Sandbox Code Playgroud)