SPF 记录中的 DNS 查找过多

Posted

技术标签:

【中文标题】SPF 记录中的 DNS 查找过多【英文标题】:Too many DNS lookups in an SPF record 【发布时间】:2012-12-25 00:49:59 【问题描述】:

我的网站需要使用 Google Apps、SendGrid 和 MailChimp 服务发送电子邮件。 Google Apps 用于接收和阅读传入我的域的电子邮件。

我需要为我的域设置 SPF 记录。以下在语法上是正确的(不确定 A 和 MX 标记):

"v=spf1 a mx 包括:_spf.google.com 包括:servers.mcsv.net 包括:sendgrid.net ~all"

但如果我用http://www.kitterman.com/getspf2.py 测试它,我会得到

PermError SPF 永久错误:DNS 查找次数过多

类似的问题 http://www.onlineaspect.com/2009/03/20/too-many-dns-lookups-in-an-spf-record/

如何优化/重写我的 SPF 记录?

【问题讨论】:

改进建议:kitterman 托管的 SPF 查询工具的链接应如下:kitterman.com/spf/validate.html 【参考方案1】:

查看SPF-tools*,它有助于将 SPF 记录从使用包含的原始记录重新组装成仅包含 ip4ip6 字段的静态记录。它可以很容易地与本地运行的 DNS 服务器或使用其 API 托管的 DNS 服务耦合在一起,以使所有内容与上游包含的内容保持同步。

*我是作者(现在和其他贡献者一起),它是在 Apache 2.0 许可下开源的。

【讨论】:

【参考方案2】:

这个 10-DNS-lookup 限制由 SPF 实施施加,以防止针对 DNS 基础设施的 DDoS 攻击。

借助DMARCLY 的安全 SPF 功能,您无需重写 SPF 记录即可解除限制。

【讨论】:

【参考方案3】:

10 次查找限制是 DNS 查找的限制。扁平化 SPF 记录以包含更少的 DNS 查找并将它们替换为 IP(扁平化)是绕过限制的一种方法。

您可以手动执行此操作,但每次其中一个提供商更改其 IP(这种情况经常发生)时,您都必须更新您的 SPF 记录。

理想的解决方案是使用 SPF 扁平化服务。这个对于小批量是免费的,或者对于每月超过 500 封电子邮件来说很便宜。它定期轮询您要包含的 SPF 记录以获取更新的 IP。

Fraudmarc.com

披露:我与这家公司无关,这不是推荐链接

【讨论】:

【参考方案4】:

几年前我写了hydrate-spf,这是一个查找工具,包括并将结果合并到一个巨大的记录中。如自述文件中所述,这种方法并不理想 - 它消除了您包含的域更新其记录的能力。但是,当您遇到允许的限制时,它会立即解决问题,并且可以通过定期更新保持一定程度的可维护性。

【讨论】:

需要小心这个。从技术上讲,长度超过 255 个字符的 SPF 记录也是无效的。 看起来我们确实需要一个现代的 SPF 替代品,考虑到所有这些在当时似乎合理的限制,但现在我们经常遇到。【参考方案5】:

我们探索了将 SPF 记录扁平化为 IP 以及创建子域。他们似乎都做了很多工作。我们从 spfproxy.org 找到了一项服务,它实际上需要几分钟的时间来设置。它们基本上使用 SPF 宏来掩盖其背后的 DNS 查找。不知道为什么更多的公司不提供这个。

【讨论】:

看起来 spfproxy.org 不再服务了。【参考方案6】:

斯威夫特的回答非常好。

上面没有提到的一种技术是查看具有自己 SPF 记录的单独子域是否可用于通过这些不同路由发送邮件的系统。

例如如果域是example.com,让谷歌应用程序从user@gapps.example.com 等地址发送。然后可以有一个 gapps.example.com 的 SPF 记录,其中包括 _spf.google.com,并且可以从主要的 example.com SPF 记录中删除 _spf.google.com,这将查找次数减少了 3。

【讨论】:

【参考方案7】:

所以,我以前从来没有这样做过,但是根据你发来的文章,这就是我想出的。

我们从:

v=spf1 a mx include:_spf.google.com include:servers.mcsv.net include:sendgrid.net ~all

在抛出 Too many DNS lookups 错误之前,我们总共进行了 10 次查找:

  2 (Initial TXT & SPF Lookups)
  2 (a & mx Lookups)
  1 (_spf.google.com)
  1 (servers.mcsv.net)
 +1 (sendgrid.net)
 -----------------
  7 Lookups

因此,即使不遵循包含的 SPF 记录,我们也有 7 次查找。


现在,让我们更深入地了解一下。

1。 _spf.google.com

google SPF 记录的计算结果为:

v=spf1 include:_netblocks.google.com include:_netblocks6.google.com ?all

每个都解析为以下值:

# _netblocks.google.com
v=spf1 ip4:216.239.32.0/19 ip4:64.233.160.0/19 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:209.85.128.0/17 ip4:66.102.0.0/20 ip4:74.125.0.0/16 ip4:64.18.0.0/20 ip4:207.126.144.0/20 ip4:173.194.0.0/16 ?all

# _netblocks6.google.com
v=spf1 ip6:2607:f8b0:4000::/36 ip6:2a00:1450:4000::/36 ?all

所以 google 又给了我们 2 次查找,使总数达到 9 次查找

2。服务器.mcsv.net

Mailchimp 有点笨拙,因为它增加了 3 个额外的查找:

v=spf1 include:spf1.mcsv.net include:spf2.mcsv.net include:spf.mandrillapp.com ?all

我想根据您通过 Mailchimp 发送的内容,您可能能够删除其中的一两条记录(但您必须自己评估)。

无论如何,这些解决方案如下:

# spf1.mcsv.net
v=spf1 ip4:207.97.237.194/31 ip4:207.97.238.88/29 ip4:207.97.240.168/29 ip4:69.20.10.80/29 ip4:69.20.41.72/27 ip4:74.205.22.1/27 ip4:69.20.90.0/26 ?all

# spf2.mcsv.net
v=spf1 ip4:204.232.163.0/24 ip4:72.26.195.64/27 ip4:74.63.47.96/27 ip4:173.231.138.192/27 ip4:173.231.139.0/24 ip4:173.231.176.0/20 ip4:205.201.128.0/24 ?all

# spf.mandrillapp.com
v=spf1 ip4:205.201.136.0/24 ip4:205.201.137.0/24 ?all

这使我们总共进行了 12 次查找(这已经超过了上限两次)。

2。 sendgrid.net

SendGrid 最终成为我们额外查找次数最少的。

v=spf1 ip4:208.115.214.0/24 ip4:74.63.202.0/24 ip4:75.126.200.128/27 ip4:75.126.253.0/24 ip4:67.228.50.32/27 ip4:174.36.80.208/28 ip4:174.36.92.96/27 ip4:69.162.98.0/24 ip4:74.63.194.0/24 ip4:74.63.234.0/24 ip4:74.63.235.0/24 include:sendgrid.biz ~all

所以这里唯一的额外查找是sendgrid.biz,其计算结果为:

v=spf1 ip4:208.115.235.0/24 ip4:74.63.231.0/24 ip4:74.63.247.0/24 ip4:74.63.236.0/24 ip4:208.115.239.0/24 ip4:173.193.132.0/24 ip4:173.193.133.0/24 ip4:208.117.48.0/20 ip4:50.31.32.0/19 ip4:198.37.144.0/20 ~all

这使我们的查找总数达到 14 个。


所以我们的总数是 14 次查找。我们需要将其减少到 10 个。我在下面概述了几个选项,您可能需要使用其中的一个以上才能将其减少。

    直接包含一些重定向的 spf 记录。现在我们知道 spf 记录重定向到哪些服务器,您可以删除中间人并直接包含它们。 注意:如果任何服务最终更改其 SPF 记录,您将不得不手动完成更新过程。

    删除您正在使用的一些服务。不确定您拥有所有这些服务的用例是什么,但您肯定可以使用一些重叠。例如,SendGrid 支持 (1) 事务性外发邮件,(2) 通讯/营销电子邮件,以及 (3) 传入邮件。所以可能会有一些可减少的冗余。

    删除多余的 MX 记录。根据您的设置,MX 查找可能是多余的。

希望这会有所帮助!

【讨论】:

关于选项 3:我不是 MX 记录方面的专家。由于我只使用 Google Apps 来接收电子邮件,我是否可以将 SPF 设置为仅从 Google 获取 MX 而不是 SendGrid 和 MailChimp? 这有效,例如,但不包括 MX(所以我认为我需要一个用于 Google 的 MX) v=spf1 a include:_spf.google.com include:servers.mcsv.net include :sendgrid.net ~all 在 SPF 中,MX 条目意味着信任指定为您域的 MX 的任何主机。如果您的域没有单独的 MX 记录,或者它已被您拥有的其他 SPF 规则涵盖,则无需包含它。另一方面,如果您的域确实有一个指定的 MX 来处理外发邮件,那么不授权它发送邮件似乎……会适得其反。 对于任何人来说,here 是 RFC 的相关部分,将 MX 查找限制为 10。 另请注意,上面的示例略有错误,“初始 TXT 和 SPF 查找”不包括在 10 次查找的限制中(至少我是这样解释 RFC 的......!)跨度>

以上是关于SPF 记录中的 DNS 查找过多的主要内容,如果未能解决你的问题,请参考以下文章

DNS查询实战

如何为转发域编写正确的 SPF TXT 记录

使用 dig 搜索 SPF 记录 [关闭]

Amazon SES SPF和DKIM设置教程

搜索域和子域的所有 DNS TXT 记录

添加了SPF记录后仍然能够冒名发送邮件