Oamc

SPF / DKIM / DMARC 配置 · 修改记录

这是 mail/spf-dkim.md 的每次改动内容,按时间从新到旧。其他文章一起提交的部分不会出现在这里。

#1 2026-10-18 +91 −0 docs: 新增邮件系统、VPN 分类,网络设备补 BGP/QinQ/IRF/镜像 4 篇 60178fc
 new file mode 100644
 @@ -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 补救。