我管理一个小型 Web 服务器,在为域正确设置 SPF/DMARC 时遇到了一些问题。我试图弄清楚为什么 SPF 验证有时会通过,有时会失败。当使用相同的验证器并且记录没有更改时,就会发生这种情况。这几乎就像它在某些尝试中从不同的来源读取不同的记录一样。
在这个例子中,我使用 dmarcian.com 作为 SPF 验证器。
如果我访问该网站并使用工具--> 域名检查器,有时会显示“您的域名具有有效的 SPF 记录,并且策略足够严格。” 如果我多次单击“检查域名”(不会拼写错误),有时会显示“您的域名没有 SPF 记录。” 为什么在没有任何变化的情况下,我会在同一次检查中得到两个不同的结果?
提供商是 Arvixe(即将更改)。Web 服务器是 Windows VPS,Web 服务器不是电子邮件服务器。我们支付单独的批量电子邮件服务费用,尽管我们发送的邮件不多。
我正在使用 WebsitePanel 编辑 DNS 记录。不支持 SPF 记录,因此我使用 TXT 记录。它看起来像这样:
名称:_spf 类型:TXT 数据:v=spf1 +a +mx +ip4:207.210.200.162 +ip4:143.95.68.96 ~all
域名:theiaicertification.org IP:108.167.130.38 / 108.167.130.39 邮件服务器:207.210.200.162 / 143.95.68.96
答案1
您的 DNS 区域托管在两台 DNS 服务器上,对于托管您的域而言,DNS 服务器数量并不算多。这两台 DNS 服务器都缺少 IPv6,这可能会在将来成为一个问题。
当请求域的 TXT 记录时,两个权威 DNS 服务器都提供相同的响应,因此这也不是问题。我看到的确切响应如下:
theiaicertification.org. 86400 IN TXT "v=spf1 +a +mx +ip4:207.210.200.162 +ip4:143.95.68.96 ~all"
这里我想指出几点。
使用a
和/或mx
可能会出现问题。这是因为您无法控制需要根据 SPF 记录验证哪些 IP 地址,因此您的 SPF 记录必须符合 IPv4 和 IPv6 地址验证标准。在验证 SPF 记录期间,允许进行无响应的 DNS 查找的次数是有限制的。但是,就您而言,您勉强避开了这个陷阱。
在每个条目前面加上前缀+
并不是 SPF 记录的常用写法,但它似乎可以起作用。
我测试了是否可以使用 Python 实现的 spf 验证来根据 SPF 记录验证 IP 地址:
>>> import spf
>>> spf.query('192.0.2.1', '[email protected]', '').check()
('softfail', 250, 'domain owner discourages use of this host')
>>> spf.query('2001:db8::1', '[email protected]', '').check()
('softfail', 250, 'domain owner discourages use of this host')
>>>
但这两种情况都无法解释为什么您会看到不同的结果。不同结果的一个可能解释是缓存。TXT 记录上的 TTL 为 86400 秒,即 24 小时。如果您最近更改了它,并且 TTL 之前也是 24 小时,那么您的更改可能需要 24 小时才能在所有地方生效。
我猜测您用来验证 SPF 记录的服务具有多个递归解析器,并且其中至少有一个缓存了您的 TXT 记录的旧版本。