第五章 —— 邮件服务配置指南 · SPF、DKIM与DMARC(邮件防伪)

📌 第二部分:配置邮件防伪

在上一章中,我们了解了邮件服务器收发邮件的原理,并完成了Postfix的基本配置。接下来我们需要配置邮件防伪来提高邮件的送达率。

❓ 什么是邮件防伪?

邮件防伪,是指通过一系列机制验证邮件的真实性和发件人身份,防止邮箱用户收到伪造、冒名或钓鱼邮件。主要依靠 SPF、DKIM 和 DMARC 三项核心技术,从不同层面判断一封邮件是否可信。

通过配置邮件防伪机制,可以有效提升邮件的送达率,防止被误判为垃圾邮件,同时保护域名不被他人冒用。但值的注意的是,即使配置了邮件防伪,也有可能被识别为垃圾邮件。

🚨 可能被识别成垃圾邮件的情形
  1. IP或域名有“黑历史”
    • 你所用的第三方服务的IP曾被垃圾邮件滥用,可能已被列入黑名单。
  2. 邮件内容触发垃圾规则
    • 使用了过多营销词(如“免费”“优惠”“速抢”)
    • 内容过于短或只有图片、没有正文
    • 使用了可疑的链接(如未备案的短链、跳转等)
  3. 收件人行为不佳
    • 如果很多人点了“举报垃圾邮件”,你的域名信誉会下降。
    • 发给不存在的邮箱地址也会造成“退信率”高,影响信誉。
  4. 邮件格式问题
    • 没有 List-Unsubscribe 头部(群发类邮件)
    • 没有HTML + 纯文本版本(仅HTML也可能被嫌疑)
  5. 新域名/新IP发件
    • 刚启用的域名、IP没有历史记录,邮件提供商默认它“不可信”,会观察一段时间。
🛡️ 邮件防伪配置简要步骤
  1. 配置 SPF(发件人策略框架)
    • 在域名 DNS 中添加一条 TXT 记录
    • 表示只有指定 IP 和主机名能代表该域发送邮件
  2. 配置 DKIM(域名密钥识别邮件)
    • 安装并配置 OpenDKIM 服务
    • 为每个域生成 DKIM 公私钥对
    • 在 DNS 添加一条 TXT 记录,公布公钥。
    • Postfix 配置使用 DKIM 签名发出的邮件
  3. 配置 DMARC(基于域的消息认证、报告和一致性)
    • 在 DNS 中添加一条 TXT 记录,指定对 SPF/DKIM 的验证策略
    • 表示当验证失败时,建议将邮件隔离(或拒收)
  4. 测试与验证

SPF

❓ 什么是SPF?

SPF(Sender Policy Framework)是一种用来防止电子邮件伪造的机制。它通过DNS记录告诉世界哪些服务器是“被授权”可以代表你的域名发送邮件的。

SPF就像你在DNS上公开的白名单,告诉别人“这些IP地址或邮件服务器可以代表我发邮件,其他的都是冒充”。

🛠️ SPF 的工作原理:
  • 对方邮件服务器收到你发送的邮件后,会:
    • 查你邮件头中的“MAIL FROM”域名;
    • 到DNS查example.comTXT记录,看是否有SPF;
    • 检查你发送服务器的IP是否在SPF记录中;
    • 判断是否“pass”(通过)或“fail”(未授权发送)。
✅ SPF 的好处:
  • 减少垃圾邮件冒充你域名的概率;
  • 提高你的邮件送达率;
  • 对接收方来说,SPF 是反垃圾邮件检测的重要信号。

SPF的配置非常简单,只需要在DNS管理页面添加一条TXT记录。

v=spf1 ip4:youripaddr -all #允许这个IPv4地址发送邮件,除列出内容外全部拒绝

DKIM

❓ 什么是DKIM?

DKIM(DomainKeys Identified Mail)是一种电子邮件身份验证机制。它通过在邮件中添加数字签名,来证明这封邮件确实是从你的域名发出的,而且中途没有被篡改。

DKIM就像你域名的“电子印章”,收件方可以查验邮件上是否盖了“你的公章”,来确认它的真实性。

🛠️ DKIM 的工作原理:
  1. 你发送邮件,Postfix通过OpenDKIM自动给邮件添加签名头(DKIM-Signature)。
  2. 签名基于你保存在服务器上的私钥,对邮件的特定部分(如FromSubjectDate等)进行加密生成。
  3. 接收方的邮件服务器会:
    • 查看邮件中的DKIM-Signature
    • 通过DNS查询你域名发布的公钥
    • 用这个公钥验证邮件的签名是否正确;
    • 判断邮件是否被修改过或是否伪造。
✅ DKIM 的好处:
  • 增强邮件的可信度;
  • 防止中间人修改邮件内容;
  • 提高送达率,减少被Gmail、Outlook等大厂误判为垃圾邮件的风险;
  • 是通过DMARC验证的必要条件之一。
🚨 注意事项:
  • DKIM必须配合DNS正确发布公钥;
  • 私钥必须保密且安全存储;
  • 签名失败(比如DNS解析失败、邮件被篡改)会影响送达率;
  • 有些邮件客户端修改邮件内容(如签名或转发时加广告)也可能导致DKIM验证失败。
🛠️ 配置DKIM:

首先安装软件包,这个软件包较为特殊,需要启用crb仓库。

$ sudo dnf config-manager --set-enabled crb
$ sudo dnf makecache
$ sudo dnf install opendkim opendkim-tools

生成密钥对。

$ opendkim-genkey -t -s mail -d example.com

#假设密钥对在example用户的家目录下面:
/home/example/mail.private #私钥
/home/example/mail.txt #公钥

复制私钥到指定的目录。

$ sudo mkdir -p /etc/opendkim/keys
$ sudo chown -R opendkim:opendkim /etc/opendkim/keys
$ sudo chmod 700 /etc/opendkim/keys/
$ sudo cp mail.private /etc/opendkim/keys/
$ sudo chown opendkim:opendkim /etc/opendkim/keys/mail.private
$ sudo chmod 600 /etc/opendkim/keys/mail.private

编辑opendkim.conf

$ sudo vim /etc/opendkim.conf

#查找下列字段并修改:
Mode	sv
Syslog	yes
SyslogSuccess	yes
LogWhy	yes
UserID	opendkim:opendkim
Socket inet:12345@localhost
Umask	002
SendReports	yes
SoftwareHeader	yes
Canonicalization	relaxed/relaxed
Domain	example.com
Selector	mail
MinimumKeyBits	1024
KeyFile	/etc/opendkim/keys/mail.private
KeyTable	/etc/opendkim/KeyTable #将选择器(selector)、域名和对应的私钥文件路径建立映射关系。
SigningTable	refile:/etc/opendkim/SigningTable #告诉OpenDKIM:发件人地址匹配这个规则时,使用KeyTable中的哪一组签名密钥。
ExternalIgnoreList	refile:/etc/opendkim/TrustedHosts #告诉OpenDKIM:哪些主机发来的邮件可以信任,不需要对其进行身份验证。
InternalHosts	refile:/etc/opendkim/TrustedHosts
OversignHeaders	From

创建KeyTable、SigningTable和TrustedHosts文件,并写入下列内容。

$ sudo vim /etc/opendkim/KeyTable
mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/mail.private
$ sudo vim /etc/opendkim/SigningTable
*@example.com mail._domainkey.example.com
$ sudo vim /etc/opendkim/TrustedHosts
127.0.0.1
::1
*.example.com

更新/etc/postfix/main.cf文件,写入:

milter_default_action = accept #当Milter(如opendkim)不可用时,Postfix应该采取的动作。
smtpd_milters = inet:localhost:12345 #SMTP服务在接收外部邮件时,调用哪些Milter服务进行处理。
non_smtpd_milters = inet:localhost:12345 #指定Postfix对于非SMTP方式投递的邮件(如本地队列投递、sendmail命令),是否也启用相同的Milter。

在DNS中添加TXT记录,HOSTNAME部分填写mail._domainkey,TEXT部分填写:

$ cat /home/example/mail.txt #复制p=后面的内容
v=DKIM1; k=rsa; p=publickey #publickey部分用公钥代替 

启动Opendkim:

$ sudo systemctl enable --now opendkim
$ sudo systemctl status opendkim

#你会发现服务启动failed了,日志显示服务无法在12345端口上监听。

WHY?还记得SELinux吗?趁这个机会我们来了解一下SELinux权限问题的解决思路

首先我们来确定一下deny的具体原因:

$ sudo ausearch -m avc -ts recent
#如果没有这个命令,安装它。
$ sudo dnf install audit

从日志的结果不难发现,是因为opendkim的进程需要监听端口12345,这个操作被SELinux拒绝了,所以服务failed。

既然如此,我们只要允许这个操作即可。

$ sudo dnf install setroubelshoot-server
$ sudo sealert -a /var/log/audit/audit.log #该命令的输出会建议我们执行什么样的操作来放宽SELinux策略。
$ sudo semanage port -a -t milter_port_t -p tcp 12345 #允许opendkim进程监听端口12345
$ sudo systemctl restart opendkim
$ netstat -tuln #查看是否监听12345端口

DMARC

DMARC(Domain-based Message Authentication, Reporting, and Conformance)是基于SPF和DKIM的邮件身份认证机制,它的作用是:

  • 防止邮件伪造(比如钓鱼邮件冒充你的域名)。
  • 告知收件方当 SPF 或 DKIM 验证失败时该怎么处理邮件(拒收、隔离或接受)。
  • 收集报告,了解谁在发送伪造你域名的邮件。

DMARC本身不直接验证邮件,而是基于SPF和DKIM的验证结果,再加上 “发件人地址是否对得上” 来判断邮件是否可信。

例如某人伪造你域名发垃圾邮件,这个行为导致DKIM和SPF都会失败而触发DMARC,假设策略设置为reject,那么收件方服务器直接拒收伪造的邮件。

要实现DMARC,只需要在DNS中添加TXT记录,HOSTNAME设置为_dmarcTEXT设置如下:

v=DMARC1; p=quarantine; rua=mailto:example@example.com #策略quarantine表示将邮件隔离(进垃圾箱)。rua的值是接收报告的邮件地址,要真实存在。

测试

现在我们来测试一下邮件收发功能。
假设你现在用example用户登录的系统,下面的命令会给xxx@126.com的邮箱发送一封主题为Test Email的邮件,内容为“This is a test email”,发件人是example@example.com

$ sudo dnf install s-nail
$ echo "This is a test email" | mail -s "Test Email" xxx@126.com #126邮箱的反垃圾邮件政策比较宽松,适合用来测试。

检查xxx@126.com的邮箱是否收到邮件,并进行回复,然后用mail命令检查example用户是否收到新邮件。

最后用mail-tester来检查自己的信誉度。预祝各位满分通过!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注