OpenDKIM TrustedHosts推荐配置及外发邮件签名问题咨询
首先我得先把你的问题梳理清楚,方便大家一起分析:
我正在把邮件服务器迁移到新主机,遇到一个问题:OpenDKIM不会给外部发送的邮件(非内部邮件)签名。目前我的TrustedHosts文件内容如下:
127.0.0.1 ::1 localhost *.example.com(example.com是我的邮件域名)
我用手机上的IMAP客户端发邮件时,只要把手机的IP加到TrustedHosts里,邮件就能正常签名了。
我看很多教程都是用类似我现在的配置,迁移前也是这么设的,但现在出了问题。难道我真的要把所有主机都 wildcard 进去吗?求推荐正确的配置方式。
好,现在来说说这个问题的核心和推荐的解决方案:
首先得明白OpenDKIM里TrustedHosts的作用——它是用来指定哪些来源的出站邮件值得被OpenDKIM签名,本质是告诉OpenDKIM:“这些来源发过来的邮件是我自己的合法邮件,不是垃圾邮件或者伪造的,帮我签个名”。
你现在遇到的问题,根源在于手机IMAP客户端发邮件时,请求的来源IP是你手机当前的公网IP,这个IP不在你现有的TrustedHosts列表里,而且*.example.com这个域名规则在这里不生效——因为TrustedHosts里的域名匹配的是发送邮件请求的来源主机的主机名,不是你手机的IP反向解析域名,也不是邮件的发件人域名。而手机客户端一般是直接通过IP连接你的SMTP服务器,不会用一个匹配*.example.com的主机名发起连接,所以自然不会被匹配到。
接下来是重点:绝对不要wildcard所有主机,这会带来很大的安全风险——任何能连接到你邮件服务器的外部主机,都能让OpenDKIM给它的邮件签名,相当于给垃圾邮件“背书”,很可能导致你的域名被反垃圾邮件组织拉黑。
那针对移动客户端的情况,推荐这几个更安全的方案:
- 方案一:如果你的手机大多在固定网络环境(比如家里的公网IP),可以直接把这个固定IP加到TrustedHosts里,比如
123.45.67.89(替换成你的实际公网IP)。但如果是动态IP的话,这个方法就不太方便,因为IP会变。 - 方案二:配置你的邮件服务器(比如Postfix这类),要求SMTP客户端必须认证(也就是SMTP AUTH),然后让OpenDKIM对经过认证的客户端发送的邮件自动签名,不管来源IP。大多数主流邮件服务器都能和OpenDKIM集成实现这个功能,比如Postfix可以通过设置
milter_macro_daemon_name,然后在OpenDKIM配置里启用RequireAuth相关参数,只要客户端用正确的账号密码登录了,不管它在哪个IP,邮件都会被签名,这是最灵活也最安全的方式,特别适合移动客户端这种IP不固定的场景。 - 方案三:如果你的移动客户端是通过VPN连接到内部网络的,那可以把VPN的地址段加到TrustedHosts里,比如
10.0.0.0/24,这样只要手机连了VPN,发邮件的请求来源就会匹配这个网段,OpenDKIM就会签名。
最后再补充一下TrustedHosts的正确写法:
- IP地址可以写单个IP,也可以用CIDR网段格式(比如
192.168.1.0/24表示整个内网段) - 域名的话,只有当发送邮件请求的来源主机的主机名完全匹配(或者通配符匹配)时才会生效,比如如果你的SMTP服务器的主机名是mail.example.com,而客户端是通过这个主机名连接的,那
*.example.com才会匹配,但移动客户端一般不会这么做。
备注:内容来源于stack exchange,提问作者Tyler Montney

