Postfix:如果 RBL 和 SPF 检查通过,则接受,否则未知/灰名单。如何操作?

Postfix:如果 RBL 和 SPF 检查通过,则接受,否则未知/灰名单。如何操作?

我希望接受所有通过 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

答案1

我不知道我能用什么来代替???

A:check_policy_service


长答案:

Postfix 源代码实现reject_rbl_clientsmtpd/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 实现 - 因此虽然它们可能无法满足您的开箱即用需求(我没有检查过),但它们应该相当容易适应。

其他内容包括

  • postfix-policyd-spf-perl,
  • 策略(Perl),
  • 更加复杂和模块化的政策D“(Perl)

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

关于check_policy_service有点轻,只有示例代码简介解释价值观的check_policy_service期望:

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

所以使用权是下一站,这(也许)解释了换乘DUNNOOK变成“可能通过,首先运行进一步检查“(> 灰名单)逻辑转换为”邮件已通过,在此停止规则处理“。

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


附录:如何设置策略服务器,来自policyd-spfREADME(尽管我希望您知道这一点,基于 postgrey 上的 whitelister)。

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.

答案2

理论:如果您在灰名单检查之前添加 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以及给定的重新配置。现在就测试它...

相关内容