开发者社区> zephyr> 正文

SPF参考

简介:
+关注继续查看

1. SPF是什么

SPF, Sender Policy Framework, 是一种用于确认邮件来源的手段.

SMTP 服务器之间进行交互时, 对于请求来源是无法直接确认的, 因为邮件交互是公开的行为, 就像你不能阻止有人往你的门缝里塞小卡片一样. 作为收信服务器, 你收到一个请求, 声称它来自于gmail.com, 你如何能确认这个请求就是来源于 google 的服务器呢?

于是, 对域名的确认, 自然解决方案就落在了域名的配置上. 比如你可以看看来源 IP 是否和域名的 A 记录一致, 或者和 MX 记录一致. 但是很显然, 这并不是一个好方法, 因为 A 记录和 MX 记录, 其本来的用途本来和发信服务就不相关. 简单来说, 一个域下的发信服务和收信服务在不同的服务器上完成太正常不过了.

所以, 在域名的 TXT 记录中, 就有了一个专门的 SPF 来完成上面所述的工作.

gmail.com 这个域名, 配置其对应的 SPF 规则, 来描述我的投信请求, 可能来源于哪些 IP 地址. 这个信息是可以通过公开的 DNS 服务查询到的. 那么收信服务器收到 gmail.com 的投信请求时, 就根据查询到的 SPF 规则来检查来源 IP .

dig gmail.com -ttxt

得到:

;; ANSWER SECTION:
gmail.com. 300 IN TXT "v=spf1 redirect=_spf.google.com"

继续:

dig _spf.google.com -ttxt

得到:

;; ANSWER SECTION:
_spf.google.com. 300 IN TXT "v=spf1 include:_netblocks.google.com \
                                    include:_netblocks2.google.com \
                                    include:_netblocks3.google.com ~all"

我们取一个看看:

dig _netblocks.google.com -ttxt

结果有:

_netblocks.google.com. 2158 IN TXT "v=spf1 ip4:216.239.32.0/19 ip4:64.233.160.0/19 \
                                           ip4:66.249.80.0/20 ip4:72.14.192.0/18 \
                                           ip4:209.85.128.0/17 ip4:66.102.0.0/20 \
                                           ip4:74.125.0.0/16 ip4:64.18.0.0/20 \
                                           ip4:207.126.144.0/20 ip4:173.194.0.0/16 ~all"

根据这些规则所描述的 IP 段, 收信服务器就可以判断请求来源是不是 gmail.com 这个域. 或者说得准确点, 对于声称是 gmail.com 的请求来源, 根据它的来源 IP 的不同, 而应该采取什么样的处理策略, 是拒绝, 标记, 还是通过.

2. SPF语法

从前面查询 gmail.com 的过程, 看几个例子:

"v=spf1 redirect=_spf.google.com"
"v=spf1 include:_netblocks.google.com ~all"
"v=spf1 ip4:216.239.32.0/19 ~all"

形式上, SPF 记录分成四个部分, 用 双引号 括起来.

  1. v=spf1 .
  2. 可能出现的 Modifiers , 比如 redirect .
  3. 一个或多个 Mechanisms , 比如 include , ip4 .
  4. 最后用一个 all 结尾.

所有的规则, 从左往右开始匹配.

3. Modifiers

SPF 记录中可以包括两种可选的 Modifiers , 其只能出现一次:

redirect
用指定域名的 SPF 记录替换当前记录, 如 redirect=_spf.google.com

exp
(没见用过)

4. 前缀

Mechanisms 可以带 4 种前缀:

  • + Pass
  • - Fail
  • ~ Soft Fail
  • ? Neutral

默认是 + Pass .

四种前缀表示对应规则匹配时, 建议的服务器处理策略:

结果 含义 建议处理
Pass IP 合法 收信
Fail IP 非法 退信
Soft Fail IP 非法 收信, 但标记
Neutral 不清楚 收信
None 无 SPF 记录 收信
PermError 严重错误(SPF 格式错误) 无规定
TempError 临时错误(DNS 查询失败) 随便

5. Mechanisms

mechanisms 有下面这些:

  • all , 所有 IP , 一般放在最后.
  • ip4 , 指定 ipv4 的地址段.
  • ip6 , 指定 ipv6 的地址段.
  • a , 指定域名的 A 记录.
  • mx , 指定域名的 MX 记录.
  • include , 引入指定域名的 SPF 记录.
  • exists , 检查指定域名的 A 记录.
  • ptr , 指定域名的反查记录.
all 一般放最后, 定义未匹配时的处理.
"v=spf1 ip4:216.239.32.0/19 ~all"

ip4 指定一个 IPv4 地址, 或地址段.
"v=spf1 ip4:216.239.32.0 ~all"
"v=spf1 ip4:216.239.32.0/19 ~all"

ip6 指定一个 IPv6 地址, 或地址段.
"v=spf1 ip6:2001:4860:4000:: ~all"
"v=spf1 ip6:2001:4860:4000::/36 ~all"

a 指定一个域名(或默认本域名)的 A 记录, 可以添加段范围.
"v=spf1 a ~all"
"v=spf1 a:mail.google.com ~all"
"v=spf1 a/12 ~all"
"v=spf1 a:mail.google.com/18 ~all"

mx 指定一个域名(或默认本域名)的 MX 记录, 可以添加段范围.
"v=spf1 mx ~all"
"v=spf1 mx:mail.google.com ~all"
"v=spf1 mx/12 ~all"
"v=spf1 mx:mail.google.com/18 ~all"

include 引入指定域名的 SPF 记录.
"v=spf1 include:mail.google.com ~all"

exists 检查指定域名的 A 记录, 有结果则为命中.
"v=spf1 exists:google.com ~all"

ptr 反查指定域名的 IP 地址.
"v=spf1 ptr:google.com ~all"

多个 mechanisms 规则以空格分开, 比如上面的某个规则和最后的 all.

6. 参考资料

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
19156 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
28396 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22221 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
15845 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20321 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23543 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14884 0
+关注
zephyr
前端,Python,BI,OLAP
46
文章
4
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载