关于SPF记录的原理与配置

6,363次阅读
没有评论

共计 2725 个字符,预计需要花费 7 分钟才能阅读完成。

SPF,全称是 Sender Policy Framework,即发件人策略框架。

当前 Email 通信,基本上都是用 SMTP 协议,也就是简单邮件传输协议,如名所示,SMTP 是个简单的传输协议,本身没有很好的安全措施。根据 SMTP 规则,发件人的邮箱地址是由发信方声明的,在垃圾邮件和诈骗邮件泛滥的今天,这显然是极不安全的。

SPF 出现的目的就是为了防止随意伪造发件人地址。

SPF 记录的原理

SPF 记录实际是是域名的一个 TXT 记录,原理其实也很简单:

假设邮件服务器收到了一封邮件,来自主机的 IP 是 12.34.56.78,并且声称发件人为sender@domain.com。为了确认发件人不是伪造的,邮件服务器会去查询 domain.com 的 SPF 记录,如果 domain.com 的 SPF 允许 IP 为 12.34.56.78 的主机发送邮件,则服务器认为这封邮件合法,如果不允许,通常会退信或标记为垃圾邮件。

因为 Spamer 虽然可以声明他的邮件来自 domain.com, 但是他却无权操作 domain.com 的 DNS 记录,同时他也无法伪造自己的 IP 地址,因此 SPF 是很有效的,当前基本上所有的邮件服务商都会验证它。

SPF 记录的语法

一条 SPF 记录定义一个或多个 mechanism,而 mechanism 则定义哪些 IP 是允许的,哪些 IP 是拒绝的。mechanism 分以下几类:

all,ip4,ip6,a,mc,ptr,exists,include

每个 mechanism 可以有 4 种前缀:

"+"  Pass(通过)"-"  Fail(拒绝)"~"  Soft Fail(软拒绝)"?"  Neutral(中立)

默认是 +,也就是通过,一般情况下也只会用到 ”+” 和 ”-“. 没用命中的结果为 Neutral.

除了以上 4 种情况,还有 None(无结果),PermError(严重错误),TempError(临时错误)等三种情况,对于这些情况的解释和服务器通常处理办法如下:

Pass 发件 IP 是合法的 接受来信
Fail 发件 IP 是非法的 退信
Soft Fail 发件 IP 非法,但是不采取强硬措施 接受来信,但是做标记
Neutral SPF 记录中没有关于发件 IP 是否合法的信息 接受来信
None 服务器没有设定 SPF 记录 接受来信
PermError 发生了严重错误(例如 SPF 记录语法错误)没有规定
TempError 发生了临时错误(例如 DNS 查询失败)接受或拒绝

注意,上面所说的「服务器处理办法」仅仅是 SPF 标准做出的建议,并非所有的邮件服务器都严格遵循这套规定。

Mechanisms

下面介绍上面提到的 mechanism:

all

表示所有 IP,肯定会命中。因此通常把它放在 SPF 记录的结尾,表示处理剩下的所有情况。例如:

"v=spf1 -all" 拒绝所有(表示这个域名不会发出邮件)"v=spf1 +all" 接受所有(域名所有者认为 SPF 是没有用的,或者根本不在乎它)
ip4

格式为 ip4:<ip4-address> 或者 ip4:<ip4-network>/<prefix-length>,指定一个 IPv4 地址或者地址段。如果prefix-length 没有给出,则默认为/32。例如:

"v=spf1 ip4:192.168.0.1/16 -all"
只允许在 192.168.0.1 ~ 192.168.255.255 范围内的 IP
ip6

格式和 ip4 的很类似,默认的 prefix-length/128。例如:

"v=spf1 ip6:1080::8:800:200C:417A/96 -all"
只允许在 1080::8:800:0000:0000 ~ 1080::8:800:FFFF:FFFF 范围内的 IP
a 和 mx

这俩的格式是相同的,以 a 为例,格式为以下四种之一:

a
a/<prefix-length>
a:<domain>
a:<domain>/<prefix-length>

会命中相应域名的 a 记录(或 mx 记录)中包含的 IP 地址(或地址段)。如果没有提供域名,则使用当前域名。例如:

"v=spf1 mx -all"
允许当前域名的 mx 记录对应的 IP 地址。"v=spf1 mx mx:deferrals.example.com -all"
允许当前域名和 deferrals.example.com 的 mx 记录对应的 IP 地址。"v=spf1 a/24 -all"
类似地,这个用法则允许一个地址段。

例如,这是一个比较常见的 SPF 记录,它表示支持当前域名的 a 记录和 mx 记录,同时支持一个给定的 IP 地址;其他地址则拒绝:

v=spf1 a mx ip4:173.194.72.103 -all
include

格式为 include:<domain>,表示引入<domain> 域名下的 SPF 记录。注意,如果该域名下不存在 SPF 记录,则会导致一个 PermError 结果。例如:

"v=spf1 include:example.com -all" 即采用和 example.com 完全一样的 SPF 记录
exists

格式为 exists:<domain>。将对<domain> 执行一个 A 查询,如果有返回结果(无论结果是什么),都会看作命中。

ptr

格式为 ptr 或者 ptr:<domain>。使用ptr 机制会带来大量很大开销的 DNS 查询,所以连官方都不推荐使用它。

关于 v =spf1

这是必须的,这个表示采用 SPF 1 版本,现在它的最新版本就是第 1 版。

Modifiers

SPF 记录中还可以包括两种可选的 modifier;一个 modifier 只能出现一次。

redirect

格式为redirect=<domain>

将用给定域名的 SPF 记录替换当前记录。

exp

格式为 exp=<domain>,目的是如果邮件被拒绝,可以给出一个消息。而消息的具体内容会首先对<domain> 执行 TXT 查询,然后执行宏扩展得到。

如何用 SPF 保护我的域名

如果你拥有自己的域名,并且用它发送邮件,那么你应该为它添加 SPF。通过域名服务商提供的「域名解析」、「DNS Editor」或者「DNS Zone Editor」等功能添加,并填写正确的 SPF 数据就可以了。

严格来说,SPF 数据应该创建为 SPF 记录。但是鉴于很多 DNS 服务商不支持 SPF 记录,甚至有的邮件服务器也不支持 SPF 记录,因此也可以创建为一条 TXT 记录。目前,你应该至少创建一条 TXT 记录。

因为本质上 SPF 的作用是为一个域名指定合法的发件 IP,所以你需要知道自己使用的邮件服务器的发件 IP 是什么。如果你使用第三方的域名邮箱服务(比如腾讯的域名邮箱),那么他们应该有相应的文档告诉你该怎么填写。如果你用虚拟主机,则主机提供商也应该会告诉你。

生效时间

SPF 记录本质上是一个 DNS 记录,所以并不是修改之后立即生效的——通常需要几个小时的时间。

正文完
 
Winter
版权声明:本站原创文章,由 Winter 2018-04-20发表,共计2725字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码