在垃圾邮件的伎俩中,伪造发件人地址,使其看起来象一个合法的地址,是常见的一种方法。特别是网络钓鱼的邮件,试图欺骗收件人透露信用卡号码、QQ密码、Paypal 密码等帐号资料。这些邮件的“发件人”的地址,一般都经过了伪装,使其看起来看一个合法的(如银行、网站服务商等)地址。
而 SPF,正是近年来解决邮件防伪和anti-spam 的一个新标准。SPF 全称为 Sender Policy Framework,即发送方策略框架。你只需要在你的域名 DNS 中发布一条 SPF 记录,这条记录标识了经过授权的电子邮件发送服务器。电子邮件接收系统,会查询对应域名的 SPF 记录,检查邮件是否来自真正的授权过的邮件发送服务器。如果是垃圾邮件、钓鱼邮件伪造的"发件人"地址,则他们的邮件会无法通过 SPF 校验。
SPF(Sender Policy Framework)是为了防范垃圾邮件而提出来的一种DNS记录类型,它是一种TXT类型的记录,它用于登记某个域名拥有的用来外发邮件的所有IP地址。当你定义了你的domain name的SPF记录之后,接收邮件方会根据你的SPF记录来确定连接过来的IP地址是否被包含在SPF记录里面,如果在,则认为是一封正确的邮件,否则则认为是一封伪造的邮件。关于更详细的信息请参考RFC4408(http://www.ietf.org/rfc/rfc4408.txt)例如:
$ dig txt 21cn.com
;; ANSWER SECTION:
21cn.com. 3600 IN TXT "v=spf1 include:mail-spf.21cn.com -all"
按照SPF的格式在DNS记录中增加一条TXT类型的记录,将提高该域名的信誉度,同时可以防止垃圾邮件伪造该域的发件人发送垃圾邮件。
SPF是跟DNS相关的一项技术,它的内容写在DNS的txt类型的记录里面。mx记录的作用是给寄信者指明某个域名的邮件服务器有哪些。SPF的作用跟mx相反,它向收信者表明,哪些邮件服务器是经过某个域名认可会发送邮件的。
由定义可以看出,SPF的作用主要是反垃圾邮件,主要针对那些发信人伪造域名的垃圾邮件。
SPF 的原理是使用电子邮件的头部信息中的 'Return Path' 或 'Mail From' 这两个邮件头里的域名来结合真正提供这个邮件的服务商 DNS 里面的记录去验证发送邮件服务器是否是冒充行为。
SPF 的官方网站是: http://www.openspf.org/
How it works
当信件发送到一个 MTA 后,这个 MTA 会检查邮件的邮件头,然后进行 DNS 查询,如果认为这个域的 IP 地址不是所定义的那就证明他是一个假冒的,这时候就会把邮件退回去。
How to check SPF record
如何查询某个域名是否开启SPF,可以使用以下命令:
# dig -t txt 域名
只需要去查询 TXT 类型的 DNS 记录即可。
SPF variables
v=spf1 / 表示 spf1 的版本
- Fail, 表示没有其他任何匹配发生
~ 代表软失败,通常用于测试中
? 代表忽略
IP4 代表IPv4进行验证
IP6 代表IPv6进行验证
all 代表结束
举例说明:
* hotmail 的 SPF 记录:
hotmail.com. 2533 IN TXT "v=spf1 include:spf-a.hotmail.com include:spf-b.hotmail.com include:spf-c.hotmail.com include:spf-d.hotmail.com ~all"
如果不符合以上发信地址,但是发件人却是 '
[email protected]',那么这样的邮件一定是假冒的。邮件应该一律退回。
添加SPF记录的方法:
这方法很简单,只要我们的DNS供应商提供的管理界面中可以添加SPF记录就可以设置了(不是所有的供应商会提供这设置,我的域名是在godaddy.com上注册的,可以设置SPF记录)。设置时,添加一个SPF记录,然后输入域名,如果是本域,可用@来表示。然后在VALUE中输入如“v=spf1 ip4:67.202.107.106 -all”的值。 这值分三部分:
(1)v=spf1 说明是一个SPF的v1记录
(2)ip4:67.202.107.106 说明邮件会从此声明IPv4地址发出。它可以是一个IP,或一个IP段。如果有多个IP或多个IP段的话,可以声明多个ip4记录(如“ip4:1.0.1.0/24 ip4:1.0.2.0/24″),每个ip4记录间用空格分隔。另外,除了用IPv4外,还可以有如下选择:
1) ip6: 使用IPv6 进行验证。
2) a: 使用一个域名进行验证。这将引起对域名服务器进行一次A RR 查询。可以按照a:domain, a:domain/cidr 或a/cidr 的形式来使用。
3) mx: 使用DNS MX RR 进行验证。MX RR 定义了收信的MTA,这可能和发信的MTA 是不同的,这种情况基于mx 的测试将会失败。 可以用mx:domain, mx:domain/cidr 或mx/cidr 这些形式进行mx 验证。
4) ptr: 使用域名服务器的PTR RR 进行验证。这时,SPF 使用PTR RR 和反向图进行查询。如果返回的主机名位于同一个域名之内,就验证通过了。这个参数的写法是ptr:domain
5) exist: 验证域名的存在性。可以写成exist:domain 的形式。
6) ext: 定义对type 的可选扩展。如果没有这个字段,那么仅使用单个记录进行问询。
7) mod: 这是最后的类型指示,作为记录的一个修正值。修正值 描述:
redirect 重定向查询,使用给出的域名的SPF 记录。
以redirect=domain 的方式使用。
exp 这条记录必须是最后一条,允许给出一条定制的失败消息。
IN TXT “v=spf1 mx -all exp=getlost.example.com”
getlost IN TXT “You are not authorized to send mail for the domain”
(3)-all 定义匹配时的返回值,可有如下选择:
1) + 缺省值。在测试完成的时候表示通过。
2) – 表示测试失败。这个值通常是-all,表示没有其他任何匹配发生。防伪要求强度高.
3) ~ 表示软失败,通常表示测试没有完成。
4) ? 表示不置可否。这个值也通常在测试没有完成的时候使用。
(4)include: 如果有可能通过一个isp来发信,这个有自己的SPF记录,则填入这个isp的域名. 比如: include:amazonses.com
(5)ptr 选择no,官方建议的。
(6)mx 一般也是yes(这表明您还要从 MX 记录列出的每项发送),MX服务器会有退信等。
所以“v=spf1 ip4:67.202.107.106 -all”的意思是这个域只有67.202.107.106这个IP可以发邮件出来,其他IP的都是非法的。
使用 Microsoft 提供的向导:http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/
测试添加的SPF记录方法:
进入网站:http://www.kitterman.com/spf/validate.html, 输入域名测试.
evaluating...
SPF record passed validation test with pySPF (Python SPF library)!