第4部分:如何在Ubuntu Server上使用Postfix设置SPF和DKIM
在完成第1部分和第2部分后,我们将使用可运行的Postfix SMTP服务器和Dovecot IMAP服务器。 我们可以使用桌面电子邮件客户端发送和接收电子邮件。 虽然我说对了 MX, 一种 和 PTR记录,我的电子邮件被Gmail和Outlook邮件标记为垃圾邮件。 因此,在这一部分中,我们将研究如何通过以下方式改进到收件人的收件箱的电子邮件传递: 在Ubuntu服务器上设置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
,但很少使用。
请注意,某些DNS管理器要求您使用如下引号将SPF记录包装起来。
TXT @ "v=spf1 mx ~all"
要检查您的SPF记录是否传播到公共Internet,可以使用 dig
如下所示在您的Linux机器上安装实用程序。 (在Ubuntu上,您需要安装 bind9-dnsutils
包才能使用 dig
命令: sudo apt install bind9-dnsutils
)
dig your-domain.com txt
的 txt
选项告诉 dig
我们只想查询TXT记录。
您还可以使用dmarcian SPF测量器来测试您的SPF记录语法。
配置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
保存并关闭文件。 接下来,编辑Postfix主要配置文件。
sudo nano /etc/postfix/main.cf
在文件末尾添加以下几行。 第一行指定Postfix策略代理超时设置。 以下几行将通过拒绝未经授权的电子邮件并检查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).
设置DKIM
首先,安装OpenDKIM,它是DKIM发送者身份验证系统的开源实现。
sudo apt install opendkim opendkim-tools
然后加 postfix
用户 opendkim
组。
sudo gpasswd -a postfix opendkim
编辑OpenDKIM主配置文件。
sudo nano /etc/opendkim.conf
取消注释以下几行。 更换 simple
与 relaxed/simple
。
Canonicalization simple Mode sv SubDomains no
然后在下面添加以下行 #ADSPAction continue
线。 如果您的文件没有 #ADSPAction continue
行,然后将其添加到下面 SubDomains no
。
AutoRestart yes AutoRestartRate 10/1M Background yes DNSTimeout 5 SignatureAlgorithm rsa-sha256
在此文件的末尾添加以下行。 (请注意,在Ubuntu 18.04和20.04上,用户ID已设置为 opendkim
)
#OpenDKIM user # Remember to add user postfix to group opendkim UserID opendkim # 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
保存并关闭文件。
创建签名表,密钥表和可信主机文件
为OpenDKIM创建目录结构
sudo mkdir /etc/opendkim sudo mkdir /etc/opendkim/keys
更改所有者 root
至 opendkim
并确保只 opendkim
用户可以读写密钥目录。
sudo chown -R opendkim:opendkim /etc/opendkim sudo chmod go-rw /etc/opendkim/keys
创建签名表。
sudo nano /etc/opendkim/signing.table
将此行添加到文件。 这告诉OpenDKIM,您服务器上的发件人是否正在使用 @your-domain.com
地址,然后应使用由标识的私钥进行签名 default._domainkey.your-domain.com
。
*@your-domain.com default._domainkey.your-domain.com
保存并关闭文件。 然后创建密钥表。
sudo nano /etc/opendkim/key.table
添加以下行,该行告诉私钥的位置。
default._domainkey.your-domain.com your-domain.com:default:/etc/opendkim/keys/your-domain.com/default.private
保存并关闭文件。 接下来,创建受信任的主机文件。
sudo nano /etc/opendkim/trusted.hosts
将以下行添加到新创建的文件中。 这告诉OpenDKIM,如果电子邮件来自本地主机或来自同一域,则OpenDKIM不应在电子邮件上执行DKIM验证。
127.0.0.1 localhost *.your-domain.com
保存并关闭文件。
生成私钥/公钥对
由于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 default -v
上面的命令将创建2048位密钥。 -d (domain)
指定域。 -D (directory)
指定将存储密钥的目录,我们使用 default
作为 selector (-s)
,也称为名称。 一旦命令执行完毕,私钥将被写入 default.private
文件和公钥将被写入 default.txt
文件。
使 opendkim
作为私钥的所有者。
sudo chown opendkim:opendkim /etc/opendkim/keys/your-domain.com/default.private
在DNS记录中发布您的公钥
显示公钥
sudo cat /etc/opendkim/keys/your-domain.com/default.txt
后面的字符串 p
参数是公钥。
在您的DNS管理器中,创建TXT记录,输入 default._domainkey
在名称字段中。 然后返回到终端窗口,复制括号中的所有内容并将其粘贴到DNS记录的value字段中。 您需要删除值字段中的所有双引号和空格。 如果不删除它们,则下一步中的关键测试可能会失败。
测试DKIM密钥
在Ubuntu服务器上输入以下命令以测试您的密钥。
sudo opendkim-testkey -d your-domain.com -s default -vvv
如果一切正常,您会看到 键确定 在命令输出中。
opendkim-testkey: using default configfile /etc/opendkim.conf opendkim-testkey: checking key 'default._domainkey.your-domain.com' opendkim-testkey: key secure opendkim-testkey: key OK
如果你看到 钥匙不安全 在命令输出中,不要惊慌。 这是因为未在您的域名上启用DNSSEC。 DNSSEC是用于安全DNS查询的安全标准。 大多数域名尚未启用DNSSEC。 完全没有必要担心 钥匙不安全。 您可以继续遵循本指南。
将Postfix连接到OpenDKIM
Postfix可以通过Unix套接字文件与OpenDKIM对话。 OpenDKIM使用的默认套接字文件是 /var/run/opendkim/opendkim.sock
,如图所示 /etc/opendkim.conf
文件。 但是Ubuntu随附的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
查找以下行(Ubuntu 18.04)
Socket local:/var/run/opendkim/opendkim.sock
或(Ubuntu 20.04)
Socket local:/run/opendkim/opendkim.sock
将其替换为以下行。 (如果找不到上面的行,请添加下面的行。)
Socket local:/var/spool/postfix/opendkim/opendkim.sock
保存并关闭文件。
如果可以在下面找到以下行 /etc/default/opendkim
文件。
SOCKET="local:/var/run/opendkim/opendkim.sock"
要么
SOCKET=local:$RUNDIR/opendkim.sock
更改为
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
保存并关闭文件。
接下来,我们需要编辑Postfix主要配置文件。
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
SPF和DKIM检查
现在,您可以将测试电子邮件从邮件服务器发送到Gmail帐户,以查看是否通过了SPF和DKIM检查。 在Gmail中已打开的电子邮件的右侧,如果您单击 show original
从下拉菜单中单击按钮,您可以查看身份验证结果。
如果您的消息未签名并且DKIM检查失败,则可能要检查后缀日志(/var/log/mail.log
),看看您的配置有什么问题。 如果您在邮件日志中看到以下消息,则可能要检查是否 opendkim
systemd服务实际上正在运行。
warning: connect to Milter service local:opendkim/opendkim.sock: No such file or directory
如果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
测试电子邮件分数和位置
你也可以去 https://www.mail-tester.com。 您将看到一个唯一的电子邮件地址。 从您的域发送电子邮件到该地址,然后检查您的分数。 如您所见,我得到了满分。
Mail-tester.com只能显示一个发件人分数。 还有另一个名为GlockApps的服务,可让您检查电子邮件是放在收件人的收件箱或垃圾邮件文件夹中,还是被彻底拒绝。 它支持许多流行的电子邮件提供商,例如Gmail,Outlook,Hotmail,YahooMail,iCloud邮件等
与Microsoft邮箱的斗争
在我的测试中,电子邮件进入了我的Gmail收件箱。 但是,尽管同时通过了SPF和DKIM,但在我的outlook.com电子邮件中仍将其标记为垃圾邮件。 Microsoft似乎正在使用阻止许多合法IP地址的内部黑名单。 如果您的电子邮件被Outlook或Hotmail拒绝,则需要提交发件人信息表格。 之后,您的电子邮件将被Outlook / Hotmail接受,但仍可能被标记为垃圾邮件。
如果您的电子邮件仍然被标记为垃圾邮件怎么办?
在本文中,我为您提供了更多提示:如何阻止您的电子邮件被标记为垃圾邮件。
下一步
在第5部分中,我们将介绍如何创建DMARC记录以保护您的域免受电子邮件欺骗。 与往常一样,如果您发现此帖子有用,请订阅我们的免费新闻通讯,或在Twitter上关注我们,或喜欢我们的Facebook页面。
注意
在本文中,我使用了 umask 002
在里面 /etc/opendkim.conf
文件。 一位访客在下面评论说这解决了他的问题。 但是,在Ubuntu 18.04上,默认的umask位于 /etc/opendkim.conf
文件设置为007,在我的生产服务器上可以正常工作。 umask定义OpenDKIM套接字文件(/var/spool/postfix/opendkim/opendkim.sock)的权限
- 002:不在opendkim组中的用户具有读取和执行许可权,但没有写许可权。
- 007:不在opendkim组中的用户没有读取,写入或执行权限。
如果我没记错的话,umask 002值是Ubuntu 14.04和16.04上的默认值,因此我在为Ubuntu 16.04服务器编写本文时使用了它。
如果添加 postfix
用户到 opendkim
组中,无需将umask更改为002。
sudo gpasswd -a postfix opendkim
我在安装OpenDKIM部分中列出了此命令,但是为什么有些人不注意呢? 我想知道。