DMARC 部署指南:从 p=none 到 reject 的完整路线

DMARC 建立在 SPF 与 DKIM 之上:它告诉收件方,当邮件未通过认证时应当如何处理,并让收件方定期把统计报告发回给你。正确的部署路线不是一步到位,而是先确保 SPF、DKIM 稳定通过,再以 p=none 监控盘点,用 p=quarantine 灰度隔离,最终切换到 p=reject 在 SMTP 阶段直接拒收仿冒邮件。整个过程通常需要 4 到 8 周,本文给出每个阶段的示例记录、观察重点与升级检查清单。

什么是 DMARC

DMARC(Domain-based Message Authentication, Reporting and Conformance,基于域名的邮件认证、报告与一致性策略)是一条发布在 _dmarc.你的域名 主机下、以 v=DMARC1 开头的 TXT 记录。它本身不负责验真,而是建立在 SPF 与 DKIM 的校验结果之上:收件方先检查 SPF 和 DKIM,再判断它们的认证域名是否与用户看到的信头 From 地址"对齐",最后按照你在 DMARC 记录中声明的策略(p=nonep=quarantinep=reject)统一处置。

DMARC 还解决了 SPF/DKIM 都没有解决的两件事:一是明确"认证失败时怎么办",二是通过 rua 标签要求 Gmail、Outlook 等收件方把每日投递统计以聚合报告的形式回传给你。一句话概括:SPF 和 DKIM 负责"验真",DMARC 负责"定规矩、收报告"。

为什么只有 SPF 还不够

SPF 校验的是 SMTP 会话中的 Return-Path(即 MAIL FROM)域名是否授权了当前发信 IP,而用户在邮件客户端里看到的发件人是信头 From 地址——这两个地址在规范上允许完全不同。于是攻击者可以在自己控制的域名上配置一条完全合法的 SPF 记录,让 SPF 校验结果是 pass,却把信头 From 伪造成 你的域名。传统 SPF 看不到这个仿冒,因为它根本不检查 From。

DMARC 用"对齐(alignment)"机制补上了这个缺口:通过验证的 SPF 域名(或 DKIM 的签名域名 d=)必须与信头 From 的域名一致,至少要同属一个组织域;两者都不对齐时,DMARC 判定为失败,并按你声明的策略处置。这意味着即使攻击者自己的 SPF 是 pass,冒用你的 From 仍然会被拦截。

SPF 对齐与 DKIM 对齐

对齐分宽松(relaxed)和严格(strict)两种模式,分别由 aspfadkim 标签控制,默认都是宽松。理解对齐只需抓住"组织域名"这个概念。

  • 宽松对齐(r,默认值):只要认证域名与 From 域名的组织域名相同就算对齐。例如 Return-Path 是 bounce.a.example.com、From 是 news@example.com,二者组织域都是 example.com,宽松模式下对齐通过。
  • 严格对齐(s):域名必须逐字符完全一致。上例中 a.example.comexample.com 在严格模式下就不对齐,只有 example.comexample.com 才算通过。

实践中 adkim=r; aspf=r 能兼容绝大多数第三方代发与邮件列表场景,是推荐起点;只有对安全要求极高、且所有发信源都使用根域本身认证时,才考虑严格模式。

DMARC 标签详解

一条 DMARC 记录由若干分号分隔的"标签=值"组成。下表列出全部常用标签、取值范围与配置建议。

标签取值说明与建议
vDMARC1(固定)版本标识,必须存在且置于记录首位,拼写错误会导致整条记录被忽略。
pnone / quarantine / reject域名策略:仅监控、投入垃圾箱、直接拒收。按三阶段逐步升级,不要第一天就写 reject。
sp同 p专门针对子域的策略。没有发信业务的子域建议直接 sp=reject
pct0–100,默认 100对失败邮件应用策略的百分比。隔离阶段可先设 20 灰度,再逐步放大到 100。
ruamailto: 地址,多个用逗号分隔聚合报告收件人,强烈建议配置,这是盘点发信源的唯一数据来源。
rufmailto: 地址单封失败取证报告收件人,内容可能包含邮件正文,按需配置。
fo0 / 1 / d / s,默认 0取证报告触发条件:0 为 SPF 与 DKIM 均失败,1 为任一失败,d 仅 DKIM 失败,s 仅 SPF 失败。
adkimr / s,默认 rDKIM 对齐模式:r 为宽松(组织域相同即可),s 为严格(域名完全一致)。
aspfr / s,默认 rSPF 对齐模式,含义同 adkim。绝大多数域名保持 r 即可。
rfafrf取证报告格式,配置 ruf 时固定写 rf=afrf 即可。
ri秒数,默认 86400请求的聚合报告间隔。只是"请求",收件方可以自行决定是否遵守。

阶段一:p=none 监控部署

第一步永远是监控而不是拦截。发布 p=none 记录前,先确认以下前置条件全部满足:

  • 所有合法发信源(自有邮局、事务邮件服务、营销平台等)的 SPF 都能稳定返回 pass
  • 主要发信源已完成 DKIM 签名,且公钥记录可以被收件方正常解析验证;
  • 信头 From 域名与 SPF/DKIM 认证域名在宽松模式下能够对齐;
  • 已准备一个可长期收信的邮箱(如 postmaster)用于接收 rua 报告。

在 DNS 服务商处新增一条 TXT 记录,主机记录填写 _dmarc,记录值如下:

v=DMARC1; p=none; rua=mailto:postmaster@example.com

记录生效后保持观察 2 到 4 周。这段时间不会拦截任何邮件,但你会陆续收到 Gmail、Outlook 等发来的聚合报告。重点是从中识别"未登记的合法发信源"——比如某个忘了报备的 SaaS 系统、老的自动化脚本或第三方代发平台,把它们逐一补全 SPF/DKIM,直到报告里所有你认识的来源都显示对齐通过。

阶段二:p=quarantine 隔离

当 rua 报告中的合法来源基本都能对齐通过后,把策略升级为 quarantine——失败邮件不会被直接拒收,而是被放进收件方的垃圾箱。建议配合 pct 从小比例开始灰度:

v=DMARC1; p=quarantine; pct=20; rua=mailto:postmaster@example.com

观察几天没有正常邮件被误投后,把 pct 依次提升到 50、再到 100。与此同时,如果你的大部分子域名并不发信,可以在同一条记录里用 sp=reject 先一步锁死子域,防止攻击者利用 mail.你的域名 这类未防护的子域名伪造邮件:

v=DMARC1; p=quarantine; pct=100; sp=reject; rua=mailto:postmaster@example.com

阶段三:p=reject 拒绝

隔离策略稳定运行后,就可以切换到最终形态 p=reject。此后未通过 DMARC 对齐的仿冒邮件会在 SMTP 连接阶段被收件方直接拒收,连垃圾箱都不会进入:

v=DMARC1; p=reject; rua=mailto:postmaster@example.com; adkim=r; aspf=r

注意升级到 reject 后仍应保留 rua,报告可以帮助你持续发现新出现的未授权发信源。升级前请对照以下清单逐项确认:

  • 最近连续两周以上的 rua 报告中,没有任何合法来源出现 SPF 或 DKIM 对齐失败;
  • pct=100 的 quarantine 策略已稳定运行满两周,且没有用户投诉正常邮件进垃圾箱;
  • 所有第三方发信(工单系统、营销邮件、账单与验证码等事务邮件)都已登记并完成 SPF/DKIM 配置;
  • 接收 rua 的邮箱工作正常,你能持续看到每日报告。

rua 聚合报告怎么收

rua 报告本质是定时发送的压缩包(zip/gzip),解压后是一份 XML 文件,普通企业邮箱或免费邮箱都可以直接接收,不需要任何特殊系统。每天每一个给你发信量较大的收件方(Gmail、Outlook 等)都会发来一封,内容包括:各来源 IP 的发信数量、SPF 通过与失败数量、DKIM 通过与失败数量,以及失败是否源于"不对齐"。

如果团队多人协作或管理多个域名,直接读 XML 会比较吃力,可以使用专业的 DMARC 报告分析服务,它们会把报告解析成图表并自动标注新来源。配置多个接收人时用逗号分隔,每个 mailto: 地址段控制在 255 字符以内,例如:

v=DMARC1; p=none; rua=mailto:postmaster@example.com,mailto:dmarc@report-service.example

常见错误与排错

DMARC 记录本身很短,但配置位置和升级节奏上的错误非常常见。部署时重点避开以下问题:

  • 记录放错主机:DMARC 必须发布在 _dmarc.example.com,而不是根域 example.com,放在根域不会有任何收件方读取。
  • 漏掉版本标识:记录必须以 v=DMARC1 开头,漏写或拼错(如写成 DMARC 空格)会导致整条记录失效。
  • 没验证就直接 reject:SPF/DKIM 尚未稳定通过、或者还没盘点清发信源就直接 p=reject,会大面积误伤正常邮件。
  • 永远停在 none:p=none 只产生报告、不拦截任何邮件,长期不升级等于给仿冒邮件敞开投递。
  • rua 邮箱不存在:报告全部退信,你也失去了观察发信源的窗口。
  • 多条记录或 TXT 拼接错误:同一个 _dmarc 主机下只能有一条 DMARC TXT 记录,否则返回 Permerror;记录超过 255 字符时需要在 DNS 中用多段引号字符串正确拼接。

每次修改记录后,建议用 DMARC 检查工具确认解析结果与策略标签是否符合预期;SPF 侧可配合 SPF 检查工具核对授权范围。

SPF、DKIM、DMARC 三者关系总结

三者是层层递进而不是互相替代的关系:SPF 授权发信 IP,DKIM 给邮件内容签名,DMARC 在前两者之上要求与 From 对齐并声明处置策略。完整的邮件认证体系应当三者齐备,可配合阅读 SPF 配置指南完成第一步。

机制校验对象发布位置主要作用缺失后果
SPFReturn-Path 域名授权的发信 IP域名根下的 TXT 记录(v=spf1)验证 SMTP 发信服务器是否被域名授权任意服务器可冒名发送,邮件极易进入垃圾箱
DKIM用私钥签名的邮件内容,公钥发布在 selector._domainkey选择器主机下的 TXT 公钥记录保证邮件内容完整未篡改,并证明签名域名身份邮件可被中途改写,收件方无法确认来源真实性
DMARCSPF/DKIM 结果与信头 From 的对齐情况_dmarc 主机下的 TXT 记录(v=DMARC1)声明失败邮件的处置策略,并回收聚合报告冒用你的 From 地址没有统一拦截依据,仿冒邮件直达收件箱

DMARC 常见问题

没有 DKIM 能直接配 DMARC 吗?

可以起步,但保护并不完整。DMARC 要求 SPF 与 DKIM 中至少有一项通过且与发信域名对齐:只要 SPF 校验通过,并且 Return-Path 与信头 From 在宽松模式下属于同一组织域,DMARC 就能生效。不过只靠 SPF 覆盖面较窄,在邮件转发等场景中容易失败,建议尽快为主要发信源补上 DKIM 签名,并长期保持至少有一项能够稳定对齐。

p=none 有什么实际作用?

p=none 不会拦截任何邮件,但会要求收件方通过 rua 把投递统计以聚合报告的形式发回给你。它的实际作用是盘点全部合法发信源、核对 SPF/DKIM 及其对齐是否正常、评估升级策略后可能的影响面,是每个域名部署 DMARC 的必经阶段,通常需要观察 2 到 4 周。

rua 和 ruf 报告有什么区别?

rua 是聚合报告,按天或按约定间隔汇总各来源 IP 的发信量、SPF/DKIM 通过与失败数量以及对齐情况,体积小,适合例行监控;ruf 是取证报告,针对单封验证失败的邮件发送包含部分邮件内容的副本,体积大且涉及隐私,多数域名只配置 rua 即可。

配置到 p=reject 一般要多久?

通常需要 4 到 8 周:先用 p=none 监控 2 到 4 周摸清全部发信源,再用 p=quarantine 运行 1 到 2 周,可以借助 pct 从小比例逐步放大到 100,确认没有正常邮件被隔离后再升级 p=reject。发信源越多、第三方代发越复杂,需要的时间越长。

子域名会继承 DMARC 策略吗?

会。没有单独发布 DMARC 记录的子域会继承组织域的策略;也可以在组织域记录中用 sp 标签为所有子域统一指定策略。建议对没有发信需求的子域直接设置 sp=reject,攻击者就无法利用未受保护的子域名伪造邮件。