我使用 OpenDKIM 在我的 Postfix 服务器上签名邮件。当使用 SMTPS 从其原始域(假设example.com
)发送时,它按预期工作。但是,来自 LAN 上的 SMTP 客户端的邮件未被签名。所述客户端没有来自同一来源域(例如client1.lan
),但被转换为smtp_generic_maps
同一来源(具体而言[email protected]
)。理想情况下,我想签名该外发邮件。
在 /etc/postfix/main.cf 中我有:
smtpd_milters = unix:/var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:/var/run/opendkim/opendkim.sock
在 /etc/opendkim.conf 中我有:
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
在 /etc/opendkim/TrustedHosts 中我有:
::1
127.0.0.1
localhost
ip6-localhost
ip6-loopback
mail
10.0.0.0/24
*.lan
答案1
在 Postfix 中确保/etc/postfix/main.conf
包含:
milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen} {auth_type}
这将确保来自经过身份验证的用户的邮件将由 OpenDKIM 签名。根据文档:
除非邮件符合签名标准,否则邮件将被验证,签名标准包括:(1) From: 地址上的域(如果存在)必须由 -d 命令行开关或域配置文件设置列出,以及 (2)(a)连接到 MTA 的客户端必须经过身份验证,或 (b) 连接到 MTA 的客户端必须在 InternalHosts 配置文件设置所引用的文件中列出(或在该选项的默认列表中),或 (c) 客户端必须连接到 MTAs 配置文件设置所命名的守护进程端口,或 (d) MTA 必须设置一个或多个与 MacroList 配置文件设置所设定的条件相匹配的宏。
对于上面的 (a),测试是 MTA 宏“{auth_type}”是否已设置且包含任何非空值。这意味着 MTA 必须在报头结束 (EOH) 阶段之前或期间将该宏的值传递给过滤器,以便测试其值。
答案2
如果要将它们中继并签名到其他域(基于标From:
头),那么您必须使用SigningTable
opendkim 上的配置映射这些其他域,您甚至可以通过匹配它们来分配不同的密钥和选择器KeyTable
- 两者都指向不同的映射文件。
我遇到了类似的问题,但我可以通过查看邮件头来调试它 - 在那里你会找到中继服务器正在使用的确切主机名和 IP 地址,例如:
Received: from client1.lan (client1.localdomain [10.0.0.2]) by example.com
(Postfix) with ESMTPS id 71B8D10C1A68 for <[email protected]>;
Sun, 12 Feb 2017 13:19:33 +0000 (UTC)
然后,您可以检查中继服务器是否正在使用内部网络、它正在使用哪个主机名以及它打算从哪个域发送电子邮件。
答案3
遇到了同样的问题:从远程主机发送的邮件没有得到签名。
解决方案很简单:只需将远程发送者的 IP 添加到/etc/opendkim/TrustedHosts