SPF / DKIM / DMARC 配置
场景
自己发的邮件总进对方垃圾箱,或者收到的伪造邮件显示成自己域名发的。
前置条件
- 能改 DNS 记录
- 知道发信服务器的出口 IP
- 有邮件服务器(Postfix / Exchange)的管理权限
配置
SPF(哪些 IP 有权以这个域名发信)
example.com. TXT "v=spf1 mx ip4:203.0.113.10 include:_spf.example.net -all"
-all 是硬失败,有绕行需求的先写 ~all 观察。
DKIM(签名,证明没被篡改)
Postfix + OpenDKIM:
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 记录发布:
mail._domainkey.example.com TXT "v=DKIM1; k=rsa; p=MIIBIjANBg..."
DMARC(告诉对方怎么处理伪造邮件)
_dmarc.example.com TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com; pct=100"
p=none 只观察,quarantine 进垃圾箱,reject 直接拒收。
验证
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 补救。