第4部分:在CentOS 8 / RHEL 8邮件服务器上使用Postfix设置SPF和DKIM
在完成第1部分和第2部分后,我们将使用可运行的Postfix SMTP服务器和Dovecot IMAP服务器。 我们可以使用桌面电子邮件客户端发送和接收电子邮件。 虽然我创造了正确的 MX, 一种 和 PTR 记录,我的电子邮件被Gmail和Outlook邮件标记为垃圾邮件。 因此,在这一部分中,我们将研究如何通过在CentOS / RHEL服务器上设置SPF和DKIM来改善到收件人收件箱的电子邮件传递。
什么是SPF和DKIM记录?
SPF和DKIM是DNS中的两种TXT记录,可以帮助防止电子邮件欺骗并将合法电子邮件传递到收件人的收件箱而不是垃圾邮件文件夹中。 如果您的域被电子邮件欺骗滥用,那么如果收件人没有将您添加到通讯簿中,则您的电子邮件很可能会落入收件人的垃圾邮件文件夹中。
防晒指数 (发件人策略框架)记录指定 哪些主机或IP地址被允许代表域发送电子邮件。 您应该只允许自己的电子邮件服务器或ISP的服务器为您的域发送电子邮件。
DKIM (DomainKeys Identified Mail)使用私钥来 为您的域发送的电子邮件添加签名。 接收SMTP服务器使用相应的公用密钥验证签名,该公用密钥发布在您的域的DNS记录中。
在DNS中创建SPF记录
在您的DNS管理界面中,创建一个新的TXT记录,如下所示。
TXT @ v=spf1 mx ~all
哪里:
- 文本 表示这是TXT记录。
- 输入 @ 在名称字段中代表顶点域名。
- v = spf1 表示这是一个SPF记录,并且SPF记录的版本是SPF1。
- MX 表示MX记录中列出的所有主机都被允许为您的域发送电子邮件,而所有其他主机均被禁止。
- 〜全部 表示来自您域的电子邮件应仅来自SPF记录中指定的主机。 从其他主机发送的电子邮件将被标记为伪造。 可能的替代方法是
+all
,-all
,?all
,但很少使用。
-all
意味着从不允许的主机发送的电子邮件将被拒绝,永远不要进入收件人的收件箱或垃圾邮件文件夹。 我已经看到它被facebook.com使用,但是我们通常不需要如此严格的政策。
请注意,某些DNS管理器要求您使用如下双引号将SPF记录包装起来。
TXT @ "v=spf1 mx ~all"
要检查您的SPF记录是否传播到公共Internet,可以使用 dig
如下所示在您的Linux机器上安装实用程序。 (在CentOS / RHEL上,您需要安装 bind-utils
包才能使用 dig
命令: sudo dnf install bind-utils
)
dig your-domain.com txt
的 txt
选项告诉 dig
我们只想查询TXT记录。
您也可以在线使用 SPF验证器 例如spf.myisp.ch,以查看允许哪些主机为您的域发送电子邮件并调试SPF记录(如果发生任何错误)。 dmarcian SPF测量员可以帮助测试您的SPF记录语法。
配置SPF策略代理
我们还需要告诉我们的Postfix SMTP服务器检查传入电子邮件的SPF记录,以检测伪造的电子邮件。 首先安装所需的软件包:
sudo dnf install epel-release sudo dnf install pypolicyd-spf
然后为policyd-spf添加一个用户。
sudo adduser policyd-spf --user-group --no-create-home -s /bin/false
编辑Postfix主进程配置文件。
sudo nano /etc/postfix/master.cf
在文件末尾添加以下行,这告诉Postfix在启动SPF策略守护程序时自行启动。 Policyd-spf将作为 policyd-spf
用户。
policyd-spf unix - n n - 0 spawn user=policyd-spf argv=/usr/libexec/postfix/policyd-spf
注意注意:不应在chroot环境中运行policyd-spf。
保存并关闭文件。 接下来,编辑Postfix主要配置文件。
sudo nano /etc/postfix/main.cf
在文件末尾添加以下几行。 第一行指定Postfix策略代理超时设置(用于查询DNS)。 以下几行将通过检查SPF记录来限制传入电子邮件。
policyd-spf_time_limit = 3600 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_policy_service unix:private/policyd-spf
保存并关闭文件。 然后重新启动Postfix。
sudo systemctl restart postfix
下次,当您收到来自具有SPF记录的域的电子邮件时,可以在原始电子邮件标题中看到SPF检查结果。 以下标头指示发件人从授权主机发送电子邮件。
Received-SPF: Pass (mailfrom) identity=mailfrom;
设置DKIM
在Linux上可以执行DKIM签名和验证的两个常见软件是OpenDKIM和Amavis。 我们将使用OpenDKIM,因为它是轻量级的,而OpenDMARC不适用于Amavis。
在CentOS 8 / RHEL8上安装和配置OpenDKIM
从EPEL(企业Linux的额外软件包)存储库中安装OpenDKIM。
sudo dnf install epel-release sudo dnf install opendkim perl-Getopt-Long
编辑OpenDKIM主配置文件。
sudo nano /etc/opendkim.conf
找到以下行。
Mode v
默认情况下,OpenDKIM在验证模式(v)下运行,该模式将验证传入电子邮件的DKIM签名。 我们需要对发送的电子邮件进行签名,因此请将此行更改为以下内容以启用签名模式。
Mode sv
然后找到以下几行。
## Specifies whether or not the filter should generate report mail back ## to senders when verification fails and an address for such a purpose ## is provided. See opendkim.conf(5) for details. SendReports yes ## Specifies the sending address to be used on From: headers of outgoing ## failure reports. By default, the e-mail address of the user executing ## the filter is used ([email protected]). # ReportAddress "Example.com Postmaster" <[email protected]>
当签名验证失败并且签名包括报告请求(“ r = y”),并且签名域在DNS的报告记录中公告报告地址(即ra = user)时,OpenDKIM将向该地址发送结构化报告包含重现问题所需的详细信息。 您可能要使用特定的“发件人”电子邮件地址来发送报告。 取消注释 ReportAddress
参数并更改电子邮件地址。 请注意,这不会造成反向散射问题,因为报告电子邮件将发送到发件人域的DNS记录中指定的电子邮件地址。
找到以下行并将其注释掉,因为我们将为每个域名使用单独的键。
KeyFile /etc/opendkim/keys/default.private
接下来,找到以下4行并将其取消注释。
# KeyTable /etc/opendkim/KeyTable # SigningTable refile:/etc/opendkim/SigningTable # ExternalIgnoreList refile:/etc/opendkim/TrustedHosts # InternalHosts refile:/etc/opendkim/TrustedHosts
保存并关闭文件。
创建签名表,密钥表和可信主机文件
编辑签名表文件。
sudo nano /etc/opendkim/SigningTable
在此文件的末尾添加以下行。 这告诉OpenDKIM,您服务器上的发件人是否正在使用 @your-domain.com
地址,然后应使用由标识的私钥进行签名 20200308._domainkey.your-domain.com
。
*@your-domain.com 20200308._domainkey.your-domain.com
DKIM选择器是20200308。 一个域名可能具有多个DKIM密钥。 DKIM选择器允许您选择特定的DKIM密钥。 您可以为DKIM选择器使用任何名称,但是我发现使用当前日期(2020年3月8日)作为DKIM选择器很方便。 保存并关闭文件。 然后编辑密钥表文件。
sudo nano /etc/opendkim/KeyTable
添加以下行,该行指定DKIM私钥的位置。
20200308._domainkey.your-domain.com your-domain.com:20200308:/etc/opendkim/keys/your-domain.com/20200308.private
保存并关闭文件。 接下来,编辑受信任的主机文件。
sudo nano /etc/opendkim/TrustedHosts
默认情况下,此文件中包含127.0.0.0.1和:: 1。 现在添加以下行。 这告诉OpenDKIM,如果电子邮件来自您自己的域名,则OpenDKIM不应在电子邮件上执行DKIM验证。
*.your-domain.com
保存并关闭文件。
生成私钥/公钥对
由于DKIM用于签名传出邮件和验证传入消息,因此您需要生成用于签名传出电子邮件的私钥和用于接收SMTP服务器的公用密钥,以验证电子邮件的DKIM签名。 公钥将在DNS中发布。
为域创建一个单独的文件夹。
sudo mkdir /etc/opendkim/keys/your-domain.com
使用生成密钥 opendkim-genkey
工具。
sudo opendkim-genkey -b 2048 -d your-domain.com -D /etc/opendkim/keys/your-domain.com -s 20200308 -v
上面的命令将创建2048位密钥。 -d (domain)
指定域。 -D (directory)
指定将存储密钥的目录。 我用 20200308
作为DKIM选择器。 一旦命令执行完毕,私钥将被写入 20200308.private
文件和公钥将被写入 20200308.txt
文件。
默认情况下,只有root可以读取和写入密钥文件。 使 opendkim
作为私钥的所有者。
sudo chown opendkim:opendkim /etc/opendkim/keys/ -R
在DNS记录中发布您的公钥
显示公钥
sudo cat /etc/opendkim/keys/your-domain.com/20200308.txt
后面的字符串 p
参数是公钥。
在您的DNS管理器中,创建TXT记录,输入 20200308._domainkey
在名称字段中。 (您需要用自己的DKIM选择器替换20200308。)然后返回到终端窗口,复制括号中的所有内容并将其粘贴到DNS记录的value字段中。 您需要删除值字段中的所有双引号和换行符。 如果您不删除它们,则下一步的关键测试可能会失败。
测试DKIM密钥
在CentOS 8 / RHEL 8服务器上输入以下命令以测试您的密钥。
sudo opendkim-testkey -d your-domain.com -s 20200308 -vvv
如果一切正常,您将看到 key OK
信息。
opendkim-testkey: using default configfile /etc/opendkim.conf opendkim-testkey: checking key '20200308._domainkey.linuxbabe.com' opendkim-testkey: key OK
如果看到“密钥不安全”,请不要惊慌。 这是因为未在您的域名上启用DNSSEC。 DNSSEC是用于安全DNS查询的安全标准。 大多数域名尚未启用DNSSEC。 您可以继续遵循本指南。
现在,我们可以启动opendkim服务。
sudo systemctl start opendkim
并在引导时启用自动启动。
sudo systemctl enable opendkim
OpenDKIM监听 127.0.0.1:8891
。
将Postfix连接到OpenDKIM
编辑Postfix主要配置文件。
sudo nano /etc/postfix/main.cf
在此文件的末尾添加以下行,以便Postfix能够通过milter协议调用OpenDKIM。 请注意,您应该使用 127.0.0.1
作为地址。 不要使用 localhost
。
# Milter configuration milter_default_action = accept milter_protocol = 6 smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = $smtpd_milters
保存并关闭文件。 然后加 postfix
用户 opendkim
组。
sudo gpasswd -a postfix opendkim
重新开始 postfix
服务。
sudo systemctl restart postfix
SPF和DKIM检查
现在,您可以将测试电子邮件从邮件服务器发送到Gmail帐户,以查看是否通过了SPF和DKIM检查。 在Gmail中已打开的电子邮件的右侧,如果您单击 show original
从下拉菜单中单击按钮,您可以查看身份验证结果。
如果您的消息未签名并且DKIM检查失败,则可能要检查后缀日志(/var/log/maillog
),看看您的配置有什么问题。 您的电子邮件服务器还将在发件人的域上执行SPF和DKIM检查。 您可以在电子邮件标题中查看结果。 以下是使用Gmail对发件人进行的SPF和DKIM检查。
Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::c2d; helo=mail-yw1-xc2d.google.com; [email protected]; receiver=<UNKNOWN> Authentication-Results: mail.linuxbabe.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com [email protected] header.b="XWMRd2co"; dkim-atps=neutral
测试电子邮件分数和位置
现在,您可以转到https://www.mail-tester.com。 您将看到一个唯一的电子邮件地址。 从您的域发送电子邮件到该地址,然后检查您的分数。 如您所见,我得到了满分。
Mail-tester.com只能显示一个发件人分数。 还有另一个名为GlockApps的服务,可让您检查电子邮件是放在收件人的收件箱或垃圾邮件文件夹中,还是被彻底拒绝。 它支持许多流行的电子邮件提供商,例如Gmail,Outlook,Hotmail,YahooMail,iCloud邮件等
Microsoft邮箱(Hotmail.com,Outlook.com)
Microsoft似乎正在使用内部黑名单来阻止许多合法IP地址。 如果您的电子邮件被Outlook或Hotmail拒绝,则需要提交发件人信息表格。 之后,您的电子邮件将被Outlook / Hotmail接受,但仍可能被标记为垃圾邮件。 在我的测试中,电子邮件进入了我的Gmail收件箱。 但是,尽管同时通过了SPF和DKIM,但在我的outlook.com电子邮件中仍将其标记为垃圾邮件。
如果您的电子邮件仍然被标记为垃圾邮件怎么办?
在本文中,我为您提供了更多提示:如何停止将您的电子邮件标记为垃圾邮件。
下一步
在第5部分中,我们将介绍如何创建DMARC记录以保护您的域免受电子邮件欺骗。 与往常一样,如果您发现此帖子很有用,请订阅我们的免费新闻简报以接收更多有用的文章,或者在Twitter或关注我们的Facebook页面上关注我们。