You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求配置Postfix+OpenDKIM实现按发件域名分端口中继并DKIM签名的指导

请求配置Postfix+OpenDKIM实现按发件域名分端口中继并DKIM签名的指导

兄弟,我懂你刚接触Postfix和OpenDKIM的懵圈感——手里一堆域名要分别用独立IP发邮件,网络那边已经搭好按端口分流的路子,但原网关搞不定,想靠Postfix+OpenDKIM来实现,对吧?下面我一步步给你捋,从安装到配置全给你讲明白:

一、先搞定Postfix和OpenDKIM的安装(以Debian/Ubuntu为例)

先更新系统包列表,再安装软件:

sudo apt update
sudo apt install postfix opendkim opendkim-tools

安装Postfix时会弹出配置向导,按下面选就行:

  • 第一个界面选Internet Site
  • 然后输入一个系统邮件域名(比如mail.your-server.com,随便填一个后续不影响,因为我们会按发件域名调整)
  • 剩下的步骤直接默认回车就好

二、配置Postfix:让不同域名走不同端口中继

我们要用Postfix的sender_dependent_relayhost_maps功能,根据发件域名指定对应的中继端口,同时确保Exchange能正常连接过来。

  1. 编辑Postfix主配置文件/etc/postfix/main.cf,添加或修改这些内容:
# 启用发件人依赖的中继映射,按域名指定中继地址
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay

# 允许Exchange服务器的IP连接Postfix,把下面的IP换成你的Exchange实际IP
mynetworks = 127.0.0.0/8, [::1]/128, 192.168.1.100/32

# 可选但推荐:按发件域名设置HELO名称,避免被反垃圾邮件系统拦截
smtp_helo_maps = hash:/etc/postfix/helo_maps

# 启用Milter联动OpenDKIM(后面会用到)
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
  1. 创建/etc/postfix/sender_relay文件,按域名配置对应的中继端口:
@example.com 10.10.10.2:2555
@example.uk 10.10.10.2:2556
@another-domain.com 10.10.10.2:2557

格式是@域名 中继IP:端口,@表示该域名下所有发件地址都用这个中继规则。

  1. 如果配置了smtp_helo_maps,创建/etc/postfix/helo_maps文件,指定每个域名的HELO名称:
@example.com example.com
@example.uk example.uk
  1. 生成Postfix需要的哈希映射文件,然后重启Postfix:
sudo postmap /etc/postfix/sender_relay
sudo postmap /etc/postfix/helo_maps
sudo systemctl restart postfix

三、配置OpenDKIM:给每个域名做DKIM签名

要给不同域名分别签名,得为每个域名生成独立密钥,再配置对应关系。

  1. 创建OpenDKIM的密钥存储目录,设置权限:
sudo mkdir -p /etc/opendkim/keys
sudo chown opendkim:opendkim /etc/opendkim/keys
sudo chmod 700 /etc/opendkim/keys
  1. 编辑OpenDKIM主配置文件/etc/opendkim.conf,修改这些内容:
Domain                  *
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
Socket                  inet:8891@localhost
  1. 创建/etc/opendkim/TrustedHosts,添加信任的服务器IP和发件域名:
127.0.0.1
::1
# 你的Exchange服务器IP
192.168.1.100
# 所有需要签名的发件域名
example.com
example.uk
another-domain.com
  1. 为每个域名生成DKIM密钥(以example.com为例):
sudo opendkim-genkey -D /etc/opendkim/keys/ -d example.com -s default
sudo chown opendkim:opendkim /etc/opendkim/keys/default.private
sudo chmod 600 /etc/opendkim/keys/default.private

这里-s default是密钥选择器,你也可以换成mail这类名字,记住这个名字后面要用到。重复这个命令给每个域名生成密钥。

  1. 创建/etc/opendkim/KeyTable,把域名和密钥对应起来:
default._domainkey.example.com example.com:default:/etc/opendkim/keys/default.private
default._domainkey.example.uk example.uk:default:/etc/opendkim/keys/default.private

格式是选择器._domainkey.域名 域名:选择器:密钥文件路径

  1. 创建/etc/opendkim/SigningTable,指定哪些发件地址需要签名:
*@example.com default._domainkey.example.com
*@example.uk default._domainkey.example.uk

*@域名表示该域名下所有发件地址都用对应的密钥签名。

  1. 重启OpenDKIM和Postfix,让配置生效:
sudo systemctl restart opendkim
sudo systemctl restart postfix

四、关键的DNS配置(没这步DKIM签名白搭!)

每个域名都要添加DKIM和SPF记录到DNS解析里:

  1. DKIM记录:打开/etc/opendkim/keys/default.txt(对应example.com的密钥文件),里面的内容类似:
default._domainkey IN TXT ( "v=DKIM1; k=rsa; "
      "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..." ) ; ----- DKIM key default for example.com

把这段内容作为TXT记录添加到example.com的DNS中,主机记录填default._domainkey,值就是引号里的内容(去掉换行,合并成一行)。每个域名都要做这个操作。
2. SPF记录:更新每个域名的SPF记录,添加对应的出栈IP,比如example.com的SPF可以改成:

v=spf1 ip4:对应example.com的出栈IP -all

五、测试验证

  1. 从Exchange发一封测试邮件到Gmail这类支持DKIM校验的邮箱,查看邮件头里的DKIM-Signature字段,确认签名有效。
  2. 用telnet测试中继规则:
telnet 你的Postfix服务器IP 25
EHLO example.com
MAIL FROM:<test@example.com>
RCPT TO:<your-test-email@gmail.com>
DATA
Subject: Test Relay & DKIM
This is a test email.
.

然后查看邮件的出栈IP是否对应example.com的指定IP,端口是否为2555。

备注:内容来源于stack exchange,提问作者Dopler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 11:25:29