Skip to main content

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 Workspace
  • a: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 检查结果, 确保没有合法邮件被阻止。