对于大多数邮件服务器管理员来说,被错误地标记为垃圾邮件发送者所带来的挫败感并不奇怪。通过排除服务器受损的可能性,错误标记通常是由以下原因之一引起的:
- 该服务器是一个开放的邮件中继
- 发件人或服务器的 IP 地址已列入黑名单
- 服务器没有完全限定的域名(FQDN) 和 PTR 记录
- 发件人政策框架(SPF) DNS 记录丢失或配置错误
- DomainKeys 识别的邮件 (DKIM)实施缺失或未正确设置
这些是大多数专有和开源垃圾邮件过滤器(包括 SpamAssassin)正在检查的一些基本属性。通过这些测试对于配置良好的邮件服务器极其重要。
本教程将重点介绍安装和配置OpenDKIM]:DKIM 发件人身份验证系统的开源实现。
假设读者知道如何通过 SSH 访问服务器,Postfix 和 Dovecot 已经安装和配置(tutorial),设置主机名和 FQDN(tutorial, tutorial)并且 SPF 记录已到位(tutorial).
DKIM 是一种互联网标准,使个人或组织能够将域名与电子邮件关联起来。实际上,这是一种声明对消息负责的方法。 DKIM 的核心由非对称加密技术提供支持。发件人的邮件传输代理 (MTA) 使用私钥对每封传出邮件进行签名。收件人从发件人的 DNS 记录中检索公钥,并验证自邮件签名发生以来邮件正文和某些标头字段是否未更改。
在开始安装之前,建议进行系统更新:
sudo apt-get update
sudo apt-get dist-upgrade
安装 OpenDKIM 及其依赖项:
sudo apt-get install opendkim opendkim-tools
其他包将列为依赖项,类型yes
并按Enter
接着说。
必须创建和编辑几个文件才能配置 OpenDKIM。
Nano将用作编辑器,因为它默认安装在 DigitalOcean Droplet 上并且操作简单:
- 使用箭头键导航
- 退出而不保存更改:按
CTRL + X
进而N
- 退出并保存更改:按
CTRL + X
进而Y
,最后按Enter
重要提示:替换每个实例example.com在所有命令和配置文件中使用您自己的域。编辑后不要忘记保存文件。
让我们从主配置文件开始:
sudo nano /etc/opendkim.conf
将以下行附加到conf文件的末尾(每个参数解释如下)。或者,您可以选择自定义端口号Socket
。确保它没有被其他应用程序使用。
AutoRestart Yes
AutoRestartRate 10/1h
UMask 002
Syslog yes
SyslogSuccess Yes
LogWhy Yes
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
Mode sv
PidFile /var/run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID opendkim:opendkim
Socket inet:12301@localhost
-
自动重启:失败时自动重新启动过滤器
-
自动重启率:指定过滤器的最大重启速率,如果重启开始发生的速度快于该速率,过滤器将终止;10/1h
- 每小时最多允许 10 次重启
-
UMask:将所有访问权限授予定义的用户组UserID
并允许其他用户读取和执行文件,在这种情况下,它将允许创建和修改 Pid 文件。
-
Syslog, 系统日志成功, *LogWhy:这些参数通过调用 syslog 启用详细日志记录
-
规范化:定义消息签名时使用的规范化方法,simple
方法几乎不允许修改,而relaxed
人们可以容忍微小的变化,例如
空白替换;relaxed/simple
- 消息头将被处理relaxed
算法和主体simple
one
-
外部忽略列表:指定可以通过服务器发送邮件的外部主机作为无需凭据的签名域之一
-
内部主机:定义内部主机列表,其邮件不应被验证而应被签名
-
KeyTable:将密钥名称映射到签名密钥
-
签名表:根据在邮件中找到的地址列出要应用于邮件的签名From:
标头字段
-
Mode:声明操作模式;在这种情况下,米尔特充当签名者(s
)和验证者(v
)
-
PidFile:包含进程标识号的Pid文件的路径
-
签名算法:选择创建签名时使用的签名算法
-
UserID:opendkim进程在此用户和组下运行
-
Socket:milter 将监听此处指定的套接字,Posfix 将通过此套接字向 opendkim 发送消息进行签名和验证;12301@localhost
定义一个监听的 TCP 套接字localhost
, port 12301
这一简单的配置旨在允许对一个或多个域进行消息签名,要了解其他选项,请访问here.
将 milter 连接到 Postfix:
sudo nano /etc/default/opendkim
添加以下行,仅当使用自定义端口号时才编辑端口号:
SOCKET="inet:12301@localhost"
配置 postfix 使用此 milter:
sudo nano /etc/postfix/main.cf
确保这两行存在于 Postfix 配置文件中并且未被注释掉:
milter_protocol = 2
milter_default_action = accept
Postfix 可能已经使用了过滤器(SpamAssasin、Clamav 等);如果存在以下参数,只需将 opendkim milter 附加到它们(milters 用逗号分隔),端口号应与中相同opendkim.conf
:
smtpd_milters = unix:/spamass/spamass.sock, inet:localhost:12301
non_smtpd_milters = unix:/spamass/spamass.sock, inet:localhost:12301
如果缺少参数,请按如下方式定义它们:
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301
创建一个目录结构来保存受信任的主机、密钥表、签名表和加密密钥:
sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys
指定可信主机:
sudo nano /etc/opendkim/TrustedHosts
我们将使用此文件来定义两者ExternalIgnoreList
and InternalHosts
,源自这些主机、域和 IP 地址的消息将受到信任和签名。
因为我们的主配置文件声明了TrustedHosts
作为正则表达式文件(refile
),我们可以使用通配符模式,*.example.com
意味着消息来自example.com的子域也将受到信任,而不仅仅是从根域发送的子域。
自定义并将以下行添加到新创建的文件中。可以指定多个域,不要编辑前三行:
127.0.0.1
localhost
192.168.0.1/24
*.example.com
#*.example.net
#*.example.org
创建密钥表:
sudo nano /etc/opendkim/KeyTable
密钥表包含每个选择器/域对及其私钥的路径。在此示例中,任何字母数字字符串都可以用作选择器mail
已使用,无需更改。
mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private
#mail._domainkey.example.net example.net:mail:/etc/opendkim/keys/example.net/mail.private
#mail._domainkey.example.org example.org:mail:/etc/opendkim/keys/example.org/mail.private
创建签名表:
sudo nano /etc/opendkim/SigningTable
该文件用于声明域/电子邮件地址及其选择器。
*@example.com mail._domainkey.example.com
#*@example.net mail._domainkey.example.net
#*@example.org mail._domainkey.example.org
切换到密钥目录:
cd /etc/opendkim/keys
为域创建一个单独的文件夹来保存密钥:
sudo mkdir example.com
cd example.com
生成密钥:
sudo opendkim-genkey -s mail -d example.com
-s
指定选择器和-d
域,此命令将创建两个文件,mail.private
是我们的私钥并且mail.txt
包含公钥。
将私钥的所有者更改为opendkim
:
sudo chown opendkim:opendkim mail.private
Open mail.txt
:
sudo nano -$ mail.txt
公钥定义在p
范围。不要使用下面的示例密钥,它只是一个说明,不适用于您的服务器。
mail._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB" ; ----- DKIM key mail for example.com
复制该密钥并将 TXT 记录添加到您域的 DNS 条目中:
Name: mail._domainkey.example.com.
Text: "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB"
请注意,DNS 更改可能需要几个小时才能传播。
重新启动 Postfix 和 OpenDKIM:
sudo service postfix restart
sudo service opendkim restart
恭喜!您已成功为您的邮件服务器配置 DKIM!
可以通过发送空电子邮件至来测试配置check-auth@verifier.port25.com
并会收到回复。如果一切正常你应该看到DKIM check: pass
under Summary of Results
.
==========================================================
Summary of Results
==========================================================
SPF check: pass
DomainKeys check: neutral
DKIM check: pass
Sender-ID check: pass
SpamAssassin check: ham
或者,您可以向您控制的 Gmail 地址发送邮件,在 Gmail 收件箱中查看收到的电子邮件的标头,dkim=pass
应存在于Authentication-Results
标头字段。
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of contact@example.com designates --- as permitted sender) smtp.mail=contact@example.com;
dkim=pass header.i=@example.com;
提交者:P. Sebastian