Appendix A. Extended Examples (扩展示例)
Appendix A. Extended Examples (扩展示例)
本附录提供了 SPF 记录的扩展示例, 演示了各种配置场景和最佳实践。
A.1 Simple Examples (简单示例)
A.1.1 仅允许单个 IP 地址
example.com. IN TXT "v=spf1 ip4:192.0.2.1 -all"
说明: 仅允许 IP 地址 192.0.2.1 代表 example.com 发送邮件。所有其他 IP 地址都将导致 "fail" 结果。
A.1.2 使用 MX 记录
example.com. IN TXT "v=spf1 mx -all"
说明: 允许 example.com 的 MX 记录中列出的邮件服务器发送邮件。这是一种常见的配置, 因为它会自动适应 MX 记录的更改。
A.1.3 使用 A 记录
example.com. IN TXT "v=spf1 a -all"
说明: 允许 example.com 的 A 记录(或 AAAA 记录用于 IPv6)中的 IP 地址发送邮件。
A.1.4 组合多个机制
example.com. IN TXT "v=spf1 mx a:mail.example.com ip4:192.0.2.0/24 -all"
说明: 允许以下来源发送邮件:
- example.com 的 MX 服务器
- mail.example.com 的 A 记录
- 192.0.2.0/24 网段中的任何 IP
A.1.5 软失败策略
example.com. IN TXT "v=spf1 mx a ~all"
说明: 使用软失败(~all)而不是硬失败(-all)。这在测试阶段或迁移期间很有用。接收方可能会接受邮件但将其标记为可疑。
A.2 Multiple Domain Example (多域示例)
对于拥有多个域但使用相同邮件基础设施的组织:
example.com. IN TXT "v=spf1 mx -all"
example.org. IN TXT "v=spf1 redirect=_spf.example.com"
example.net. IN TXT "v=spf1 redirect=_spf.example.com"
_spf.example.com. IN TXT "v=spf1 mx:example.com -all"
说明:
- example.com 有自己的 SPF 记录
- example.org 和 example.net 重定向到共享的 SPF 记录
- _spf.example.com 包含实际的策略
优势:
- 集中管理邮件服务器配置
- 更新一次即可影响多个域
- 减少 DNS 记录维护工作
A.3 DNS Blacklist (DNSBL) Style Example (DNS 黑名单样式示例)
使用 exists 机制实现类似 DNSBL 的功能:
example.com. IN TXT "v=spf1 exists:%{ir}.%{l1r+-}._spf.%{d} -all"
说明:
%{ir}: 反转的 IP 地址(如 192.0.2.1 变成 1.2.0.192)%{l1r+-}: 发件人 local-part 的第一部分, 反转, "." 和 "+" 被 "-" 替换%{d}: 域名
示例扩展:
如果发件人是 [email protected] 从 192.0.2.1 发送:
- 宏扩展为:
1.2.0.192.user._spf.example.com
然后查询此域名的 A 记录。如果存在, SPF 检查通过。
使用场景:
- 基于用户的细粒度控制
- 与数据库或自定义系统集成
- 动态授权决策
A.4 Multiple Requirements Example (多重要求示例)
结合多个机制和修饰符的复杂配置:
example.com. IN TXT "v=spf1 ip4:192.0.2.0/24 ip4:198.51.100.0/24 include:_spf-servers.example.com include:_spf.google.com a:outbound.example.com mx ~all"
说明:
ip4:192.0.2.0/24: 内部邮件服务器网段ip4:198.51.100.0/24: 备用数据中心网段include:_spf-servers.example.com: 引入额外的服务器列表include:_spf.google.com: 使用 Google Workspacea:outbound.example.com: 特定的出站服务器mx: 包含 MX 记录的服务器~all: 软失败其他所有情况
分层设计:
_spf-servers.example.com. IN TXT "v=spf1 ip4:203.0.113.0/24 ip4:198.51.100.128/25 -all"
这样可以将大型 SPF 记录拆分为更易管理的部分。
A.5 [子域配置示例]
A.5.1 子域使用不同策略
example.com. IN TXT "v=spf1 mx -all"
mail.example.com. IN TXT "v=spf1 a -all"
shop.example.com. IN TXT "v=spf1 include:shopify.com -all"
说明:
- 主域使用 MX 记录
- mail 子域仅使用其 A 记录
- shop 子域使用第三方服务(Shopify)
A.5.2 不发送邮件的子域
noreply.example.com. IN TXT "v=spf1 -all"
static.example.com. IN TXT "v=spf1 -all"
说明: 明确声明这些子域不发送邮件, 防止被伪造。
A.6 [第三方服务集成示例]
A.6.1 使用多个邮件服务提供商
example.com. IN TXT "v=spf1 include:_spf.google.com include:spf.protection.outlook.com include:sendgrid.net -all"
说明:
- Google Workspace 用于员工邮件
- Microsoft 365 用于合作伙伴
- SendGrid 用于营销邮件
A.6.2 检查 DNS 查询限制
上述示例使用了 3 个 include, 每个可能触发额外的查询。需要确保总查询数不超过 10。
验证方法:
# 检查 Google 的 SPF
dig _spf.google.com TXT
# 检查 Microsoft 的 SPF
dig spf.protection.outlook.com TXT
# 检查 SendGrid 的 SPF
dig sendgrid.net TXT
计算每个 include 中的机制数量, 确保总数 ≤ 10。
A.7 [错误配置示例(避免)]
A.7.1 ❌ 多个 SPF 记录(错误)
example.com. IN TXT "v=spf1 mx -all"
example.com. IN TXT "v=spf1 a -all"
问题: 这将导致 "permerror"。一个域只能有一个 SPF 记录。
正确方式:
example.com. IN TXT "v=spf1 mx a -all"
A.7.2 ❌ 缺少 -all(不安全)
example.com. IN TXT "v=spf1 mx"
问题: 没有明确的默认策略, 等同于 ?all (neutral), 任何 IP 都不会失败。
正确方式:
example.com. IN TXT "v=spf1 mx -all"
A.7.3 ❌ 超过 DNS 查询限制
example.com. IN TXT "v=spf1 include:a include:b include:c include:d include:e include:f include:g include:h include:i include:j include:k -all"
问题: 11 个 include 超过了 10 次查询限制, 导致 "permerror"。
解决方案: 使用 SPF 扁平化或直接使用 ip4 机制。
A.8 [IPv6 配置示例]
example.com. IN TXT "v=spf1 ip6:2001:db8::/32 ip4:192.0.2.0/24 mx -all"
说明: 同时支持 IPv6 和 IPv4 网络。
A.9 [解释字符串示例]
example.com. IN TXT "v=spf1 mx -all exp=explain._spf.%{d}"
explain._spf.example.com. IN TXT "邮件来自 %{i}, 但该 IP 未被 %{d} 授权。请联系 postmaster@%{d}。"
说明: 当 SPF 检查失败时, 接收方可以查询解释字符串并向用户显示。
宏扩展后(假设从 192.0.2.99 发送):
"邮件来自 192.0.2.99, 但该 IP 未被 example.com 授权。请联系 [email protected]。"
A.10 [测试和过渡策略]
阶段 1: 监控模式(2-4周)
example.com. IN TXT "v=spf1 ?all"
阶段 2: 记录实际发送源(2-4周)
example.com. IN TXT "v=spf1 ip4:192.0.2.0/24 include:provider.com ?all"
阶段 3: 软失败(4-8周)
example.com. IN TXT "v=spf1 ip4:192.0.2.0/24 include:provider.com ~all"
阶段 4: 严格模式(生产环境)
example.com. IN TXT "v=spf1 ip4:192.0.2.0/24 include:provider.com -all"
建议: 每个阶段监控 SPF 检查结果, 确保没有合法邮件被阻止。