背景

前两天在设置网站的邮箱系统,中间碰到了 SPF、 DKIM、 DMARC 三种需要配置的 DNS 记录。由于 SMTP 是一种简单的邮件传输协议(实际上它的全称就叫做 Simple Mail Transfer Protocol),所以我们需要利用上面说到的三种记录来验证接收到的邮件是否为经过授权服务器发送的。

SPF 记录

SPF 记录的出现,是为了防止伪造发件人。

原理解释

假如你的邮箱服务器接收到了一封邮件,来自于 100.100.100.100 这个IP地址,并声称发件人是 admin@example.com。这时候你的邮箱服务器就会去检索这个发件人是否是伪造的,具体来说就是通过查询 example.com 的SPF记录中是否包含并允许 100.100.100.100 这个IP地址。显然,若允许则会正常收信;若不允许则会导致退信、拦截等结果。形象的过程如下图:

SPF逻辑图
SPF 原理图

语法解释

SPF 记录本质上是一个 TXT 记录,添加在邮箱域名上,比如:

记录类型:TXT
主机记录:@
记录值:v=spf1 include:example.com ~all

SPF记录定义了多种不同的 mechanism,这些 mechanism 规定了哪些 IP 是被允许的,哪些 IP 是被禁止的。

这一些mechanism包含以下几类:
all | ip4 | ip6 | a | mx | ptr | exists | include
同时还支持以下四种前缀:
"+" -> Pass (通过/同时这也是默认值) -> 发件IP合法,接收
"-" -> Fail (拒绝) -> 发件IP非法,退信
"~" -> Soft Fail (软拒绝) -> 发件IP非法,接收
"?" -> Neutral (中立) -> SPF记录中没有该IP信息,接收

下面介部分常用 mechanism 的含义和用法:

all

all 表示命中所有的 IP,通常放在 SPF 记录的尾部作为 fallback,结合上面提到的前缀举几个例子:

"v=spf1 -all" 拒绝所有
"v=spf1 +all" 接受所有

ip4/ip6

ip4/ip6 的格式相近,具体的配置举例如下:

"v=spf1 ip4:192.168.0.1/16 -all"
只允许在 192.168.0.1 ~ 192.168.255.255 范围内的 IP
"v=spf1 ip6:1080::8:800:200C:417A/96 -all"
只允许在 1080::8:800:0000:0000 ~ 1080::8:800:FFFF:FFFF 范围内的 IP
如果没有指定前缀长度,则默认只表示记录中所填写的IP(1个IP)

a/mx

这两个 mechanism 会命中相应域名的 a 记录和 mx 记录,如果没有填写域名则默认值为当前域名:

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

include

include 用于引入某个域名下的SPF记录,例如:

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

这里是一个在线生成 SPF 记录的网站

DKIM 记录

与SPF记录类似,DKIM(域名密钥识别邮件,DomainKeys Identified Mail)也是一种电子邮件验证方法,防止他人冒充合法域名。

原理解释

它通过一组密钥来验证邮件的合法性,这一组密钥分为:电子邮件服务商持有的私钥、域名所有者持有的公钥。服务商通过后台生成公钥交给域名持有者,然后域名持有者通过 DNS 添加 DKIM 记录。

在发送邮件时,将会携带一段由私钥加密的字段,接收者可以通过查询 DNS 获取 DKIM 记录中的公钥进行解密,这样就达到了验证邮件合法性的目的。具体的流程如下图:

DKIM逻辑图
DKIM 原理图

语法解释

在 DNS 记录中,DKIM 一般形式类似于:

记录类型:TXT
主机记录:<selector>._domainkey
记录值:v=DKIM1; k=rsa; p=<一段RSA公钥>
selector 是由域名使用的电子邮件服务提供商发布的专门值
记录值中的k=rsa定义了公钥是以RSA方式进行加密的

这一部分我认为不必太过于关注,因为这一个记录上的密钥与公钥一般都由电子邮件服务商提供,他们会推荐你设置响应的记录值。

DMARC 记录

DMARC 记录是对 SPF、DKIM 记录的一种补充,在使用 DMARC 记录前必须要先设置 SPF、DKIM 记录。

原理解释

其主要原理是邮件的发送方通过 DNS 公开表明自己会用到的发件服务器(SPF)、并对发出的邮件内容进行签名(DKIM),而邮件的接收方则检查收到的邮件是否来自发送方授权过的服务器并核对签名是否有效。对于未通过检查的邮件,接收方则按照发送方指定的策略进行处理,如直接投入垃圾箱或拒收。

语法解释

在 DNS 记录中,DMARC 记录一般形式如下:

记录类型:TXT
主机记录:_dmarc
记录值:v=DMARC1; p=none; rua=mailto:admin@example.com; adkim=s; aspf=s;

其中各个参数的解释如下:

  • v 指定了 DMARC 版本
  • p 指定了 DMARC 验证失败后,建议接收方采取的措施
  • rua 指定了定期向 admin@example.com 发送 DMARC 验证报告
  • adkim/aspf 指定了是否严格对齐 DKIM、SPF 记录

最后贴上一个在线生成 DMARC 记录的网站

参考资料