ubuntu下配置Postfix+DKIM+SPF+DMARC作为海外邮件中继服务器

By | 2018-12-28

"前言,背景需求

公司有海外客户拒收或当垃圾邮件现象,而公司SMTP在国内,就一个PTR记录你想100%的通达率就已经『凉凉』了!

想达到较好的通达率,一般需要满足以下条件:

  • 固定的公网IP地址,做PTR用,而且该IP地址不在”垃圾邮件列表”当中
  • DNS要做SPF+DMARC+PTR 记录解释
  • 一台在海外的VPS或者基于Linux平台+Postfix的服务器

满足以上条件的话基本上能保证95%的通达率了!!!

需求分析与思路

         为解决客户电邮拒收问题,必须要满足以上条件!思路很简单,国内的SMTP还继续使用,当出现拒收的情况下,把拒收的客户电邮转到海外的VPS上代发出给最终客户。

电邮发送框架

本公司用户 @mydomain.com –> 目标*@abc.com –> 转发海外SMTP –> 最终客户电邮

         这过程很简单,但实施真的较难,即国内SMTP与海外SMTP都必须符合DKIM+SPF+DMARC+PTR的验证,因为两台SMTP都是发送端,代表mydomain.com ,好!思路清晰就开始做吧。

一、SPF记录

 登入本公司域名的DNS注册商后台,增加一条TXT记录。

记录名:  @ 或者 
记录值:  v=spf1 a mx ip4:34.56.78.90 ~all
记录类型:
TXT
意思是允许本域下A、MX记录指向的IP地址还有34.56.78.90都是认可外发本域邮件的。
❞如果你拥有多个域名可以使用 include 参数,日后改变smtp的IP地址只需修改主域名的SPF记录即可。
例如:
主域名为 top.com ,DNS已经做了SPF解释,那a.com b.com c.com 的DNS里SPF应该这样写
记录值: v=spf1 mx include:top.com ~all
意思是本域除了认可MX指定的,还认证top.com的SPF设定值,这种方式非常适合在N多个域名共用一台外发SMTP时使用。

 

二、DMARC记录

还是在DNS后台加入一条TXT记录

记录名: _dmarc
记录值: v=DMARC1; p=quarantine; pct=5; rua=mailto:[email protected]
记录类型: TXT

DMARC协议是有效解决信头From伪造而诞生的一种新的邮件来源验证手段,为邮件发件人地址提供强大保护,并在邮件收发双方之间建立起一个数据反馈机制。

p:用于告知收件方,当检测到某邮件存在伪造我(发件人)的情况,收件方要做出什么处理,处理方式从轻到重依次为:none为不作任何处理;quarantine为将邮件标记为垃圾邮件;reject为拒绝该邮件。初期建议设置为none。
rua:用于在收件方检测后,将一段时间的汇总报告,发送到哪个邮箱地址。
ruf:用于当检测到伪造邮件时,收件方须将该伪造信息的报告发送到哪个邮箱地址。

三、 PTR记录

PTR记录,是电子邮件系统中的邮件交换记录的一种;另一种邮件交换记录是A记录(在IPv4协议中)或AAAA记录(在IPv6协议中)。PTR记录常被用于反向地址解析。

PTR记录也就是IP反向解析,我们常见的解析都是将域名A记录解析到IP,PTR则是将IP反向解析到对应的域名,通过设置PTR可以提高发信方的信誉,从而提高到达率。

记录名: 90.87.56.34.in-addr.arpa
记录值: mail.mydomain.com
记录类型: PTR

这里注意的是记录名的IP地址是反转写的;另外在购买VPS的时候要先了解是否支持PTR设置。

一般国外的VPS都会直接将购买的时候的hostname设置为PTR记录值,但可以自行修改。

四、DKIM

以上都是在DNS记录上做的设定,DKIM签署是由认证的服务器对每一封信进行电子签名的过程

 

安装过程以及配置:

apt-get install opendkim opendkim-tools

 

编辑 vi /etc/opendkim.conf
Domain mydoamin.com KeyFile /etc/postfix/dkim.key Selector mail SOCKET inet:8891@localhost

编辑 vi /etc/default/opendkim
把默认设置打上# 屏蔽掉,
增加以下内容
SOCKET=”inet:8891@localhost”

编辑 vi /etc/postfix/main.cf
增加以下内容
# DKIM milter_default_action = accept milter_protocol = 2 smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891

生成Key
opendkim-genkey -t -s mail -d mydomain.com

-s: mail  代表选择器,当有多个SMTP时这值就是区分各台SMTP用的
-d: mydoamin.com 代表生成以该域名为密文的key

执行该命令后会在本目录生成 mail.private[私钥] 和 mail.txt[公钥]

cat mail.txt  会看到整条DNS记录内容,我们在DNS中增加一条记录
记录名:mail._domainkey
记录值:v=DKIM1; k=rsa; t=y;p=MIG….密文….QIDAQAB
记录类型: TXT

注意:上-s填入的值与以下mail要相对应,即 -s=abc的话,下面的mail要换abc.

如果有多台SMTP服务器需要授权,有多少台就重复生成多少条KEY, -s要不同的值,然后在DNS记录中增加多条不同记录名的记录。

最后:

  1. 可以用www.mail-tester.com评测一下你的SMTP评分,小弟通过以上方式取得10满分成绩。
  2.  mail.private[私钥]的权限应该是 opendkim:opendkim ,不然opendkim会启动不了报错。

以下是小弟一些配置文件,新司机可参考! 按一台国内一台国外中继的配置

国内的SMTP没有什么解释的,无论原来是用什么平台或者是什么SMTP,需要做的一点就是,把有需要转发的邮件通过判断发往国外的SMTP中继。例如:发往abc.com的电邮让国内的SMTP直接指向国外的中继,再由中继SMTP发给abc.com,而不是直接由国内SMTP发往abc.com。

以下配置文件全部是国外SMTP上的

vi /etc/opendkim.conf

Syslog                  yes
SyslogSuccess           Yes
LogWhy                  yes
UMask                   002
Canonicalization        relaxed/simple
Mode                    sv
OversignHeaders         From
#SubDomains              no
#ADSPAction             continue
AutoRestart             Yes
AutoRestartRate         10/1h
Background              yes
DNSTimeout              5
#SignatureAlgorithm      rsa-sha256
UserID                  opendkim:opendkim
Socket                  inet:8891@localhost
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts

vi /etc/opendkim/KeyTable

mail._domainkey.mydomain.com mydomain.com:mail:/etc/postfix/keys/us.private

vi /etc/opendkim/SigningTable

*@netstarmacau.com us._domainkey.netstarmacau.com

vi /etc/opendkim/TrustedHosts

127.0.0.1
localhost
12.34.56.78   <– 这里填你国内的SMTP IP地址

vi /etc/default/opendkim

# Command-line options specified here will override the contents of
# /etc/opendkim.conf. See opendkim(8) for a complete list of options.
#DAEMON_OPTS=””
#
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
# default:
SOCKET=”inet:8891@localhost”         #8891是opendkim守护进程端口
#SOCKET=”local:/var/run/opendkim/opendkim.sock”
# listen on all interfaces on port 54321:
#SOCKET=”inet:54321″
# listen on loopback on port 12345:
#SOCKET=”inet:12345@localhost”
# listen on 192.0.2.1 on port 12345:
#SOCKET=”inet:[email protected]

vi /etc/postfix/main.cf

增加以下内容
# DKIM
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
milter_protocol = 2
milter_default_action = accept

修改以下内容
myhostname = mail.mydomain.com
mydestination = $myhostname, localhost, mydomain.com
mynetworks = 127.0.0.0/8, 12.34.56.78

这样国外的postfix会无条件允许来自国内12.34.56.78转发过来的电邮再进行二次投递!

如果国内的WAN IP非固定IP地址,那可以用DDNS服务解释实时的动态IP地址,但需要在 /etc/mailname 里加入DDNS域名,因为mynetworks只识别IP地址,不能识别域名。

另外: 这样做虽然postfix允许来自DDNS域名的动态IP地址发信,但DKIM就不会自动签署了,因为DDNS解释出来的域名不在/etc/opendkim/TrustHosts列表内,要解决这个问题其实很简单,在TrustHosts里加入0.0.0.0/0 , 也即信任所有IP地址加签署。

發佈留言