SPF——防钓鱼及垃圾邮件技术详解
SPF,全称为 Sender Policy Framework,即发件人策略框架。
当前 Email 通信,还是在使用 SMTP 这个协议。SMTP 的全称为 Simple Mail Transfer Protocol,即「简单邮件传输协议」。正如它的名字锁暗示的,SMTP 实际上是一个非常简单(甚至简陋)的传输协议,本身并没有很好的安全措施。根据 SMTP 的规则,发件人的邮箱地址是可以由发信方任意声明的。在SMTP 协议制定的时候也许还好,但在垃圾和诈骗邮件横行的今天,这显然是极不安全的。
SPF 出现的目的,就是为了防止随意伪造发件人。
SPF 记录实际上是服务器的一个 DNS 记录,原理其实很简单:
假设邮件服务器收到了一封邮件,来自主机的 IP 是222.91.123.220
,并且声称发件人为email@example.com
。为了确认发件人不是伪造的,邮件服务器会去查询example.com
的 SPF 记录。如果该域的 SPF 记录设置允许 IP 为222.91.123.200
的主机发送邮件,则服务器就认为这封邮件是合法的;如果不允许,则通常会退信,或将其标记为垃圾/仿冒邮件。
钓鱼邮件虽然可以「声称」他的邮件来自example.com
,但是他却无权操作example.com
的 DNS 记录;同时他也无法伪造自己的 IP 地址。因此 SPF 是很有效的,当前基本上所有的邮件服务提供商(例如 Gmail、QQ 邮箱等)都会验证它。
一条 SPF 记录定义了一个或者多个 mechanism,而 mechanism 则定义了哪些 IP 是允许的,哪些 IP 是拒绝的。
这些 mechanism 包括以下几类:
all | ip4 | ip6 | a | mx | ptr | exists | include每个 mechanism 可以有四种前缀:
"+" Pass(通过)
"-" Fail(拒绝)
"~" Soft Fail(软拒绝)
"?" Neutral(中立)
查询时,将从前往后依次查询每个 mechanism。如果一个 mechanism 包含了要查询的 IP 地址(称为命中),则查询结果由相应 mechanism 的前缀决定。默认的前缀为+
。如果测试完所有的 mechanisms 也没有命中,则结果为 Neutral。
除了以上四种情况,还有 None(无结果)、PermError(永久错误)和 TempError(临时错误)三种其他情况。对于这些情况的解释和服务器通常的处理办法如下:
下面详细分析每个Mechanisms
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 查询,所以连官方都不推荐使用它。
windows:
nslookup -qt=txt example.com
linux:
dig -t txt example.com
spf官网:http://www.openspf.org/
spf验证:http://www.kitterman.com/spf/validate.html
其他技术:DKIM,DKIM也是一种防垃圾软件技术,在国外用的比较多
伪造钓鱼软件:swaks
【nginx优化】使用socket方式链接Nginx优化php-fpm性能
【环境配置】Postfix2.10+ssl+dovecot搭建邮件服务器
【实践分享】Linode VPS和Vultr VPS使用体检对比