# SPF / DKIM / DMARC 配置 ## 场景 自己发的邮件总进对方垃圾箱,或者收到的伪造邮件显示成自己域名发的。 ## 前置条件 - 能改 DNS 记录 - 知道发信服务器的出口 IP - 有邮件服务器(Postfix / Exchange)的管理权限 ## 配置 ### SPF(哪些 IP 有权以这个域名发信) ```text example.com. TXT "v=spf1 mx ip4:203.0.113.10 include:_spf.example.net -all" ``` `-all` 是硬失败,有绕行需求的先写 `~all` 观察。 ### DKIM(签名,证明没被篡改) Postfix + OpenDKIM: ```bash dnf install -y opendkim opendkim-tools mkdir -p /etc/opendkim/keys/example.com cd /etc/opendkim/keys/example.com opendkim-genkey -s mail -d example.com cat >>/etc/opendkim.conf <<'EOF' Domain example.com Selector mail KeyFile /etc/opendkim/keys/example.com/mail.private Socket inet:8891@localhost EOF systemctl enable --now opendkim ``` 把 `mail.txt` 里的内容作为 TXT 记录发布: ```text mail._domainkey.example.com TXT "v=DKIM1; k=rsa; p=MIIBIjANBg..." ``` ### DMARC(告诉对方怎么处理伪造邮件) ```text _dmarc.example.com TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com; pct=100" ``` `p=none` 只观察,`quarantine` 进垃圾箱,`reject` 直接拒收。 ## 验证 ```bash dig +short TXT example.com dig +short TXT mail._domainkey.example.com dig +short TXT _dmarc.example.com # 用 check-auth 验证签名 sendmail -t <<'EOF' To: test@example.com Subject: dkim test test EOF ``` 或者把邮件发到 `check-auth@verifier.port25.com`,回信里有 SPF/DKIM/DMARC 结果。 ## 回滚 删掉对应的 TXT 记录即可,邮件仍能发,只是验证不过。 ## 坑 - **SPF 只能有一条记录**,写两条等于没有。 - DNS 里 TXT 记录超过 255 字符要拆段,别手工截断。 - DKIM 私钥权限要 `600`,属主是 opendkim。 - 改了 DKIM selector 忘了同步 DNS。 - DMARC 一上来就 `p=reject`,自己的转发邮件全被拒。 - 邮件列表/转发会破坏 SPF,要靠 DKIM 补救。