SPF记录中有太多的DNS查询

42
我的网站需要使用Google Apps、SendGrid和MailChimp服务发送电子邮件。Google Apps用于接收和阅读我的域名的传入电子邮件。
我需要为我的域名设置SPF记录。以下语法正确(不确定A和MX令牌):
"v=spf1 a mx include:_spf.google.com include:servers.mcsv.net include:sendgrid.net ~all"
但如果我使用http://www.kitterman.com/getspf2.py进行测试,我会得到
PermError SPF Permanent Error: Too many DNS lookups
http://www.onlineaspect.com/2009/03/20/too-many-dns-lookups-in-an-spf-record/类似的问题。
如何优化/重写我的SPF记录?

改进建议:Kitterman托管的SPF查询工具链接应为以下内容: https://www.kitterman.com/spf/validate.html - phpenthusiast
7个回答

72

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

我们从下面开始:

v=spf1 a mx include:_spf.google.com include:servers.mcsv.net include:sendgrid.net ~all
我们在出现“Too many DNS lookups”错误之前,会进行总共10次DNS查找:
  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

谷歌为我们提供了2个额外的查询,总共达到9次查询

2. servers.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次以下。下面我列出了一些选项,您可能需要使用其中多个选项来实现减少。

  1. 直接包含某些重定向的SPF记录。现在我们知道SPF记录重定向到哪些服务器,您可以直接包含它们。 注意:如果任何服务最终更改其SPF记录,您将不得不手动更新您的记录。

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

  3. 如果重复,则删除MX记录。根据您的设置,MX查询可能会冗余。

希望能对您有所帮助!


2
在 SPF 中,MX 条目意味着信任被指定为您域名 MX 的任何主机。如果您的域名没有单独的 MX 记录,或者已经由您拥有的其他 SPF 规则覆盖,那么您不需要包含它。另一方面,如果您确实为您的域名指定了处理发件的 MX,那么不授权其发送邮件似乎是不利于生产的。 - tripleee
1
对于任何寻找相关信息的人,这里是RFC中限制MX查找为10的相关部分。 - Xiong Chiamiov
对于现在阅读此文的任何人,请注意RFC 4408现已过时。当前的RFC是7208,处理限制可以在此处找到:http://tools.ietf.org/html/rfc7208#section-4.6.4 - Steve365
2
另外请注意,上面的示例略有错误,“初始TXT和SPF查找”不包括在10次查找限制内(至少这是我对RFC的理解...!) - Steve365
include= 是否算作查询?如果没有指定 spf.example.com 子域名,它们可能会查找大量的 TXT 记录。 - Martijn
显示剩余6条评论

8

Swift的回答非常好。

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

例如,如果域是example.com,则让google apps从地址user@gapps.example.com发送。然后可以为gapps.example.com设置SPF记录,其中包括_spf.google.com,并且可以从主要的example.com SPF记录中删除_spf.google.com,从而减少3个查询。


6
请查看SPF-tools,它可以帮助从使用includes的原始SPF记录重新组装成仅包含ip4ip6字段的静态记录。它可以轻松地与本地运行的DNS服务器或使用其API的托管DNS服务相结合,以使一切与上游的includes保持同步。
*我是作者(现在还有其他贡献者),它是Apache 2.0许可下的开源软件。

0
几年前,我写了hydrate-spf这个工具,它可以查找包含文件并将结果合并成一个巨大的记录。正如README中所提到的,这种方法并不理想——它会删除你的包含域更新其记录的能力。然而,当你遇到允许的限制时,它可以解决即时问题,并通过定期更新保持一定的可维护性。

1
需要小心处理这个问题。技术上讲,超过255个字符的SPF记录也是无效的。 - Mike
1
看起来我们确实需要一个现代化的SPF替代方案,它考虑到了所有这些限制,这些限制在当时可能看起来是合理的,但现在却经常遇到问题。 - Xiong Chiamiov

0

我们探索了将SPF记录展平为IP以及创建子域的方法。所有这些方法都似乎需要大量的工作。我们发现了来自spfproxy.org的服务,只需几分钟即可设置。他们基本上使用SPF宏将DNS查找隐藏在其后面。不确定为什么更多公司不提供此服务。


看起来 spfproxy.org 不再提供服务了。 - alexcline

0

这个10-DNS查找限制是SPF实现所施加的,以防止针对DNS基础设施的DDoS攻击。

使用DMARCLY的安全SPF功能,您可以在不重写SPF记录的情况下解除此限制。


0

10次DNS查找限制是针对DNS查找的限制。将SPF记录压缩以包含较少的DNS查找并用IP(压缩)替换它们是绕过限制的一种方式。

您可以手动执行此操作,但这样一来,每当提供程序更改其IP地址(这经常发生)时,您就必须更新自己的SPF记录。

理想的解决方案是使用SPF压缩服务。这个服务对于低数量免费,或者对于超过500封电子邮件/月的情况非常便宜。它定期轮询要包含的SPF记录以获取更新的IP地址。

Fraudmarc.com

声明:我与该公司无关,此链接非推荐链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接