对很多管理员来说,添加邮件服务无非就是安装个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&ref_topic=2759254