3. SPF记录
SPF记录是一个DNS记录,声明哪些主机被授权或未被授权使用域名作为"HELO"和"MAIL FROM"身份。粗略地说,该记录将主机划分为允许和不允许的集合(尽管某些主机可能不属于任何一类)。
SPF记录表示为在单个DNS TXT资源记录的RDATA中找到的单个文本字符串;同一所有者名称不允许有多个SPF记录。记录格式和选择记录的过程在下面的第4节中描述。示例记录如下:
v=spf1 +mx a:colo.example.com/28 -all
此记录的版本为"spf1",包含三个指令:"+mx"、"a:colo.example.com/28"("+"是隐含的)和"-all"。
每个SPF记录都放置在DNS树中与其相关的所有者名称处,而不是在所有者名称下的子域中。这类似于SRV记录[RFC2782]的做法。
本节中的示例可能通过域区域文件中的这些行发布:
example.com. TXT "v=spf1 +mx a:colo.example.com/28 -all"
由于TXT记录有多种用途,请注意为其他目的发布的其他TXT记录。它们可能会导致大小限制问题(参见第3.4节),必须注意确保只有SPF记录用于SPF处理。
发布SPF记录的ADMDs应该将评估记录所需的DNS信息量保持在最低限度。第4.6.4节和第10.1.1节提供了一些关于"include"机制和链式"redirect"修饰符的建议。
3.1. DNS资源记录
SPF记录必须仅作为DNS TXT(类型16)资源记录(RR)[RFC1035]发布。记录的字符内容编码为[US-ASCII]。在SPF的实验阶段支持使用替代DNS RR类型,但现已停止。
2003年,当SPF首次开发时,分配新DNS RR类型的要求比现在要严格得多。此外,对新DNS RR类型的轻松部署的支持在DNS服务器和配置系统中没有广泛部署。因此,SPF的开发人员发现使用TXT RR类型作为SPF记录更容易且更实用。
在审查[RFC4408]时,SPFbis工作组得出结论,其双RR类型转换模型存在根本缺陷,因为它不包含实现者必须提供和必须检查的通用RR类型。考虑了许多替代方案来解决此问题,但最终工作组得出结论,在可预见的将来大幅迁移到SPF RR类型的可能性很小,解决此互操作性问题的最佳解决方案是从SPF版本1中放弃对SPF RR类型的支持。有关更多信息,请参阅[RFC6686]的附录A。
十年前围绕SPF初始部署的情况是独特的。如果开发了不重用现有SPF记录的SPF未来更新,它可以使用SPF RR类型。SPF对用于结构化数据的TXT RR类型的使用绝不应被视为未来协议设计者的先例。有关使用新DNS RR类型时的设计考虑的进一步讨论,请参阅[RFC5507]。
3.2. 多个DNS记录
域名不得有多个记录会导致授权检查选择多个记录。有关选择规则,请参阅第4.5节。
3.3. 单个DNS记录中的多个字符串
如[RFC1035]第3.3节和第3.3.14节所定义,单个文本DNS记录可以由多个字符串组成。如果发布的记录包含多个字符字符串,则必须将该记录视为这些字符串连接在一起而不添加空格。例如:
IN TXT "v=spf1 .... first" "second string..."
等同于:
IN TXT "v=spf1 .... firstsecond string..."
包含多个字符串的TXT记录在构造超过单个TXT记录中字符字符串的255八位字节最大长度的记录时很有用。
3.4. 记录大小
给定域名的已发布SPF记录应该保持足够小,以便对其查询的结果适合512八位字节内。否则,可能会超过DNS协议限制。此UDP限制在[RFC1035]第2.3.4节中定义,尽管它已由[RFC2671]提高。保持在512八位字节以下应该可以防止较旧的DNS实现故障转移到TCP,并且在没有EDNS0 [RFC6891]支持的情况下也可以与UDP一起使用。由于应答大小取决于本文档范围之外的许多因素,因此只能给出以下指导原则:如果DNS消息的大小,即DNS名称和给定类型的所有记录文本的组合长度小于450八位字节,则DNS应答应该适合UDP数据包。由于防火墙和其他干扰TCP上的DNS操作或使用EDNS0的问题,SPF验证者可能会静默忽略过长而无法放入单个UDP数据包的记录。
请注意,在计算TXT格式查询回复的大小时,必须考虑在域名处发布的任何其他TXT记录。同样,必须评估与SPF相关的所有查询的回复大小,以适合单个512八位字节的UDP数据包(即,DNS消息大小限制为450八位字节)。
3.5. 通配符记录
不鼓励使用通配符记录进行发布,如果使用它们则必须小心。如果区域包括通配符MX记录,它可能希望发布通配符声明,但受相同的要求和问题约束。特别是,对于任何具有任何RR记录的主机以及其子域,必须重复该声明。考虑[RFC1034]第4.3.3节中的示例。基于此,我们可以执行以下操作:
EXAMPLE.COM. MX 10 A.EXAMPLE.COM
EXAMPLE.COM. TXT "v=spf1 a:A.EXAMPLE.COM -all"
*.EXAMPLE.COM. MX 10 A.EXAMPLE.COM
*.EXAMPLE.COM. TXT "v=spf1 a:A.EXAMPLE.COM -all"
A.EXAMPLE.COM. A 203.0.113.1
A.EXAMPLE.COM. MX 10 A.EXAMPLE.COM
A.EXAMPLE.COM. TXT "v=spf1 a:A.EXAMPLE.COM -all"
*.A.EXAMPLE.COM. MX 10 A.EXAMPLE.COM
*.A.EXAMPLE.COM. TXT "v=spf1 a:A.EXAMPLE.COM -all"
对于区域内的每个名称,SPF记录必须列出两次:一次用于名称本身,一次使用通配符来覆盖名称下的树,以便覆盖传出邮件中使用的所有域。