发件人策略框架(SPF)——防止别人仿冒本域邮箱发件人

  • 2020-12-09 18:07:10

发件人策略框架(SPF)是一个开放标准用以识别邮件中伪造的发件人地址。它尤其保护 SMTP 信封发件人地址或返回路径中的域。它通过检查域中用于 SPF 策略的 DNS 记录以精确地查出哪台邮件主机可以代表域发送邮件,从而做到如上所述。如果域有 SPF 策略而发件主机并没有列于该策略下,那么您就可以知道该地址是伪造的。

假设邮件服务器收到了一封邮件,来自主机的 IP 是45.120.56.87,并且声称发件人为test@example.com。为了确认发件人不是伪造的,邮件服务器会去查询example.com的 SPF 记录。如果该域的 SPF 记录设置允许 IP 为45.120.56.87的主机发送邮件,则服务器就认为这封邮件是合法的;如果不允许,则通常会退信,或将其标记为垃圾/仿冒邮件。

下图说明了SPF是如何进行工作的:

SPF工作流程

说明:

1.用户需要先在域名解析后台添加SPF记录

2.收件人邮件服务器在收到邮件后,检查发件人域的SPF记录

3.如果域存在SPF记录,则会检查入站IP是否在SPF所列出的范围内,存在则通过,不存在则根据SPF设置进行处理

如何设置SPF记录

注意:因为SPF是和域相关的,所以SPF记录需要在域名解析后台设置而不是邮件服务器上设置。

设置方法:

登录域名解析后台,添加记录类型为TXT的记录,主机记录填写@,可以填写v=spf1 mx a ip4:x.x.x.x -all,[x.x.x.x]替换成邮件服务器出口公网IP,如果有多个出口地址则添加多个ip4标签。

设置SPF记录

SPF记录的语法

SPF记录定义了一个或者多个mechanism,而mechanism则定义了哪些IP是允许的,哪些IP是拒绝的,这些mechanism包括以下几类:

all | ip4 | ip6 | a | mx | ptr | exists | include

每个mechanism可以有四种前缀:

  • "+":Pass(通过)
  • "-":Fail(拒绝)
  • "~":Soft Fail(软拒绝)
  • "?":Neutral(中立)

默认的前缀都为 + ,根据这些前缀,服务器通常的处理办法如下:

根据SPF记录的服务器处理办法

注意,上面所说的「服务器处理办法」仅仅是 SPF 标准做出的建议,并非所有的邮件服务器都严格遵循这套规定。

在邮件安全网关Securitygateway里支持SPF验证,管理员可以根据实际情况来调整策略:

Securitygateway上的SPF验证设置

Mechanisms

下面就介绍下常用的mechanism:

  • all因为添加的IP都会默认命中,所以通常把它放在SPF记录的结尾,表示处理剩下的所有情况。例如:

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:<ip4-address>或者ip4:<ip4-network>/<prefix-length>,指定一个 IPv4 地址或者地址段。如果prefix-length没有给出,则默认为/32
  • ip6:格式和ip4的很类似,默认的prefix-length/128
  • a和mx:这俩的格式是相同的,以a为例,格式为以下四种之一:
a
a/<prefix-length>
a:<domain>
a:<domain>/<prefix-length>

会命中相应域名的 a 记录(或 mx 记录)中包含的 IP 地址(或地址段)。如果没有提供域名,则使用当前域名。

  • include:格式为include:<domain>,表示引入<domain>域名下的 SPF 记录。注意,如果该域名下不存在 SPF 记录,则会导致一个PermError结果。
  • exists:格式为exists:<domain>,将对<domain>执行一个 A 查询,如果有返回结果(无论结果是什么),都会看作命中。

SPF检测示例

在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 秒)--

验证SPF记录是否生效

1.通过命令行验证。在cmd中依次输入:

  • nslookup
  • set type=txt
  • <domain>,这里直接输入@右面的域名
检测SPF

2.通过工具。

通过新窗口打开以下网站,帮助你验证域名是否存在 SPF 记录、记录的语法是否正确,以及输入 IP 和 host 来测试是不是真正管用。

通过新窗口打开以下网站,可以查询所有能使用域名发送邮件的IP

http://tools.wordtothewise.com/spf