发件人策略框架(SPF)是一个开放标准用以识别邮件中伪造的发件人地址。它尤其保护 SMTP 信封发件人地址或返回路径中的域。它通过检查域中用于 SPF 策略的 DNS 记录以精确地查出哪台邮件主机可以代表域发送邮件,从而做到如上所述。如果域有 SPF 策略而发件主机并没有列于该策略下,那么您就可以知道该地址是伪造的。
假设邮件服务器收到了一封邮件,来自主机的 IP 是45.120.56.87
,并且声称发件人为test@example.com
。为了确认发件人不是伪造的,邮件服务器会去查询example.com
的 SPF 记录。如果该域的 SPF 记录设置允许 IP 为45.120.56.87
的主机发送邮件,则服务器就认为这封邮件是合法的;如果不允许,则通常会退信,或将其标记为垃圾/仿冒邮件。
下图说明了SPF是如何进行工作的:
说明:
1.用户需要先在域名解析后台添加SPF记录
2.收件人邮件服务器在收到邮件后,检查发件人域的SPF记录
3.如果域存在SPF记录,则会检查入站IP是否在SPF所列出的范围内,存在则通过,不存在则根据SPF设置进行处理
注意:因为SPF是和域相关的,所以SPF记录需要在域名解析后台设置而不是邮件服务器上设置。
设置方法:
登录域名解析后台,添加记录类型为TXT
的记录,主机记录填写@
,可以填写v=spf1 mx a ip4:x.x.x.x -all
,[x.x.x.x]替换成邮件服务器出口公网IP,如果有多个出口地址则添加多个ip4标签。
SPF记录定义了一个或者多个mechanism,而mechanism则定义了哪些IP是允许的,哪些IP是拒绝的,这些mechanism包括以下几类:
all | ip4 | ip6 | a | mx | ptr | exists | include
每个mechanism可以有四种前缀:
默认的前缀都为 +
,根据这些前缀,服务器通常的处理办法如下:
注意,上面所说的「服务器处理办法」仅仅是 SPF 标准做出的建议,并非所有的邮件服务器都严格遵循这套规定。
在邮件安全网关Securitygateway里支持SPF验证,管理员可以根据实际情况来调整策略:
下面就介绍下常用的mechanism:
v=spf1 ip4:11.22.33.44 ip4:55.66.77.88 -all
(表示如果发件人的IP不是从11.22.33.44或者55.66.77.88的话,则按照Fail处理)
ip4:<ip4-address>
或者ip4:<ip4-network>/<prefix-length>
,指定一个 IPv4 地址或者地址段。如果prefix-length
没有给出,则默认为/32
。ip4
的很类似,默认的prefix-length
是/128
。a
为例,格式为以下四种之一:a
a/<prefix-length>
a:<domain>
a:<domain>/<prefix-length>
会命中相应域名的 a
记录(或 mx
记录)中包含的 IP 地址(或地址段)。如果没有提供域名,则使用当前域名。
include:<domain>
,表示引入<domain>
域名下的 SPF 记录。注意,如果该域名下不存在 SPF 记录,则会导致一个PermError
结果。exists:<domain>
,将对<domain>
执行一个 A 查询,如果有返回结果(无论结果是什么),都会看作命中。在SecurityGateway中的邮件详情里,我们可以看到SPF检测过程,如果匹配则显示match
,并在最后spf结果中显示为pass
Thu 2020-12-03 00:26:16: --执行中: SPF --
Thu 2020-12-03 00:26:16: Performing SPF lookup (bounce.s7.exacttarget.com / 136.147.182.199)
Thu 2020-12-03 00:26:16: * Policy: v=spf1 include:cust-spf.exacttarget.com -all
Thu 2020-12-03 00:26:16: * Evaluating include:cust-spf.exacttarget.com: performing lookup
Thu 2020-12-03 00:26:16: * Policy: v=spf1 ip4:64.132.92.0/24 ip4:64.132.88.0/23 ip4:66.231.80.0/20 ip4:68.232.192.0/20 ip4:199.122.120.0/21 ip4:207.67.38.0/24 ip4:207.67.98.192/27 ip4:207.250.68.0/24 ip4:209.43.22.0/28 ip4:198.245.80.0/20 ip4:136.147.128.0/20 ip4:136.147.176.0/20 ip4:13.111.0.0/16 ip4:161.71.32.0/17 -all
Thu 2020-12-03 00:26:16: * Evaluating ip4:64.132.92.0/24: no match
Thu 2020-12-03 00:26:16: * Evaluating ip4:64.132.88.0/23: no match
Thu 2020-12-03 00:26:16: * Evaluating ip4:66.231.80.0/20: no match
Thu 2020-12-03 00:26:16: * Evaluating ip4:68.232.192.0/20: no match
Thu 2020-12-03 00:26:16: * Evaluating ip4:199.122.120.0/21: no match
Thu 2020-12-03 00:26:16: * Evaluating ip4:207.67.38.0/24: no match
Thu 2020-12-03 00:26:16: * Evaluating ip4:207.67.98.192/27: no match
Thu 2020-12-03 00:26:16: * Evaluating ip4:207.250.68.0/24: no match
Thu 2020-12-03 00:26:16: * Evaluating ip4:209.43.22.0/28: no match
Thu 2020-12-03 00:26:16: * Evaluating ip4:198.245.80.0/20: no match
Thu 2020-12-03 00:26:16: * Evaluating ip4:136.147.128.0/20: no match
Thu 2020-12-03 00:26:16: * Evaluating ip4:136.147.176.0/20: match
Thu 2020-12-03 00:26:16: * Evaluating include:cust-spf.exacttarget.com: match
Thu 2020-12-03 00:26:16: * 结果:pass
Thu 2020-12-03 00:26:16: --结束:SPF(0.074309 秒)--
1.通过命令行验证。在cmd中依次输入:
nslookup
set type=txt
<domain>
,这里直接输入@右面的域名2.通过工具。
通过新窗口打开以下网站,帮助你验证域名是否存在 SPF 记录、记录的语法是否正确,以及输入 IP 和 host 来测试是不是真正管用。
通过新窗口打开以下网站,可以查询所有能使用域名发送邮件的IP