使用最终 ~all 规则的 SPF 记录有什么意义?

What's the point of having an SPF record with a final ~all rule?

在过去的一个小时里,我一直在深入研究 SPF,浏览 RFC-4408, and going over another tutorial

我拥有自己的域,在该域​​后面的服务器上安装了 postfix。除了我的普通地址外,我还希望能够使用 GMail 发送电子邮件,使用我自己的电子邮件地址作为发件人。

我确实收到了很多垃圾邮件发送者使用我的电子邮件地址作为 "From" 行 :( 据我了解,SPF 用于检查给定的 SMTP 服务器是否允许发送具有特定发件人域名的邮件。这将有助于上述反弹。

很明显,如果我想通过 gmail 发送邮件,我必须允许 gmail 通过 SPF 记录以我的名义发送。

their help之后,我添加了以下TXT记录:

v=spf1 include:_spf.google.com ~all

他们特别建议不要使用-all作为失败规则。

鉴于 ~all 是一个 "soft fail",它仍然接受所有消息,启用 SPF 有什么意义?

我试图从外部主机发送一些邮件,它们被接受了,唯一的区别是我的邮件服务器假定没有 SPF 记录。

通过 GMail 发送时的日志摘录:

May  8 15:15:58 h2150855 policyd-spf[6184]: None; identity=helo; client-ip=300.300.300.300; helo=mail-lf0-f52.google.com; envelope-from=mygmailaddress@gmail.com; receiver=mypersonaladdress@example.com
May  8 15:15:58 h2150855 policyd-spf[6184]: Pass; identity=mailfrom; client-ip=300.300.300.300; helo=mail-lf0-f52.google.com; envelope-from=mygmailaddress@gmail.com; receiver=mypersonaladdress@example.com

...并通过第三方服务器发送:

May  8 15:19:17 h2150855 policyd-spf[6554]: None; identity=helo; client-ip=301.300.300.300; helo=theserver.example.com; envelope-from=exhuma@theserver.example.com; receiver=mypersonaladdress@example.com
May  8 15:19:17 h2150855 policyd-spf[6554]: None; identity=mailfrom; client-ip=301.300.300.300; helo=theserver.example.com; envelope-from=exhuma@theserver.example.com; receiver=mypersonaladdress@example.com

我能看到的唯一区别是 postfix SPF 插件将 gmail 邮件明确标记为 Pass,而另一个标记为 None

我现在认为添加 SPF 并没有真正对我的邮件设置做任何事情,我正在考虑再次删除它。

最好的办法是仅将 ~all 用于测试,将 -all 用于生产。甚至 RFC 也建议:

If domain owners choose to publish SPF records, it is RECOMMENDED that they end in "-all", or redirect to other records that do, so that a definitive determination of authorization can be made.

有些网站在遇到软故障时实际上会拒绝电子邮件,或将其定向到垃圾邮件文件夹,但简单地强制硬故障将改善网站拒绝邮件的变化,这些邮件试图伪造您的域发件人。

它推荐 ~all 而不是 -all 的原因是它与 DMARC 的交互方式;使用 -all 的建议早于 DMARC 的存在。 -all 确实是一个有效(且正确)的设置 如果您单独使用 SPF,但是 -all 通常会破坏 DMARC,因为它的规则不会被评估。如果您设置 ~all 默认 SPF 操作,它将决定交给 DMARC 层,此时您可以说 "we consider SPF softfail to be a hardfail",然后继续获得 DMARC 的其他好处。

所以,简而言之,如果您使用 DMARC,~all 并非毫无意义 。 (?all 总是 毫无意义!)

~all 在某些 DMARC 软件包(如 OpenDMARC)中默认解释为失败,但您可以更改标志以便将其解释为通过。

同样,?all 在 OpenDMARC 中默认解释为失败。

相比之下,-all 总是被解释为失败,无论您部署了 DMARC 包如何。

我写了一个 post 涵盖了这个主题:Why SPF Authentication Fails

它还涵盖了其他相关概念,包括 none、neutral、temperror、permerror 等