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=none、p=quarantine、p=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)两种模式,分别由 aspf 和 adkim 标签控制,默认都是宽松。理解对齐只需抓住"组织域名"这个概念。
- 宽松对齐(r,默认值):只要认证域名与 From 域名的组织域名相同就算对齐。例如 Return-Path 是
bounce.a.example.com、From 是news@example.com,二者组织域都是 example.com,宽松模式下对齐通过。 - 严格对齐(s):域名必须逐字符完全一致。上例中
a.example.com与example.com在严格模式下就不对齐,只有example.com对example.com才算通过。
实践中 adkim=r; aspf=r 能兼容绝大多数第三方代发与邮件列表场景,是推荐起点;只有对安全要求极高、且所有发信源都使用根域本身认证时,才考虑严格模式。
DMARC 标签详解
一条 DMARC 记录由若干分号分隔的"标签=值"组成。下表列出全部常用标签、取值范围与配置建议。
| 标签 | 取值 | 说明与建议 |
|---|---|---|
v | DMARC1(固定) | 版本标识,必须存在且置于记录首位,拼写错误会导致整条记录被忽略。 |
p | none / quarantine / reject | 域名策略:仅监控、投入垃圾箱、直接拒收。按三阶段逐步升级,不要第一天就写 reject。 |
sp | 同 p | 专门针对子域的策略。没有发信业务的子域建议直接 sp=reject。 |
pct | 0–100,默认 100 | 对失败邮件应用策略的百分比。隔离阶段可先设 20 灰度,再逐步放大到 100。 |
rua | mailto: 地址,多个用逗号分隔 | 聚合报告收件人,强烈建议配置,这是盘点发信源的唯一数据来源。 |
ruf | mailto: 地址 | 单封失败取证报告收件人,内容可能包含邮件正文,按需配置。 |
fo | 0 / 1 / d / s,默认 0 | 取证报告触发条件:0 为 SPF 与 DKIM 均失败,1 为任一失败,d 仅 DKIM 失败,s 仅 SPF 失败。 |
adkim | r / s,默认 r | DKIM 对齐模式:r 为宽松(组织域相同即可),s 为严格(域名完全一致)。 |
aspf | r / s,默认 r | SPF 对齐模式,含义同 adkim。绝大多数域名保持 r 即可。 |
rf | afrf | 取证报告格式,配置 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 配置指南完成第一步。
| 机制 | 校验对象 | 发布位置 | 主要作用 | 缺失后果 |
|---|---|---|---|---|
| SPF | Return-Path 域名授权的发信 IP | 域名根下的 TXT 记录(v=spf1) | 验证 SMTP 发信服务器是否被域名授权 | 任意服务器可冒名发送,邮件极易进入垃圾箱 |
| DKIM | 用私钥签名的邮件内容,公钥发布在 selector._domainkey | 选择器主机下的 TXT 公钥记录 | 保证邮件内容完整未篡改,并证明签名域名身份 | 邮件可被中途改写,收件方无法确认来源真实性 |
| DMARC | SPF/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,攻击者就无法利用未受保护的子域名伪造邮件。