SPF记录详解
一 句型
在一条SPF记录中,按照排列的先后顺序,对所给出的机制进行验证.如果在SPF记录中,没有机制或修改符,默认结果是中性(Neutral);如果域没有SPF记录,结果是:”无”(None);如果在DNS解析期间,有一个临时错误,会报”临时错误”(TempError)(以前的规划中称作”错误”(error));如果SPF记录句型错误,比如写法错误或者使用了未知句型,会报”永久错误”(PermError)(以前称作”unknown”)
1 机制
1.1 机制表示
1.1.1 all
这个机制总是匹配的,通常用在记录的结尾.例:
“v=spf1 mx –all” 允许所有该域的MX邮件服务器发送邮件,禁止所有其他的.
“v=spf1 –all” 该域根本不能发送邮件
“v=spf1 +all” 任何服务器都可以发送邮件
1.1.2 ip4
“v=spf1 ip4:192.168.0.1/16 –all” 允许192.168.0.1到192.168.255.255的服务器发送邮件
“v=spf1 ip4:192.168.0.1 –all” 允许192.168.0.1发送邮件,与“v=spf1 ip4:192.168.0.1/32 –all”同意
1.1.3 ip6
单个IP,于ip4不同,/128为默认前缀 例:
"v=spf1 ip6:1080::8:800:200C:417A/96 -all"
允许1080::8:800:0000:0000 和 1080::8:800:FFFF:FFFF之间的主机发送
"v=spf1 ip6:1080::8:800:68.0.3.1/96 -all"
允许 1080::8:800:0000:0000 和1080::8:800:FFFF:FFFF之间的主机发送
1.1.4 a
例:假设当前域为example.com
"v=spf1 a -all" 当前域被使用
"v=spf1 a:example.com -all"当前域被使用
Equivalent if the current-domain is example.com.
"v=spf1 a:mailers.example.com -all" 指定mailers.example.com的主机IP可以外发邮件
"v=spf1 a/24 a:offsite.example.com/24 -all" 如果example.com解析到192.0.2.1,那么全部的C类地址192.0.2.0/24将作为可外发 邮件的IP地址;同样,如果offsite.example.com有多个A记录地址,每一个IP地址也会被扩展到CIDR子网,作为可外发邮件IP地址.
1.1.5 mx
所有域的MX记录对应的A记录,按照MX记录的优先级进行验证.如果发送IP在这些记录中,则机制匹配.如果域未指定,默认为当前域.
A记录需要精确匹配发送邮件的IP地址.如果有CIDR前缀,则需要逐个对应IP地址验证.
例:
v=spf1 mx mx:deferrals.domain.com -all"
Perhaps a domain sends mail through its MX servers plus another set of servers whose job is to retry mail for deferring domains.
也许一个域可以通过他的MX服务器发送邮件,而另外也可以通过deferrals.domain.com的MX服务器发送邮件.
"v=spf1 mx/24 mx:offsite.domain.com/24 -all"
也许一个域的MX服务器在一个IP接收邮件,而用临近的另一IP发送邮件.
1.1.7 prt
发送IP的PTR记录至少有一个和给定域相匹配.尽量避免使用这种机制,因耗费大量的DNS查询
例子:
"v=spf1 ptr -all"
"v=spf1 ptr:otherdomain.com -all"
1.1.8 exists
对被提供的域进行A记录查询,如果有结果,则匹配.如果结果是”-“,会被当作127.0.0.2对待.
在下面的例子中,发件IP地址为1.2.3.4,当前域为example.com
"v=spf1 exists:example.net -all"
如果example.net不能解析,结果失败.如果可以解析.机制匹配.
1.1.10 include
句型:include:<domain>
指定的域被查询后匹配.如果查询无匹配或者有错误,接着开始下一个机制处理.警告:如果指定域不是合法有效的SPF记录,返回”永久性错误”结果.某些邮件接收者会基于此错误,拒绝接受邮件.
例:
在下面的例子中,发信IP是1.2.3.4,当前域是example.com
“v=spf1 include:example.net –all”
如果example.net没有SPF记录,结果是”永久错误”(PermError)
假设example.net的SPF记录是”v=spf1 a –all”
查询exapmle.net的A记录,如果匹配1.2.3.4,结果是”通过”(Pass);如果不匹配,,则include整体匹配失败,后面的-all将不再验证,最后总的结果还是”失败”(Fail).
这个机制会涉及信任关系,可能会有越权行为,可能被人假冒.因此可以设置为中性,在include前加上标识符?
“v=spf1 ?include:example.net –all”
该机制一般不宜选择.
1.2 标识符
作为机制的前缀,表明机制的状态.机制的默认标识符为”+”
"+" Pass (通过)
"-" Fail (失败)
"~" SoftFail (软失败)
"?" Neutral (中性)
2修改符
在一个SPF记录中,每个修改符只能使用一次,不能重复使用.未知修改符将会在验证时忽略。
1.2.1 redirect
句型: redirect=<domain>
将会用指定域代替当前域
在下面的例子里:当前域为example.com,发信IP是1.2.3.4
“v=spf1 redirect=example.net”
如果example.net没有SPF记录,返回”unknown”的错误
假设example.net的SPF记录是”v=spf1 a –all”
查询example.net的A记录,如果匹配1.2.3.4,则”通过”(Pass);如果不匹配,该行为失败,接着开始执行-all机制.
1.2.2 exp
句型: exp=<domain>
提供解释性的语句.如果SMTP接收者拒绝一个信息,它可以包含一个返回给发信者的解释信息.SPF记录里可以包含一个解释字符串给发送者,告之相关的错误信息或需要访问的帮助页面等.
二 处理过程
三 错误代码
验证SPF记录的结果只能有如下几在种:
结果 |
解释 |
可做行为 |
Pass |
SPF记录指定,主机被允许发送 |
接受 |
Fail |
SPF记录指定,主机不被允许发送 |
拒绝 |
SoftFail |
SPF记录指定,主机不被允许发送,但可以再发送 |
接受但做标记 |
Neutral |
SPF记录详尽,但不能确认其有效性 |
接受 |
None |
无SPF记录或SPF记录验证无结果 |
接受 |
PermError |
永久错误(例如不正确的格式记录) |
未指明 |
TempError |
临时错误发生 |
接受或拒绝 |
四 常见问题
Legenda | ||
---|---|---|
>Syntax | >Type | >Meaning |
-all | Fail | Fail all servers not listed here (recommended option) |
~all | Soft fail | Give extra scrutiny to servers not listed here |
?all | Neutral | Unsure whether e-mail infrastructure is secure |
+all | Pass | There’s no infrastructure security at all |
其它参考:
http://www.openspf.org/SPF_Record_Syntax