在上一篇中,我们通过 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 安装与密钥生成

  1. 安装工具

    yum install -y opendkim opendkim-tools
  2. 生成密钥
    建立目录并生成 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
  3. 权限修正 (至关重要)
    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:8891

2.5 重启生效

systemctl restart opendkim
systemctl enable opendkim
systemctl restart postfix

3. 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. 最终验证

        配置完成后,是时候检验成果了。

  1. 发送测试:向你的 Gmail 发送一封邮件。
  2. 查看源码:在 Gmail 中点击“显示原始邮件”。
  3. 寻找 PASS:如果看到 SPF: PASS, DKIM: PASS, DMARC: PASS,恭喜你!你的邮件服务器已经具备了进军收件箱的资格。

mail_10