基于域的邮件验证、报告和一致性(DMARC) 这个规范旨在减少邮件滥用(例如通过伪造邮件的“From:” 报头。) DMARC 帮助域拥有者使用“域名系统”(DNS)来向收件服务器告知其 DMARC 策略,例如他们希望这些服务器如何处理自称来自他们域但无法验证实际来源的邮件。收件服务器在处理入站邮件时通过 DNS 查询检索到的这个策略,可以向服务器表明应该隔离或拒收不符合这个策略的邮件,或根本不采取任何操作(例如继续照常处理邮件)。除了这个策略以外,该域的 DMARC DNS 记录也可以包含服务器请求来向某人发送 DMARC 报告、概述自称来自此域的入站邮件的总数、它们是否通过验证、以及任何失败的详细信息。DMARC 的报告功能在确定您的邮件验证流程是否有效,以及伪造邮件使用您域名的频率时极其有用。
例如,假设接收方开启了SPF和DKIM,以及其自己的垃圾邮件过滤器,则流程可能类似于以下内容:
DMARC报告示例
<?xml version="1.0" encoding="UTF-8" ?>
<feedback>
<report_metadata>
<org_name>acme.com</org_name>
<email>noreply-dmarc-support@acme.com</email>
<extra_contact_info>http://acme.com/dmarc/support</extra_contact_info>
<report_id>9391651994964116463</report_id>
<date_range>
<begin>1335571200</begin>
<end>1335657599</end>
</date_range>
</report_metadata>
<policy_published>
<domain>example.com</domain>
<adkim>r</adkim>
<aspf>r</aspf>
<p>none</p>
<sp>none</sp>
<pct>100</pct>
</policy_published>
<record>
<row>
<source_ip>72.150.241.94</source_ip>
<count>2</count>
<policy_evaluated>
<disposition>none</disposition>
<dkim>fail</dkim>
<spf>pass</spf>
</policy_evaluated>
</row>
<identifiers>
<header_from>example.com</header_from>
</identifiers>
<auth_results>
<dkim>
<domain>example.com</domain>
<result>fail</result>
<human_result></human_result>
</dkim>
<spf>
<domain>example.com</domain>
<result>pass</result>
</spf>
</auth_results>
</record>
</feedback>
DMARC记录的标签和值
必需标签
v=
- 值:
DMARC1
- 这是“版本”标签,必须作为该记录的 DMARC 特定文本部分的第一个标签。即使其他 DMARC 标签值不区分字母大小写,v= 标签的值必须是大写字母: DMARC1。
- 示例:
- _dmarc IN TXT "v=DMARC1;p=none"
p=
- 值:
none | quarantine | reject
- 这是“策略”标签,必须作为 DMARC 记录中的第二个标签,紧接 v= 这个标签。
- p=none 表示收件服务器基于 DMARC 查询结果不采取任何操作。不得基于未通过 DMARC 检查这个失败隔离或拒收邮件。不过可以出于其他理由隔离或拒收这些邮件,例如未通过垃圾邮件过滤测试或与 DMARC 无关的其他安全检查。对于 p=none 的使用有时被称为“监控”或“监控模式”,因为您可以配合 rua= 这个标签一起使用来从收件域接收有关您邮件的综合报告,不过不会对未通过 DMARC 检查的这些邮件执行任何惩罚性操作。您可以一直使用这个策略,直到您彻底测试了您的 DMARC 实施,并确保您已准备好使用更具有限制性的 p=quarantine 策略。
- p=quarantine 这个策略用于以下场景:在邮件的“From:” 报头声称由您所发送但未通过 DMARC 检查时,您希望其他邮件服务器将该邮件视为可疑邮件。取决于服务器的本地策略,这可以表示对邮件进行额外审核、将其放入收件人的垃圾邮件文件夹、将其路由到不同的服务器或采取其他操作。
- p=reject 表示您希望收件服务器拒收未通过 DMARC 验证的任何邮件。不过一些服务器仍然接收这些邮件,不过将其隔离或进行额外审核。这是限制性最高的策略,通常不使用该策略,除非您对自己的邮件策略、以及您允许账户使用的邮件或服务类型把握十足。例如,如果您允许您的用户加入第三方邮件列表,使用邮件转发服务,并使用网站上的“共享”功能,使用 p=reject 将可能导致一些合法邮件被拒收。而且该设置也会使某些用户被一些邮件列表删除或阻止。
- 示例:
- _dmarc IN TXT "v=DMARC1;p=quarantine;rua=mailto:dmarc-report@example.net"
额外标签
以下列出的所有标签都是可选标签。如果未在记录中使用任何这些标签,则假定其默认值。
sp=
- 值:
none | quarantine | reject
- 默认值:如果未使用sp=,则对域和子域应用p=这个标签
- 此标签用来指定应用 DMAR 记录的域的子域将使用的策略。例如,如果应用于 example.com 的记录中使用了这个标签,那么会将 p= 这个标签中指定的策略应用于来自 example.com 的邮件,将 sp= 这个标签中指定的策略应用于来自 example.com 子域的邮件,例如 mail.example.com。如果在记录中忽略了这个标签,则将 p= 这个标签应用于该域及其子域。
- 示例:
- _dmarc IN TXT "v=DMARC1;p=quarantine;sp=reject"
rua=
- 值:由逗号分隔的将接收 DMARC 综合报告的邮件地址列表 必须使用以下格式输入作为 URI 的 地址:mailto:user@example.com
- 默认值:none
- 此标签表示您希望从接收了一封“From:” 声称来自您所在域邮件的收件服务器接收 DMARC 综合报告。使用以下格式指定作为 URI 的一个或多个邮件地址: mailto:user@example.com,使用逗号分隔多个 URI。
- 示例:
- _dmarc IN TXT "v=DMARC1;p=quarantine;rua=mailto:user01@example.com,mailto:user02@example.com"
- 通常这些地址将位于此记录覆盖的域。如果您希望将报告发送至其他域的地址,则该域的 DNS 区域文件必须也包含一个专用的 DMARC 记录,指示它将接收该域的 DMARC 报告。
- example.com 的记录示例:
- _dmarc IN TXT "v=DMARC1;p=quarantine;rua=mailto:non-local-user@example.net"
- example.net 的记录:
- example.com._report._dmarc TXT "v=DMARC1"
ruf=
- 值:由逗号分隔的将接收 DMARC 故障报告的邮件地址列表 必须使用以下格式输入作为 URI 的 地址:mailto:user@example.com
- 默认值:none
- 此标签表示您希望从接收了一封“From:” 声称来自您所在域邮件的服务器接收 DMARC 故障报告,前提是满足了在 fo= 这个标签中指定的条件。在默认情况下,如果未指定 fo= 这个标签,在邮件未通过所有 DMARC 验证检查时将发送故障报告(例如未通过 SPF 和 DKIM 验证)。使用以下格式指定作为 URI 的一个或多个邮件地址: mailto:user@example.com,使用逗号分隔多个 URI。
- 示例:
- _dmarc IN TXT "v=DMARC1;p=quarantine;ruf=mailto:dmarc-failures@example.com"
- 通常这些地址将位于此记录覆盖的域。如果您希望将报告发送至其他域的地址,则该域的 DNS 区域文件必须也包含一个专用的 DMARC 记录,指示它将接收该域的 DMARC 报告。
- example.com 的记录示例:
- _dmarc IN TXT "v=DMARC1;p=quarantine;ruf=mailto:non-local-user@example.net"
- example.net 的记录:
- example.com._report._dmarc TXT "v=DMARC1"
要了解有关 DMARC 规范的更多扩展信息,请参阅: www.dmarc.org
DMARC 始终与以下两种电子邮件身份验证方式或检查机制搭配使用:
- 发件人政策框架 (SPF) 允许网域所有者授权哪些 IP 地址可以向其网域发送电子邮件。邮件接收服务器可以验证看上去像来自特定网域的邮件是否由该网域所有者授权的服务器发出。
- 域名密钥标识邮件 (DKIM) 会为发出的每一封邮件添加数字签名。接收服务器会使用该签名来验证邮件是否真实,以及在传输过程中是否被伪造或更改。