【问题标题】:SPF Permanent Error: Too many DNS lookupsSPF 永久错误:DNS 查找过多
【发布时间】:2018-08-01 22:19:03
【问题描述】:

我们注意到我们的很多电子邮件都被错误地标记为垃圾邮件。在线阅读,似乎解决这个问题的好方法是在 DNS 中添加一条 SPF 记录,因此我们添加了一条包含此内容的 TXT 记录:

v=spf1 a mx ip4:162.123.189.010 include:_spf.google.com include:bluehost.com ~all

Bluehost 是我们的主机提供商, 162.123.189.010 是我们来自蓝色主机的 VPS IP 地址, 并且需要 _spf.google.com,因为我们使用 GMail 发送/接收电子邮件。

Google's MX tester 上运行测试后,我们收到以下错误:

The SPF string can not be parsed, do you have any typos in it?
Decision    permanent error in processing
Explanation SPF Permanent Error: Too many DNS lookups
Record  v=spf1 a mx ip4:162.123.189.010 include:_spf.google.com include:bluehost.com ~all

有人知道问题出在哪里吗?

【问题讨论】:

    标签: email spf


    【解决方案1】:

    “SPF 永久错误:DNS 查找过多”是一个非常具体的问题。您的记录太大,SPF 检查程序将拒绝执行足够多的 DNS 查询来确定某些内容是否通过了 SPF。

    SPF 规范最多允许 10 次 DNS 查找。您的 SPF 记录有 17 个。

    RFC 4408 § 10.1 – Processing Limits 状态:

    SPF 实现必须限制机制和修饰符的数量 每个 SPF 检查最多进行 10 次 DNS 查找,包括任何 由使用“包含”机制或 “重定向”修饰符。如果在检查过程中超过了这个数字,则 必须返回 PermError。 “include”、“a”、“mx”、“ptr”和 “存在”机制以及“重定向”修饰符确实很重要 反对这个限制。 “all”、“ip4”和“ip6”机制不 需要 DNS 查找,因此不计入此限制。 “exp”修饰符不计入此限制,因为 DNS 在 SPF 记录之后进行查找以获取解释字符串 已评估。

    在遍历包含之前,您的 SPF 记录有四次查找,包括您的 amx

    v=spf1 a mx ip4:162.123.189.010 include:_spf.google.com include:bluehost.com ~all
    

    Google 的 SPF

    Google 对其支持的三个 CIDR 集合进行了三个 DNS 查找:

    _spf.google.com(+3 查询)

    v=spf1 include:_netblocks.google.com include:_netblocks2.google.com
      include:_netblocks3.google.com ~all
    

    _netblocks.google.com

    v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19
      ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16
      ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17
      ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all
    

    _netblocks2.google.com

    v=spf1 ip6:2001:4860:4000::/36
      ip6:2404:6800:4000::/36 ip6:2607:f8b0:4000::/36 ip6:2800:3f0:4000::/36
      ip6:2a00:1450:4000::/36 ip6:2c0f:fb50:4000::/36 ~all
    

    _netblocks3.google.com

    v=spf1 ip4:172.217.0.0/19 ip4:172.217.32.0/20
      ip4:172.217.128.0/19 ip4:172.217.160.0/20 ip4:172.217.192.0/19
      ip4:108.177.96.0/19 ip4:35.191.0.0/16 ip4:130.211.0.0/22 ~all"
    

    Bluehost 的 SPF

    bluehost.com 的 SPF 记录太大(它自己的 SPF 记录 fails Google's MX tester):

    bluehost.com(在进一步遍历之前进行 5 次查找)

    v=spf1 include:spf2.bluehost.com include:_spf.qualtrics.com
      include:_spf.google.com include:_spf.salesforce.com
      include:sparkpostmail.com -all
    

    spf2.bluehost.com (+0)

    v=spf1 ip4:66.147.240.0/20 ip4:69.89.16.0/20 ip4:74.220.192.0/19
      ip4:67.222.32.0/19 ip4:70.40.192.0/19 ip4:67.20.64.0/18 ip4:173.254.0.0/17
      ip4:50.87.0.0/16 ip4:69.195.64.0/18 -all
    

    _spf.qualtrics.com (+0)

    v=spf1 ip4:139.60.152.0/22 ip4:162.247.216.0/22 ip4:54.186.193.102/32
      ip4:52.222.73.120/32 ip4:52.222.73.83/32 ip4:52.222.62.51/32
      ip4:52.222.75.85/32 ?all
    

    (有关 _spf.google.com 的 +3 查询,请参见上文,但多余的查询不会添加到您的总数中)

    _spf.salesforce.com(+1 使用带有 IP 地址的 SPF macro

    v=spf1 exists:%{i}._spf.mta.salesforce.com -all
    

    sparkpostmail.com 是一个重定向,然后是另一个 exists 宏和一堆指针(+6,哇)

    v=spf1 redirect=_spf.sparkpostmail.com
    v=spf1 exists:%{i}._spf.sparkpostmail.com include:_netblocks.sparkpostmail.com
      ptr:sparkpostmail.com ptr:spmta.com ptr:flyingenvelope.com ~all
    

    危险!包含在 sparkpost.com 中的一些 ptr 条目是普通伪造的(任何网络运营商都可以满足 sparkpost.com 的 SPF,这意味着它们可以满足 bluehost.com 的要求,因此也可以满足您自己的要求),从而击败了 SPF 的防伪设计

    _netblocks.sparkpostmail.com 被上一条记录 (+0) 拉入

    v=spf1 ip4:147.253.208.0/20 ip4:192.174.80.0/20 ~all
    

    Bluehost 曾经使用SendGrid,他们实际上知道自己在做什么(他们的 SPF 记录没有额外的查找),但显然他们已经将 SendGrid 换成了 SparkPost,后者(基于他们的六个额外查找加上不安全的 @ 987654347@ 个条目)没有。

    由于总数为 12(include:bluehost.com 为 13),您不能包含 Bluehhost 的 SPF。

    Bluehost's own suggested SPF record(以及所有客户的默认设置)同样被破坏(有 16 次查找,包括一个容易伪造的 ptr)。

    Bluehost 解决方案:精简且更安全的 SPF 记录

    ? 你好,Bluehost。我tweeted this at you。本部分仅供您参考。

    Bluehost 可以使用以下 SPF 记录代替当前记录来解决此问题:

    bluehost.com (7)

    v=spf1 a include:spf2.bluehost.com include:_spf.google.com
      include:_netblocks.sparkpostmail.com ~all
    

    虽然请注意,我不得不将include:sparkpostmail.com(7 + 6 = 13,太大,加上危险的ptr 记录)降级为其网络块(7 + 0 ≤ 10)。 Bluehost 需要对 SparkPost 大喊大叫或回到 SendGrid。 spf2.bluehost.com 与当前状态相比没有变化,应该是 Bluehost 客户唯一需要的内容。

    (我会使用 A 记录的 IP 来跳过查找,但它经常更改,看起来像 fast flux。)

    Bluehost 应该建议客户只为所有 Bluehost 服务添加spf2.bluehost.com(假设他们参与发送邮件)。请参阅下一节,了解如何为 Bluehost 客户提供建议。

    Bluehost 客户解决方案

    如上一节所述,从这个基础开始(3 次查找):

    v=spf1 a mx include:spf2.bluehost.com ~all
    

    最后的~all(“软故障”)表明邮件收件人应该对未通过 SPF 的邮件稍有怀疑——但仍会投递。设置DMARC 以找出在通往 DMARC p=reject 的路上哪些有效,哪些遗漏(这将阻止所有伪造邮件)。

    您必须添加您使用的任何托管电子邮件或Email Service Provider(s),以及您想要授权代表您的域发送邮件的任何其他主机。

    在这个问题的情况下,我看到了一个明确的 IP 地址和 Google 托管的邮件,所以你需要:

    v=spf1 ip4:162.123.189.10 a mx include:spf2.bluehost.com
      include:_spf.google.com ~all
    

    您的 DNS 查询总数现在为 7,因此您的 SPF 有效。

    【讨论】:

      【解决方案2】:

      最明显的问题是你的IP地址前导0,这使得它无效。一个小问题是,将文字 IP 放在首位被认为是最佳实践,因为它们对接收者进行评估的速度更快。试试这个:

      v=spf1 ip4:162.123.189.10 a mx include:_spf.google.com include:bluehost.com ~all
      

      我推荐Scott Kitterman's site,而不是使用 google 的检查器,它更可能是准确的(Scott 是 SPF 规范的作者之一),并发现了这个确切的问题。

      【讨论】:

      • 该链接没有正确验证,尽管它的作者。如果您查找 bluehost.com 本身,它会因为 DNS 查找过多而失败(就像 Google 的工具会失败 bluehost.com)。如果您在此答案中使用建议的记录查找 example.com,即使它不应该通过,它也会通过,因为通过 包括 bluehost.com 记录,它显然具有 more 查找。当做出这个答案时,这不太清楚(当时,bluehost.com 记录本身总共进行了 9 次查找,因此是有效的,但这里的记录增加了 5 和 9 + 5 > 10。请参阅我的答案。)
      【解决方案3】:

      “SPF 永久错误:DNS 查找次数过多”是一种常见的 SPF 永久错误。当您的 SPF 记录中有超过 10 次 DNS 查找时,就会发生这种情况。

      SPF 实施 10-DNS 查找限制以缓解 DDoS 攻击。

      您可以使用任何在线SPF checker 来检查您的 SPF 记录并确保它不超过该限制。

      但是,如果您的 SPF 记录确实超出了限制,则 SPF 身份验证会返回上述永久错误,进而将其解释为(在 DMARC 或其他方式中)失败。这意味着电子邮件可能无法通过身份验证并被移至垃圾邮件文件夹。如果不采取进一步措施,这将对您的电子邮件送达率产生负面影响。

      要解决过多的 DNS 查找问题,您可以使用 DMARCLY 的 Safe SPF 等服务 自动“展平”您的 SPF 记录的功能,使其永远不会超过限制。

      有关这方面的更多信息,请查看此帖子:Why SPF Authentication Fails

      【讨论】:

        猜你喜欢
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 2012-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-15
        相关资源
        最近更新 更多