RIVALSA网络日志

发件人策略框架(SPF)

于2022-05-09发布

本文原本于2019年5月11日发布在 RIVALSA 知识分享板块中,由于 RIVALSA 知识分享板块已下线,于2022年5月9日将本文转移至 RIVALSA 网络日志中。

当前的 E-mail 通信使用的是简单邮件传输协议(Simple Mail Transfer Protocol, SMTP),这其实是一个非常简单的传输协议,本身并没有任何安全措施。根据 SMTP 协议,发现人的邮箱地址是由发件方自行声明的,也就是说,收件人完全无法判断邮件的真实发件人是否是邮件中显示的发件人,在垃圾邮件和诈骗邮件横行的今天,这显然是不安全的。而 SPF 的目的就是为了防止随意伪造发件人。下面将从 SPF 的原理、语法等方面来详述一下这个策略。

SPF 的原理

SPF 是域名的一个 DNS 记录,当收件方邮件服务器收到一封来自 IP 地址为 1.1.1.1 的邮件,且这封邮件声明的发件人为 test@example.com 时,会首先去查询 example.com 的 SPF 记录中列出的所有被 example.com 允许发送邮件的服务器 IP 地址,如果 1.1.1.1 在列表中,则会认为这个发件人声明是合法的,否则这封邮件会被退信或标记为垃圾邮件。

由于邮件发送者虽然可以“声明”他的邮件来自于 example.com,但他既无权修改 example.com 的 DNS 记录,也无法伪造自己的 IP 地址,所以通常 SPF 的验证都是很有效的。目前几乎所有的邮件服务商都会去验证 SPF。

SPF 的语法

SPF 记录的语法如下:

v=spf1 [前缀]Mechanisms

v=spf1 是必须的,表示采用的是 SPF1 版本,目前他的最新版就是第1版。

Mechanisms 的前缀包含3种:“+”表示通过,“-”表示拒绝,“~”表示软拒绝。通常收件服务器对于通过的会直接接受来信,对于拒绝的会退信处理,对于软拒绝的接受来信但做出标记。

SPF 记录的 Mechanisms,如下表所示。

Mechanisms 及其格式 含义 举例
all 表示所有 IP,肯定会命中,通常放在结尾,表示处理剩余的所有情况 v=spf1 -all
拒绝所有,表示这个服务器不会发出邮件
ip4:<ip4-address>或
ip4:<ip4-network>/<prefix-length>
指定一个IPv4地址或一个地址段。如果<prefix-length>没有给出,则按/32处理 v=spf1 ip4:10.0.0.0/24 -all
表示只有10.0.0.0/24可以发出邮件
ip6:<ip4-address>或
ip6:<ip4-network>/<prefix-length>
指定一个IPv6地址或一个地址段。如果<prefix-length>没有给出,则按/128处理 v=spf1 ip6:1001:88::417A
表示只有1001:88::417A可以发出邮件
a或a/<domain> 只有域名的A记录中包含的IP地址可以发出邮件,如未提供域名,则使用当前域名 v=spf1 a -all
表示只有当前域名的A记录中包含的IP地址可以发出邮件
mx或mx/<domain> 只有域名的MX记录中包含的IP地址可以发出邮件,如未提供域名,则使用当前域名 v=spf1 mx mx:test.example.com -all
表示只有当前域名的MX记录以及test.example.com的MX记录中包含的IP地址可以发出邮件
include:<domain> 引入domian域名下的SPF记录到本域名下 v=spf1 include:123.com -all
表示采用与123.com相同的SPF记录
exists:<domain> 对 domain 执行 A 记录查询,如果有结果返回(无论是什么)则看做命中 (无)
ptr:<domain> 由于使用 ptr 会带来很大开销的DNS查询,所以连官方都不推荐使用它 (无)

常见的 SPF 记录通常不只包含一种 Mechanisms,例如:v=spf1 a mx ip4:173.194.251.88 -all 表示只允许当前记录的A记录中包含的 IP 地址、MX记录中包含的 IP 地址和 173.194.251.88 发出邮件。

如何添加 SPF 记录

如果拥有自己的域名则可以给域名添加一条 SPF 记录,严格的说,SPF 应该创建为 SPF 记录,但由于很多解析商不提供种种记录,甚至有的邮件服务器也不支持 SPF 记录,因此现在一般都添加一条 TXT 记录。

本质上 SPF 的作用是为域名指定一个合法的发件 IP 列表,所以你需要指定你是用的服务器的发件 IP 是哪些。如果你是用的是第三方的邮件服务器,那么他们一般会有相应的文档告诉你该如何填写。

记录的生效时间

由于 SPF 本质上是一条 DNS 记录,所以他的生效时间遵循 DNS 的协议。一般来说,如果是新增的记录会立即生效的,如果是修改记录,需要等待一段时间才能够全球同步,这段时间取决于你这条记录原来的 TTL 值。

本文只是将 SPF 记录中常用的重点部分拿出来说一下,想知道更加详细的资料,可以参考 RFC 4408。再推荐一个小工具,可以帮助验证域名是否存在 SPF 记录、记录的语法是否正确,以及输入 IP 和 host 来测试是不是真正管用。

(正文完)

版权信息

本作品著作权归属 Rivalsa 所有,除非 Rivalsa 明确许可您使用,否则任何个人或组织不得以任何方式直接或间接的复制、伪造、转载、摘编、翻印、改编、演出或以其他方式使用本作品。

已获得0个赞0个差评

0条评论

发表评论(取消回复)

通知选项

确定

是否 AT 其他评论者

不 AT 任何人