DMARC 失败报告(RUF)和 fo 标签怎么配?为什么常常一份都收不到?
1
DMARC 失败报告(RUF)和 fo 标签怎么配?为什么常常一份都收不到?
▼
失败报告与聚合报告的分工
RFC 7489 第 7.3 节(Failure Reports)说明,失败报告在接收方检测到 DMARC 失败后几乎立即生成发送,用于快速告知域名所有者出现了认证失败;相比聚合报告,它能提供关于失败邮件更多的信息。
两者定位不同:聚合报告回答「整体上谁在用我的域、通过率如何」,失败报告回答「这一封具体为什么失败」。运维决策靠前者,个案排障靠后者。
ruf 与 fo 的配置语义
RFC 7489 第 6.3 节定义了两个相关标签:
ruf:接收失败报告的地址列表。不配置 ruf 就不会有失败报告,无论 fo 怎么写。fo:失败上报选项,控制在何种情况下生成报告。取值可组合(用冒号分隔):0表示当所有底层认证机制均未产生对齐的 pass 时上报(默认);1表示只要任一机制未产生对齐的 pass 就上报;d表示 DKIM 签名验证失败时上报;s表示 SPF 校验失败时上报。
默认值 fo=0 是最保守的:只有「全都没过」才报。这意味着「SPF 过了但 DKIM 挂了」这类部分失败在默认配置下不会产生报告。
想看到部分失败,应当显式配 fo=1
排查阶段推荐:
"v=DMARC1; p=none; rua=mailto:dmarc-rua@example.com; ruf=mailto:dmarc-ruf@example.com; fo=1"fo=1 会在任一机制未产生对齐 pass 时就上报,能提前暴露「靠单条腿勉强通过」的脆弱路径——这类路径一旦遇上转发就会彻底断掉。
若只关心某一侧,可用 fo=d 或 fo=s;需要同时覆盖可写 fo=d:s。
为什么配了却收不到:五个常见原因
- 接收方普遍不发。失败报告包含单封邮件的头部乃至内容片段,涉及第三方个人信息,出于隐私与合规考量,大量接收方选择完全不发送失败报告。这是最主要的原因,且无法通过调配置解决。
- fo 用了默认值。部分失败不触发,详见上一节。
- 外部地址未授权。与 rua 相同,RFC 7489 第 7.1 节(Verifying External Destinations)要求验证外部报告目的地;ruf 指向他域而未在目标域配置授权,报告会被放弃发送。
- 本域根本没有失败流量。这其实是好消息,可对照聚合报告确认。
- 报告被自家反垃圾拦了。报告本身是邮件,含可疑样本,极易被判为垃圾。务必检查接收邮箱的隔离区。
运维建议:把期望放在聚合报告上
- 不要把排障流程建立在失败报告必达的假设上。它是锦上添花,聚合报告才是基本盘。
- ruf 地址单独设置,与 rua 分开,便于配额与留存策略区分管理。
- 注意数据合规。失败报告可能含真实收件人地址与邮件片段,落地存储要设定访问控制与留存期限,避免形成新的敏感数据池。
- 排障替代路径:收不到失败报告时,用聚合报告中的源 IP 定位到具体发送系统,再到该系统本地日志中取原始头,同样能完成个案分析。
参考:RFC 7489 Domain-based Message Authentication, Reporting, and Conformance (DMARC)
