-
第四部分:设立SPF和#038;Debian服务器上带后缀的DKIM
在完成第1部分和第2部分之后,我们有了一个工作的Postfix SMTP服务器和Dovecot IMAP服务器。我们可以使用桌面电子邮件客户端发送和接收电子邮件。在本教程中,我们将学习如何通过在Debian服务器上设置SPF和DKIM来改进向收件人收件箱的电子邮件传递。 什么是SPF和DKIM记录? SPF和DKIM是DNS中的两种TXT记录,允许您检测电子邮件欺骗,并帮助合法电子邮件发送到收件人的收件箱,而不是垃圾邮件文件夹。如果你的域名被电子邮件欺骗所滥用,那么如果你的电子邮件没有将你添加到通讯簿中,它们很可能会进入收件人的垃圾邮件文件夹。 SPF(发件人策略框架)记录指定允许哪些主机或IP地址代表域发送电子邮件。您应该只允许您自己的电子邮件服务器或ISP的服务器为您的域发送电子邮件。 DKIM(DomainKeys Identified Mail)使用私钥为从您的域发送的电子邮件添加签名。接收SMTP服务器通过使用相应的公钥验证签名,该公钥在域的DNS区域中发布。 步骤1:在DNS中创建SPF记录 在DNS管理界面中,创建一个新的TXT记录,如下所示。 Record Type Name Value TXT @ v=spf1 mx ~all 哪里: TXT表示这是一条TXT记录。 在name字段中输入@以表示apex域(example.com)。 v=spf1表示这是SPF记录,SPF记录版本为spf1。 mx意味着mx记录中列出的所有主机都被允许为您的域发送电子邮件,而所有其他主机都被禁止。 ~all表示来自您域的电子邮件应该只来自SPF记录中指定的主机。来自其他主机的电子邮件将被标记为不可信。可能的替代方案是+all,-all?都是,但很少使用。 -这一切都意味着,从不允许的主机发送的电子邮件应该被拒绝,永远不要进入收件人的收件箱或垃圾邮件文件夹。我见过facebook使用它。但是我们通常不需要这么严格的政策。 有些人可能会认为,这一切都会更好,因为它会拒绝来自不受信任主机的电子邮件。当收件人有两台SMTP服务器,并且主SMTP服务器脱机时,在SPF策略中使用-all可能会导致您自己的电子邮件被拒绝,您的电子邮件将临时存储在备份SMTP服务器上。当主SMTP服务器恢复联机时,电子邮件将从备份SMTP服务器中继到主SMTP服务器。由于您没有在SPF记录中列出收件人的备份SMTP服务器,该电子邮件将被收件人的主SMTP服务器拒绝。所以你应该在SPF策略中使用~all。 您还可以在SPF记录中列出特定的IP地址。 TXT @ v=spf1 mx ip4:12.34.56.78 ~all 请注意,一些DNS管理器要求您用下面的引号将SPF记录包装起来。 TXT @ "v=spf1 mx ~all" 要检查您的SPF记录是否传播到公共互联网,您可以在Linux设备上使用dig实用程序,如下所示。(在Debian上,需要安装bind9 dnsutils包才能使用dig命令:sudo apt install bind9 dnsutils) dig example.com txt txt选项告诉dig我们只想查询txt记录。 您还可以使用dmarcian SPF surveyor来测试SPF记录语法。 步骤2:在Debian服务器上配置SPF策略代理 我们还需要告诉我们的Postfix SMTP服务器检查接收电子邮件的SPF记录。这无助于发送电子邮件,但有助于检测伪造的传入电子邮件。 安装所需的软件包: sudo apt install postfix-policyd-spf-python 然后编辑Postfix主进程配置文件。 sudo nano /etc/postfix/master.cf 在文件末尾添加以下几行,这会告诉Postfix在启动SPF策略守护程序时启动它。 policyd-spf unix - n n - 0 spawn user=policyd-spf argv=/usr/bin/policyd-spf 保存并关闭文件。接下来,编辑后缀主配置文件。 sudo nano /etc/postfix/main.cf 在文件末尾追加以下行。第一行指定后缀策略代理超时设置。以下几行将通过拒绝未经授权的电子邮件和检查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 (sender SPF authorized). 第3步:在Debian服务器上设置DKIM 安装OpenDKIM,这是DKIM发送者身份验证系统的开源实现。 sudo apt install opendkim opendkim-tools 然后将postfix用户添加到opendkim组。 sudo gpasswd -a postfix opendkim 编辑OpenDKIM主配置文件。 sudo nano /etc/opendkim.conf 取消对以下行的注释。 Canonicalization relaxed/simple Mode sv SubDomains no 找到下面这行。 #Nameservers 127.0.0.1 换成 Nameservers 8.8.8.8,1.1.1.1 这告诉OpenDKIM使用8.8.8.8和1.1.1.1来查询DNS记录。最好使用多个名称服务器。如果其中一个失败,另一个仍然可以回答DNS查询。用逗号分隔每个IP地址。 接下来,在文件末尾添加以下行。 # Map domains in From addresses to keys used to sign messages KeyTable refile:/etc/opendkim/key.table SigningTable refile:/etc/opendkim/signing.table # Hosts to ignore when verifying signatures ExternalIgnoreList /etc/opendkim/trusted.hosts # A set of internal hosts whose mail should be signed InternalHosts /etc/opendkim/trusted.hosts 保存并关闭文件。 第4步:创建签名表、密钥表和受信任主机文件 为OpenDKIM创建目录结构 sudo mkdir -p /etc/opendkim/keys 将所有者从root更改为opendkim,并确保只有opendkim用户可以读取和写入keys目录。 sudo chown -R opendkim:opendkim /etc/opendkim sudo chmod go-rw /etc/opendkim/keys 创建签名表。 sudo nano /etc/opendkim/signing.table 将以下行添加到文件中。这会告诉OpenDKIM,如果服务器上的发送者正在使用@example。com地址,则应使用默认标识的私钥对其进行签名_域名。你的领域。通用域名格式。 *@example.com default._domainkey.example.com 保存并关闭文件。然后创建键表。 sudo nano /etc/opendkim/key.table 添加下面一行,它告诉您私钥的位置。 default._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com/default.private 保存并关闭文件。接下来,创建受信任的主机文件。 sudo nano /etc/opendkim/trusted.hosts 将以下行添加到新创建的文件中。这告诉OpenDKIM,如果电子邮件来自本地主机或同一域,则OpenDKIM不应对该电子邮件执行DKIM验证。 127.0.0.1 localhost *.example.com 保存并关闭文件。 步骤5:生成私钥/公钥对 我们需要生成两个密钥: 用于签署发送电子邮件的私钥。 用于接收SMTP服务器以验证DKIM签名的公钥。它将在您的DNS区域中发布,以便接收SMTP服务器可以找到它。 为域创建一个单独的文件夹。 sudo mkdir /etc/opendkim/keys/example.com 使用opendkim genkey工具生成密钥。 sudo opendkim-genkey -b 2048 -d example.com -D /etc/opendkim/keys/example.com -s default -v 上述命令将创建2048位密钥-d(域)指定域-D(directory)指定存储密钥的目录,我们使用默认值作为选择器(-s),也称为名称。执行命令后,私钥将被写入默认值。私有文件和公钥将被写入默认值。txt文件。 使opendkim成为私钥的所有者。 sudo chown opendkim:opendkim /etc/opendkim/keys/example.com/default.private 并更改权限,以便只有opendkim用户具有文件的读写权限。 sudo chmod 600 /etc/opendkim/keys/example.com/default.private 第6步:在DNS记录中发布公钥 显示公钥 sudo cat /etc/opendkim/keys/example.com/default.txt p参数后面的字符串是公钥。 在DNS管理器中,创建一个TXT记录,输入默认值_名称字段中的domainkey。然后返回终端窗口,复制括号中的所有内容,并将其粘贴到DNS记录的值字段中。您需要删除值字段中的所有双引号和空格。如果不删除它们,那么下一步的密钥测试可能会失败。 第7步:测试DKIM键 在Debian服务器上输入以下命令以测试密钥。 sudo opendkim-testkey -d example.com -s default -vvv 如果一切正常,您将在命令输出中看到键OK。 opendkim-testkey: using default configfile /etc/opendkim.conf opendkim-testkey: checking key 'default._domainkey.example.com' opendkim-testkey: key secure opendkim-testkey: key OK 请注意,您的DKIM记录可能需要一些时间才能传播到Internet。根据您使用的域注册器,您的DNS记录可能会立即传播,或者传播可能需要24小时。你可以去https://www.dmarcanalyzer.com/dkim/dkim-check/,输入默认值作为选择器,并输入您的域名以检查DKIM记录传播。 如果在命令输出中看到密钥不安全,请不要惊慌。这是因为您的域名上未启用DNSSEC。DNSSEC是安全DNS查询的安全标准。大多数域名都没有启用DNSSEC。绝对没有必要担心钥匙不安全。你可以继续遵循这个指南。 如果您看到查询超时错误,则表示您的服务器上存在DNS解析问题。您可以再次运行上面的命令,看看它是否有效。如果仍然不起作用,可以在/etc/opendkim中注释掉下面的行。conf文件并重新启动opendkim。服务 TrustAnchorFile /usr/share/dns/root.key 第8步:将Postfix连接到OpenDKIM Postfix可以通过Unix套接字文件与OpenDKIM通信。OpenDKIM使用的默认套接字文件是/run/OpenDKIM/OpenDKIM。sock,如/etc/opendkim所示。conf文件。但Debian附带的postfix SMTP守护程序在chroot监狱中运行,这意味着SMTP守护程序将解析与postfix队列目录(/var/spool/postfix)相关的所有文件名。所以我们需要更改OpenDKIM Unix套接字文件。 创建一个目录来保存OpenDKIM套接字文件,并且只允许OpenDKIM用户和postfix组访问它。 sudo mkdir /var/spool/postfix/opendkim sudo chown opendkim:postfix /var/spool/postfix/opendkim 然后编辑OpenDKIM主配置文件。 sudo nano /etc/opendkim.conf 找到下面这行。 Socket local:/run/opendkim/opendkim.sock 替换为以下行。 Socket local:/var/spool/postfix/opendkim/opendkim.sock 保存并关闭文件。接下来,打开/etc/default/opendkim文件。 sudo nano /etc/default/opendkim 找到下面这行。 SOCKET=local:$RUNDIR/opendkim.sock 换成 SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock" 保存并关闭文件。 接下来,我们需要编辑后缀主配置文件。 sudo nano /etc/postfix/main.cf 在这个文件的末尾添加以下几行,这样Postfix就可以通过milter协议调用OpenDKIM了。 # Milter configuration milter_default_action = accept milter_protocol = 6 smtpd_milters = local:opendkim/opendkim.sock non_smtpd_milters = $smtpd_milters 保存并关闭文件。然后重新启动opendkim和postfix服务。 sudo systemctl restart opendkim postfix 步骤9:SPF和DKIM检查 你现在可以从邮件服务器向你的Gmail账户发送一封测试邮件,看看SPF和DKIM检查是否通过。在Gmail中打开的电子邮件的右侧,如果单击下拉菜单中的“显示原始邮件”按钮,可以看到身份验证结果。 如果您的邮件未签名且DKIM检查失败,您可以检查postfix日志(/var/log/mail.log)以查看您的配置有何问题。如果您在邮件日志中看到以下消息, warning: connect to Milter service local:opendkim/opendkim.sock: No such file or directory 您可能需要检查opendkim systemd服务是否正在实际运行。 sudo systemctl status opendkim 如果opendkim正在运行,但仍然看到上述错误,则可能需要编辑/etc/postfix/main。cf文件,更改 smtpd_milters = local:opendkim/opendkim.sock 到 smtpd_milters = local:/opendkim/opendkim.sock 然后重新启动Postfix。 您的电子邮件服务器还将对发件人的域执行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: email.linuxbabe.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com [email protected] header.b="XWMRd2co"; dkim-atps=neutral 第10步:测试电子邮件分数和位置 你也可以去https://www.mail-tester.com.你会看到一个独特的电子邮件地址。从你的域名发送电子邮件到此地址,然后检查你的分数。如你所见,我得了满分。 邮件测试员。com只能显示发件人分数。还有另一个名为GlockApps的服务,可以让你检查你的电子邮件是否放在收件人的收件箱或垃圾邮件文件夹中,或者直接被拒绝。它支持许多流行的电子邮件提供商,如Gmail、Outlook、Hotmail、YahooMail、iCloud mail等 微软邮箱 如果您的电子邮件被Microsoft Outlook或Hotmail拒绝,您需要提交发件人信息表。之后,Outlook/hotmail将接受您的电子邮件,但仍可能标记为垃圾邮件。 如果你的电子邮件仍被标记为垃圾邮件呢? 在这篇文章中,我有更多的建议:7个有效的建议来阻止你的电子邮件被标记为垃圾邮件。 下一步 在第5部分中,我们将了解如何创建DMARC记录以保护您的域免受电子邮件欺骗。一如既往,如果你觉得这篇文章有用,请订阅我们的免费时事通讯,或者在Twitter上关注我们,或者喜欢我们的Facebook页面。