Skip to content

如何正确发送Email—SPF,DKIM介绍与配置

对很多管理员来说,添加邮件服务无非就是安装个exim4.就能用了.殊不知,其实现代的邮件为了防止垃圾邮件,已经走得太远太远了.
搜索中文圈,压根没有相关资料,这里我就当抛砖了.

SPF

全名Sender Policy Framework,用来鉴别发送邮件的服务器或者IP,是否为该域允许的范围。
这需要在发送邮件的域名下添加一条TXT记录,举个例子: example.net. TXT "v=spf1 mx a:pluto.example.net include:aspmx.googlemail.com -all" v=spf1做开头为必须,spf1说明这是第一版spf协议 SPF规定有6种机制:

  • ALL 匹配所有的结果,一般放在最后
  • A 匹配所有该域的A记录
  • MX 匹配所有该域的MX记录
  • IP4 所有之后的IPv4地址,可以用mask匹配多项,比如:192.168.0.0/24
  • IP6 所有之后的IPv6地址,同IPv4
  • INCLUDE 去之后对应地址查找,比如INCLUDE:spf.34nm.com,就是去spf.34nm.com继续查找TXT/SPF记录

还有四种修饰符分别意义是:

  • +":允许,默认记录都是允许
  • -":不允许
  • ~":中立,也就是没有相关策略
  • ?":同样是中立,但是为debug

这样例子中 example.net. TXT "v=spf1 mx a:pluto.example.net include:aspmx.googlemail.com -all" 的意思是

mx 允许所有MX记录
a:pluto.example.net pluto.example.net的A记录也允许
include:aspmx.googlemail.com 其余记录参考aspmx.googlemail.com
-all 拒绝所有其他记录

DKIM

由于SPF天生只验证是否可以发信, 不保证这个发信人是验证的,因此,SPF验证通过的仍然可能是伪造的邮件. 这就需要DKIM来进一步保证这封邮件不是伪造的.
在特殊的子域名”_domainkey”(例如:_domainkey.example.com)的TXT记录中插入一对RSA密钥中的公钥,
而RSA的私钥用来加密邮件的部分字段. 收到邮件的服务器发现有DKIM-SIGNATURE字段时,会自动校验DKIM的公钥, 按照匹配程度进行处理.
这样就完成了验证.

+---------------+ +-----------------+
| SenderServer | | ReceiverServer |
+---------------+ +-----------------+
| -----------------\ |
|-| Calculate DKIM | |
| |----------------| |
| |
| Send singed mail |
|--------------------------->|
| |
| Check DKIM record |
|< ---------------------------|
| | ---------------------------\
| |-| OK, found key and verify |
| | |--------------------------|
| |

还可以在特殊子域名之上,再建立一堆域名,例如authmail._domainkey.example.com,这样在校验邮件时还可以选择不同的密钥.
协议的内容相对来说就简单很多了,只有三种值:

  • v=DKIM1; 使用DKIM第一版协议
  • k=rsa; 使用RSA加密
  • p=长长的一段公钥

DMARC

该验证的都验证了,还有个DMARC是干吗的呢? 这是为了给域名邮件的拥有者报告垃圾邮件的状况而设定的规则.
和之前的方法一样,在_dmarc.example.com下面设定自己的DMARC规则, 具体就参考Google 提供的文档 吧.

https://support.google.com/a/answer/2466580?hl=zh-Hans&amp;ref_topic=2759254

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.