什么是 DMARC?
DMARC(基于域名的消息身份验证、报告与一致性)是一种电子邮件身份验证协议,用于检查经过 SPF 或 DKIM 身份验证的域名是否与邮件 From 地址中的域名对齐。域名所有者可以为未通过 DMARC 验证的邮件发布所请求的处理偏好,并请求汇总报告或针对具体邮件的失败报告。
为什么 DMARC 必不可少
SPF 和 DKIM 会验证发送标识。单独使用时,它们不会检查经过身份验证的标识是否与 From 地址中的域名对齐,也不会声明域名所有者对失败邮件的处理偏好。
DMARC 通过以下方式解决这一问题:
- 声明处理偏好:对于未通过 DMARC 的邮件,可选择 None、quarantine 或 reject
- 检查对齐:至少一个经过身份验证的 SPF 或 DKIM 标识必须与 From 域名对齐
- 请求报告:汇总报告和针对具体邮件的失败报告可帮助了解观测到的身份验证结果
DMARC 如何工作
1. 发送方发布 DMARC 政策到 DNS(位于 _dmarc.domain.com 的 TXT 记录)
2. 发送电子邮件,使用 From: [email protected]
3. 接收方检查 SPF 和 DKIM
4. 接收方检查对齐:经过身份验证的域名是否与 From 标头匹配?
5. 处理决策:接收方会结合所请求的政策和其他信号进行判断
6. 可能发送报告:参与的接收方可能发送所请求的汇总报告或针对具体邮件的失败报告
DMARC 对齐
DMARC 要求对齐:From 标头中的域名必须在记录的宽松或严格模式下与至少一个经过身份验证的标识对齐:
- SPF 对齐:SPF 验证的 MAIL FROM 域名,或 MAIL FROM 为空时的 HELO 域名
- DKIM 对齐:有效 DKIM 签名中的 d= 域名
如果不存在对齐,SPF 或 DKIM 可能通过,而 DMARC 仍然失败。DMARC 直接解决使用完全相同 From 域名的特定形式的欺骗。它无法检测视觉上相似的域名或滥用发件人的显示名称。
DMARC 记录格式
DMARC 记录是位于 _dmarc.yourdomain.com 的 TXT 记录:
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; rua=mailto:[email protected]"
DMARC 标签
| 标签 | 必填 | 描述 | 示例 |
|---|---|---|---|
| v | 是 | 版本 | v=DMARC1 |
| p | 推荐(可选) | 对未通过 DMARC 验证的邮件所请求的处理偏好 | p=none/quarantine/reject |
| rua | 否 | 汇总报告 URI | rua=mailto:[email protected] |
| ruf | 否 | 针对具体邮件的失败报告 URI | ruf=mailto:[email protected] |
| t | 否 | 政策测试模式 | t=y or t=n |
| sp | 否 | 现有子域名所请求的政策 | sp=reject |
| np | 否 | 不存在的子域名所请求的政策 | np=reject |
| adkim | 否 | DKIM 对齐模式 | adkim=s (strict) or adkim=r (relaxed) |
| aspf | 否 | SPF 对齐模式 | aspf=s or aspf=r |
pct 标签具有历史遗留性质。当前 DMARC 标准不再使用它来将政策应用于一定百分比的失败邮件。p 标签建议使用但不是必需的;如果记录在其他方面有效但缺少该标签,则按 p=none 处理。
DMARC 政策
p=none:不为失败邮件表达任何处理偏好。域名所有者通常会在查看报告期间使用它。v=DMARC1; p=none; rua=mailto:[email protected]
p=quarantine:请求接收方将 DMARC 失败邮件视为可疑邮件。
v=DMARC1; p=quarantine; rua=mailto:[email protected]
p=reject:请求接收方拒绝 DMARC 失败邮件。接收方会将此偏好与其他信号一并考虑,因此不能保证拒绝。
v=DMARC1; p=reject; rua=mailto:[email protected]
DMARC 实施路径
阶段 1:监控 (p=none)
从监控开始,了解您的电子邮件生态:
v=DMARC1; p=none; rua=mailto:[email protected]
分析报告以识别:
- 缺少 SPF/DKIM 的合法发送服务
- 未经授权的发送方(欺骗)
- 对齐问题
阶段 2:隔离 (p=quarantine)
合法来源经过身份验证后:
v=DMARC1; p=quarantine; rua=mailto:[email protected]
查看报告并确认合法邮件已通过身份验证,然后再选择更严格的政策。当前 DMARC 标准未定义按百分比逐步部署的方案。
阶段 3:拒绝 (p=reject)
请求拒绝 DMARC 失败邮件:
v=DMARC1; p=reject; rua=mailto:[email protected]
DMARC 报告
汇总报告 (rua)
建议接收方每天或更频繁地发送汇总 XML 报告。报告会总结观测到的邮件流,因此可用性和覆盖范围取决于发送报告的接收方:
- 电子邮件量
- SPF、DKIM、DMARC 的通过/失败率
- 发送 IP 地址
- 收件方组织
失败报告 (ruf)
针对具体邮件的报告可能包含邮件标头或内容。并非所有接收方都会发送这类报告,通常是出于隐私方面的考虑:
- 身份验证失败详情
报告处理
DMARC 汇总报告采用 XML 格式,可能难以阅读。可使用以下服务:
- DMARC Analyzer
- Dmarcian
- Valimail
- Postmark DMARC
检查 DMARC
经过身份验证的 DomScan Email Authentication API 每个域名消耗 3 个积分,并返回 DMARC 记录及解析后的标签。
dig _dmarc.example.com TXT
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/email-auth?domain=example.com"
# Check dmarc.record and dmarc.tags in the JSON response
常见 DMARC 问题
未收到报告:确保 rua 地址能够接收大邮件;一些提供商会进行过滤。 合法邮件验证失败:检查所有发送服务的 SPF/DKIM 配置;验证对齐情况。 第三方服务验证失败:许多服务要求自定义 DKIM 设置,才能实现 DMARC 对齐。DMARC 为 SPF 和 DKIM 增加了对齐、所请求的处理偏好和报告功能。在请求更严格的处理之前,请查看您的发送来源和报告。