在上一篇中,我们通过 Cloudflare 的电子邮件路由解决了“收信”问题。但在“发信”环节,Cloudflare 帮不上忙。如果你直接用 VPS 发送邮件,Gmail 和 Outlook 会立刻把你的邮件扔进垃圾箱,甚至直接拒收。
为什么?因为任何人都可以伪造发件人。为了证明“我真的是我”,我们需要配置三种 DNS 验证记录:SPF(验证 IP)、DKIM(验证签名)、DMARC(验证策略)。
1. SPF:IP 身份证
SPF (Sender Policy Framework) 是一个 DNS TXT 记录。它的作用非常直白:“同时也请告诉收件方,只有以下 IP 地址有权代表 example.com 发送邮件。”
1.1 语法速查
| 机制 | 含义 |
|---|---|
a | 允许域名 A 记录解析出的 IP |
mx | 允许 MX 记录解析出的 IP |
ip4 | 允许指定的 IPv4 地址/网段 |
ip6 | 允许指定的 IPv6 地址/网段 |
include | 引入其他服务商的 SPF (如 include:_spf.google.com) |
-all | 硬拒绝:除了上面列出的,其他的全拒绝 (推荐) |
~all | 软拒绝:其他的标记为可疑但放行 (调试期用) |
1.2 实战配置
前往 DNS 服务商,添加一条 TXT 记录:
- Name:
@(或子域名mail,视你的发信域名而定) Content:
v=spf1 mx a ip4:你的VPS_IP ip6:你的VPS_IP -all
2. DKIM:防篡改封条
SPF 只验证了 IP,但如果黑客和你同在一个机房怎么办?DKIM (DomainKeys Identified Mail) 利用非对称加密技术,在邮件头部打上一个数字签名。接收方通过 DNS 查询你的公钥,解密签名并与邮件内容比对。只要邮件在传输途中被改了一个标点符号,验证就会失败。
Postfix 只负责传信,不负责签名,所以我们需要安装 OpenDKIM。
2.1 安装与密钥生成
安装工具:
yum install -y opendkim opendkim-tools生成密钥:
建立目录并生成 RSA 密钥对。注意:这里我们将选择器 (Selector) 命名为default。# 创建目录 mkdir -p /etc/opendkim/keys/example.com cd /etc/opendkim/keys/example.com # 生成密钥 (2048位更安全) # -d 域名, -s 选择器名称 opendkim-genkey -b 2048 -d example.com -s default权限修正 (至关重要):
OpenDKIM 必须能读取私钥,否则无法启动。chown -R opendkim:opendkim /etc/opendkim chmod 640 /etc/opendkim/keys/[example.com/default.private](https://example.com/default.private)
2.2 获取公钥并添加 DNS
生成完毕后,目录下会有两个文件:
default.private:私钥 (严禁外泄)default.txt:公钥 DNS 记录
查看 default.txt 的内容,去 DNS 服务商添加 TXT 记录:
- Name:
default._domainkey(注意包含选择器名) - Content: 复制
v=DKIM1; k=rsa; p=...引号内的所有内容。
2.3 配置 OpenDKIM
编辑配置文件 /etc/opendkim.conf。为简单起见,我们采用单域名直接配置模式:
# 基础运行模式
Mode s # s=signer (仅签名), v=verifier (仅验证)
Syslog yes
LogWhy yes
# 身份与权限
UserID opendkim:opendkim
Umask 002
# 监听端口 (Postfix 将连接这个端口)
Socket inet:[email protected]
PidFile /run/opendkim/opendkim.pid
# 签名核心配置
Canonicalization relaxed/relaxed
OversignHeaders From,Subject,Date,To
# === 域名与密钥路径 (请修改为你自己的) ===
Domain example.com
Selector default
KeyFile /etc/opendkim/keys/[example.com/default.private](https://example.com/default.private)2.4 关联 Postfix
修改 Postfix 主配置 /etc/postfix/main.cf,告诉它:“发邮件前,先要把邮件扔给 localhost:8891 盖个章”。
# --- OpenDKIM Integration ---
# 指定 Milter (邮件过滤器) 协议版本
milter_protocol = 6
# 无论过滤器结果如何,默认接受邮件 (防止 DKIM 挂了导致无法发信)
milter_default_action = accept
# 指定过滤器的地址 (对应 opendkim.conf 里的 Socket)
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:88912.5 重启生效
systemctl restart opendkim
systemctl enable opendkim
systemctl restart postfix3. DMARC:补救与监控
SPF 和 DKIM 只是“验证工具”,如果验证失败了该怎么办?DMARC (Domain-based Message Authentication, Reporting, and Conformance) 就是用来定义策略的。它告诉收件方:“如果 SPF 和 DKIM 都挂了,请直接拒收,并且发一份报告给我。”
3.1 核心参数
| 参数 | 作用 | 推荐设置 |
|---|---|---|
p | 策略:none(观察), quarantine(进垃圾箱), reject(拒收) | 初期 none,稳定后 reject |
rua | 聚合报告:每天发一份统计报告到指定邮箱 | 必填 |
ruf | 取证报告:每封失败邮件都发报告 (量大,慎填) | 选填 |
pct | 百分比:多少比例的邮件执行策略 | 100 |
3.2 实战配置
添加 DNS TXT 记录:
- Name:
_dmarc Content:
v=DMARC1; p=none; pct=100; rua=mailto:[email protected](建议初期设置 p=none 观察一段时间,确保没有误杀后再改为 p=reject)
4. 最终验证
配置完成后,是时候检验成果了。
- 发送测试:向你的 Gmail 发送一封邮件。
- 查看源码:在 Gmail 中点击“显示原始邮件”。
- 寻找 PASS:如果看到
SPF: PASS,DKIM: PASS,DMARC: PASS,恭喜你!你的邮件服务器已经具备了进军收件箱的资格。

评论已关闭