Appendix B. Changes from RFC 4408 (与 RFC 4408 的变更)
Appendix B. Changes in Implementation Requirements from RFC 4408 (与 RFC 4408 实现要求的变更)
本附录总结了 RFC 7208 相对于其前身 RFC 4408 的主要变更。
B.1 [主要变更]
B.1.1 SPF RR 类型已弃用
RFC 4408 要求:
- 同时发布 TXT 和 SPF(类型 99)记录
- 实现必须检查两种记录类型
RFC 7208 变更:
- 仅使用 TXT 记录(类型 16)
- 不再支持 SPF RR 类型
- 简化了实现和部署
原因: SPF RR 类型的采用率极低, 双类型系统造成了互操作性问题。
B.1.2 DNS 查询限制的明确化
RFC 4408:
- DNS 查询限制描述不够明确
- "void lookup" 限制未定义
RFC 7208:
- 明确定义了 10 次 DNS 查询限制
- 增加了 "void lookup" 限制(建议为 2 次)
- 详细说明了 MX 和 PTR 机制的额外限制
具体限制:
- 总 DNS 查询: ≤ 10 (include, a, mx, ptr, exists, redirect)
- 每个 mx 机制: ≤ 10 个地址查询
- 每个 ptr 机制: ≤ 10 个地址查询
- Void lookups: ≤ 2 (建议)
- 评估时间: ≥ 20 秒 (建议)
B.1.3 "local-part" 处理
RFC 4408:
- local-part 处理不够明确
- 空 local-part 的处理未定义
RFC 7208:
- 明确规定如果
<sender>没有 local-part, 使用 "postmaster" - 改善了空反向路径(
<>)的处理
示例:
MAIL FROM:<>
→ SPF 使用 HELO 标识, local-part 为 "postmaster"
B.1.4 "ptr" 机制的强烈反对
RFC 4408:
- "ptr" 机制被允许但不推荐
RFC 7208:
- 明确标记为 "do not use"(不使用)
- 在机制名称中添加了警告
- 强调性能和可靠性问题
原因:
- 反向 DNS 查询缓慢
- 依赖于第三方(IP 地址所有者)的配置
- 对 .arpa 名称服务器造成负担
B.1.5 宏语法的修正
RFC 4408:
- 宏语法定义存在歧义
RFC 7208:
- 改进了 ABNF 定义
- 明确了宏扩展规则
- 修复了边界情况
B.1.6 "exp" 修饰符的安全考虑
RFC 4408:
- 安全考虑不够详细
RFC 7208:
- 增加了关于外部解释字符串的安全警告
- 建议限制解释字符串的长度
- 强调需要标识解释来自第三方
B.2 [实现要求的变更]
B.2.1 必须实现 (MUST) 的变更
新增要求:
- 实现必须仅查询 TXT 记录(不再查询 SPF RR)
- 实现必须限制 DNS 查询总数为 10
- 实现必须处理 "void lookup" 限制
- 实现必须在超过限制时返回 "permerror"
移除要求:
- 不再要求支持 SPF RR 类型
- 不再要求双类型记录的转换逻辑
B.2.2 应该实现 (SHOULD) 的变更
新增建议:
- 应该实施评估超时(至少 20 秒)
- 应该限制 "void lookup" 为 2 次
- 应该同时检查 HELO 和 MAIL FROM 标识
- 应该在 SMTP 事务期间执行检查
B.2.3 可以实现 (MAY) 的变更
新增选项:
- 可以使非规范算法(只要结果相同)
- 可以配置 "void lookup" 限制
- 可以限制解释字符串的长度
B.3 [术语变更]
B.3.1 标识名称的标准化
RFC 4408:
- 使用多种名称: "MAIL FROM", "SMTP MAIL FROM", "reverse-path"
- 术语不一致
RFC 7208:
- 统一使用 "MAIL FROM" 标识
- 明确定义为 RFC5321.MailFrom
- 引用 RFC 5598 的标准术语
B.3.2 "ADMD" 术语的采用
RFC 4408:
- 使用 "domain owner", "sending domain"
RFC 7208:
- 采用 "ADMD" (Administrative Management Domain)
- 更精确地描述责任方
B.4 [安全考虑的增强]
B.4.1 新增安全主题
-
跨用户伪造 (Section 11.4):
- RFC 4408 未涵盖
- RFC 7208 明确讨论域内用户伪造问题
-
隐私暴露 (Section 11.6):
- 宏在 DNS 查询中可能暴露敏感信息
- 建议谨慎使用包含发件人信息的宏
-
不受信任的信息源 (Section 11.5):
- 详细讨论外部标头和解释的风险
- 强调验证和过滤的重要性
B.4.2 DoS 防护的强化
RFC 4408:
- 基本的查询限制
RFC 7208:
- 多层防护机制
- 明确的限制数值
- 超时建议
- "void lookup" 限制
B.5 [IANA 注册的变更]
B.5.1 SPF RR 类型
RFC 4408:
- 注册了 SPF RR 类型(类型 99)
RFC 7208:
- 将 SPF RR 类型标记为已弃用
- 建议仅使用 TXT 记录
B.5.2 修饰符注册表
RFC 7208 新增:
- 创建了 SPF 修饰符注册表
- 标准化了新修饰符的注册流程
- 要求未知修饰符必须被忽略
B.6 [互操作性改进]
B.6.1 记录选择的明确化
RFC 4408:
- 多记录情况处理不明确
RFC 7208:
- 明确规定多个 SPF 记录导致 "permerror"
- 改进了版本字符串匹配规则
- 明确了记录连接规则(多字符串)
B.6.2 错误处理的标准化
RFC 7208 改进:
- 所有错误情况都有明确的结果
- 标准化了 DNS 错误的处理
- 改进了超时处理
B.7 [向后兼容性]
B.7.1 兼容的变更
大多数变更是向后兼容的:
- TXT 记录格式未变
- 机制和修饰符语法基本相同
- 核心算法保持一致
B.7.2 可能影响兼容性的变更
-
SPF RR 类型移除:
- 旧实现可能仍查询 SPF RR
- 建议: 移除 SPF RR 记录, 仅保留 TXT
-
更严格的限制:
- "void lookup" 限制是新增的
- 一些旧记录可能超过新限制
- 建议: 优化 SPF 记录以符合限制
-
"ptr" 机制的反对:
- 仍然必须支持, 但强烈反对使用
- 建议: 迁移到其他机制
B.8 [文档结构变更]
RFC 7208 改进:
- 更清晰的章节组织
- 增加了扩展示例(附录 A)
- 增加了实施建议(附录 C-G)
- 改进了 ABNF 定义的呈现
B.9 [迁移指南]
从 RFC 4408 迁移到 RFC 7208:
发布方:
- 移除 SPF RR 记录, 仅保留 TXT 记录
- 检查并优化 DNS 查询数量(≤ 10)
- 将 "ptr" 机制替换为 "ip4" 或 "ip6"
- 验证 "void lookup" 数量(≤ 2)
- 测试记录是否超过 512 八位字节
接收方:
- 停止查询 SPF RR 类型
- 实施新的 DNS 查询限制
- 实施 "void lookup" 限制
- 更新错误处理逻辑
- 考虑实施评估超时
测试:
# 使用 SPF 验证工具测试记录
# 例如: https://www.kitterman.com/spf/validate.html
# 检查 DNS 查询数量
dig +short example.com TXT | grep "v=spf1"
# 验证记录大小
dig example.com TXT | grep -A1 "ANSWER SECTION"
B.10 [参考文档更新]
RFC 7208 引用了更新的标准:
- RFC 5321 (替代 RFC 2821)
- RFC 5322 (替代 RFC 2822)
- RFC 5234 (ABNF 更新)
- RFC 5598 (邮件架构术语)
- RFC 5890 (国际化域名)