请求配置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能正常连接过来。
- 编辑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
- 创建
/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:端口,@表示该域名下所有发件地址都用这个中继规则。
- 如果配置了
smtp_helo_maps,创建/etc/postfix/helo_maps文件,指定每个域名的HELO名称:
@example.com example.com @example.uk example.uk
- 生成Postfix需要的哈希映射文件,然后重启Postfix:
sudo postmap /etc/postfix/sender_relay sudo postmap /etc/postfix/helo_maps sudo systemctl restart postfix
三、配置OpenDKIM:给每个域名做DKIM签名
要给不同域名分别签名,得为每个域名生成独立密钥,再配置对应关系。
- 创建OpenDKIM的密钥存储目录,设置权限:
sudo mkdir -p /etc/opendkim/keys sudo chown opendkim:opendkim /etc/opendkim/keys sudo chmod 700 /etc/opendkim/keys
- 编辑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
- 创建
/etc/opendkim/TrustedHosts,添加信任的服务器IP和发件域名:
127.0.0.1 ::1 # 你的Exchange服务器IP 192.168.1.100 # 所有需要签名的发件域名 example.com example.uk another-domain.com
- 为每个域名生成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这类名字,记住这个名字后面要用到。重复这个命令给每个域名生成密钥。
- 创建
/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.域名 域名:选择器:密钥文件路径
- 创建
/etc/opendkim/SigningTable,指定哪些发件地址需要签名:
*@example.com default._domainkey.example.com *@example.uk default._domainkey.example.uk
*@域名表示该域名下所有发件地址都用对应的密钥签名。
- 重启OpenDKIM和Postfix,让配置生效:
sudo systemctl restart opendkim sudo systemctl restart postfix
四、关键的DNS配置(没这步DKIM签名白搭!)
每个域名都要添加DKIM和SPF记录到DNS解析里:
- 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
五、测试验证
- 从Exchange发一封测试邮件到Gmail这类支持DKIM校验的邮箱,查看邮件头里的
DKIM-Signature字段,确认签名有效。 - 用
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
相关产品推荐
相关产品推荐

