![Postfix:如果 RBL 和 SPF 检查通过,则接受,否则未知/灰名单。如何操作?](https://linux22.com/image/741781/Postfix%EF%BC%9A%E5%A6%82%E6%9E%9C%20RBL%20%E5%92%8C%20SPF%20%E6%A3%80%E6%9F%A5%E9%80%9A%E8%BF%87%EF%BC%8C%E5%88%99%E6%8E%A5%E5%8F%97%EF%BC%8C%E5%90%A6%E5%88%99%E6%9C%AA%E7%9F%A5%2F%E7%81%B0%E5%90%8D%E5%8D%95%E3%80%82%E5%A6%82%E4%BD%95%E6%93%8D%E4%BD%9C%EF%BC%9F.png)
我希望接受所有通过 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_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 存储库中)
- tumgreyspf
- postfix-policyd-spf-python 和
- 布莱,
它们都是 Python 实现 - 因此虽然它们可能无法满足您的开箱即用需求(我没有检查过),但它们应该相当容易适应。
其他内容包括
可能还有更多。您甚至可以根据许多可用的 SPF 库编写自己的 SPF。
关于check_policy_service
有点轻,只有示例代码简介解释价值观的check_policy_service
期望:
结果可以是 Postfix 访问 (5) 映射中允许的任何操作。
所以使用权是下一站,这(也许)解释了换乘DUNNO
将OK
变成“可能通过,首先运行进一步检查“(> 灰名单)逻辑转换为”邮件已通过,在此停止规则处理“。
所以现在您知道如何将任何策略服务器转变为白名单系统,即使它不是开箱即用的。
附录:如何设置策略服务器,来自policyd-spf
README(尽管我希望您知道这一点,基于 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以及给定的重新配置。现在就测试它...