0aa8fe6
这次没有正文改动。
这是 mail/SPF - DKIM - DMARC 配置.md 的改动记录。后台每次保存都会留一份快照,
这里显示的是快照之间的差异,不会混入其他文章的改动。
还没有后台修改记录。
下面是 Git 里的提交,可能包含其他文章的改动(因为一次提交会带上工作区所有变化)。
0aa8fe6
这次没有正文改动。
60178fc
@@ -0,0 +1,91 @@ +--- +tags: [SPF, DKIM, DMARC, 邮件] +order: 20 +--- + +# 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 补救。