Postfix 和 Dovecot 的教程很多,但是根据教程搭建完成后,或多或少的会遇到一些问题,不是邮件发送不成功,就是 Dovecot 收不到邮件。

本教程将详细讲解如何在 CentOS 8 系统上搭建 Postfix+Dovecot 邮件服务器,并将搭建过程中的一此细节问题讲明白,力争根据本教程可以搭建一个可以正常收发邮件,支持同邮件客户端通信的邮件服务器。

1] 系统环境说明

  • 操作系统:CentOS 8
  • 主机名:mail.rultr.com
  • 邮件传输代理(MTA):Postfix
  • 邮件分发搭理(MDA):Dovecot

2] 安装配置 Postfix

安装 Postfix 比较简单,直接使用软件库的预安装版本,安装完成后,设置一下默认的邮件传输代理:

# dnf install postfix
# alternatives --config mta

图.1 设置系统默认邮件传输代理

设置完成之后,需要对 Postfix 进行简单配置才能让其正常工作。主要配置文件为”/etc/postfix/main.cf”,修改配置文件内容如下:

#第95行:取消注释并设置主机名
myhostname = mail.rultr.com

#第102行:取消注释并设置域名
mydomain = rultr.com

#第118行:取消注释
myorigin = $mydomain

#第135行:修改为all
inet_interfaces = all

#第183行:增加为如下内容
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

#第283行:取消注释并设置特定网络
mynetworks = 127.0.0.0/8, 10.0.0.0/24

#第438行:取消注释,设置邮件单独保存
home_mailbox = Maildir/

#第593行:添加为如下内容
smtpd_banner = $myhostname ESMTP Postfix

#配置文件末尾添加以下内容
#设置邮件大小为10M
message_size_limit = 10485760
#设置邮箱大小为1G
mailbox_size_limit = 1073741824

#设置SMTP认证(使用 Dovecot SASL认证)
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_auth_destination, permit_sasl_authenticated, reject

Postfix 默认使用 saslauthd 的认证功能,而 Dovecot 也可以提供 SASL 认证,既然这样,不如直接使用 Dovecot  的认证功能,这样可以减少安装程序数量。

配置完成后,就可以启动 Postfix 并在防火墙中放行 SMTP 服务:

# systemctl enable --now postfix
# firewall-cmd --add-service=smtp --permanent
# firewall-cmd --reload

3] 安装配置 Dovecot

Dovecot 也采用预安装版本:

# dnf install dovecot

安装完成后,对 Dovecot 进行配置。

首先修改 Dovecot 的主配置文件”/etc/dovecot/dovecot.conf”:

#第30行:取消注释(如果未使用IPv6,网络则删除[::])
listen = *, ::

然后修改 Dovecot 的认证文件”/etc/dovecot/conf.d/10-auth.conf”:

#第30行:取消注释并修改为如下内容
disable_plaintext_auth = no

#第100行:增加内容
auth_mechanisms = plain login

之后修改 Dovecot 邮件设置文件”/etc/dovecot/conf.d/10-mail.conf”,采用同 Postfix 一致的方式:

#第30行:取消注释并修改为如下内容
mail_location = maildir:~/Maildir

修改 Dovecot 进程设置文件”/etc/dovecot/conf.d/10-master.conf”,让其为 Postfix 提供 SASL 认证功能:

#第96-98行:取消注释并修改为如下内容
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
}

最后,修改 Dovecot SSL设置文件”/etc/dovecot/conf.d/10-ssl.conf”:

#第8行:修改为如下内容
ssl = yes

全部配置完成后,启动 Dovecot 服务并在防火墙放行相关服务:

# systemctl enable --now dovecot
# firewall-cmd --add-service={pop3,imap} --permanent
# firewall-cmd --reload

4] 添加邮件用户

示例将设置使用系统用户作为邮件帐户,认证密码同样为系统用户密码。

添加邮件用户就相当于添加系统用户”service”:

# useradd -s /usr/sbin/nologin service
# passwd service

之后的内容就相当重要了,因为这部分内容不设置正确,则邮件服务器工作达不到预期效果。

由于 Postfix 存在一个别名系统,可以根据别名决定邮件倒底发送给哪个用户,默认配置内容为:

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

其意思就是使用”/etc/aliases”作为别名映射表,打开这个 hash  表文件,其内容大致为:

webmaster:      root
security:       root

表的作用就是如果系统中有表中的用户,那么发送给该用户的邮件由后面指定的用户代收,例如发送给 webmaster 有户的邮件则会投递给 root 用户;同样,也可以设置其他用户接收 root 用户的邮件,甚至可以设置将一个用户的邮件投递给多个用户,设置方法为修改别名表文件内容如下:

root:      root,webmaster,service

此时,root 用户的邮件就会由 root、webmaster以及 service用户共同收取。

修改完成后,使用如下命令刷新一下 Postfix 的别名表,以使修改生效:

# postalias /etc/aliases

然后要根据 Postfix 及 Dovecot 的配置内容,修改系统环境变量值,以使邮件可以正常接收:

# echo 'export MAIL=$HOME/Maildir' >> /etc/profile.d/mail.sh

最后,安装邮件客户端并进行邮件发送测试:

# dnf install mailx
# mail -s "Test mail#1" service@rultr.com
# telnet localhost 110

图.2 登录 Dovecot 服务器查看邮件

登录到 Dovecot 服务器,就可以查看到 Dovecot 收取的邮件。

同样可以通过 telnet 方式连接 Postfix 服务器进行认证测试。

首先用如下命令生成验证用户及密码的 base64 编码:

# perl -MMIME::Base64 -e 'print encode_base64("username");'
# perl -MMIME::Base64 -e 'print encode_base64("password");'

然后 telnet 连接至 Postfix 服务器,使用用户名及密码的 base64 编码进行认证测试,如下图所示:

图.3 Postfix 本地 SMTP 认证测试

5] 添加 DKIM 签名

通过以上步骤,一个具备基本收发功能的邮件服务器就搭建完成了。但是此时的服务器外发邮件多半不能被接收,因为此时的邮件因为不带有 DKIM 签名信息,会被对方服务器判定为垃圾邮件而拒收。因此,就需要给邮件中添加域名签名信息,从而增加邮件的可信性,提升邮件被接收的概率。

DKIM 签名与域名设置密切相关,首先讲解如何生成域名证书。

下载并安装 OpenDKIM 工具,然后通过 OpenDKIM 工具生成选择器和域名证书的私钥:

# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# dnf config-manager --set-enabled PowerTools
# yum install opendkim
# opendkim-genkey -r -s rultr -d rultr.com

命令执行完成后,会生成两个文件”rultr.private”和”rultr.txt”,其中”rultr.private”是 OpenDKIM 使用的域名私钥,而”rultr.txt”是在域名 rultr.com中添加的一条 TXT 记录的内容,相当于是域名的公钥。而 rultr DKIM中的选择器,可以自行命名,方便起见,直接使用域名前缀便于记忆使用。

现在,将私钥文件移动至正确位置:

# mv rultr.private /etc/opendkim/keys

然后修改 OpenDKIM 的配置文件”/etc/opendkim.conf”为如下内容:

#第39行:修改为如下内容
Mode    sv

#第60行:修改为如下内容
Umask   022

#第88行:取消注释并修改为实际域名
Domain  rultr.com

#第91行:修改为实际选择器内容
Selector rultr

#第91行:修改为实际私钥内容
KeyFile /etc/opendkim/keys/rultr.private

#第103行:取消注释
KeyTable        /etc/opendkim/KeyTable

#第108行:取消注释
SigningTable refile:/etc/opendkim/SigningTable

#第112行:取消注释
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts

#第115行:取消注释
InternalHosts   refile:/etc/opendkim/TrustedHosts

然后,根据配置文件的内容,修改如下文件:

  • 在 /etc/opendkim/KeyTable 文件中加入rultr._domainkey.rultr.com rultr.com:rultr:/etc/opendkim/keys/rultr.private
  • 在 /etc/opendkim/SigningTable 文件中加入 *@rultr.com rultr._domainkey.rultr.com
  • 在 /etc/opendkim/TrustedHosts 文件中加入 127.0.0.1 mail.rultr.com rultr.com

全部修改完成后,使用如下命令授权并启动 OpenDKIM 服务:

# chown -R opendkim:opendkim /etc/opendkim
# systemctl enable --now opendkim

OpenDKIM 启动成功后,就需要为 Postfix 增加支持 DKIM 签名的配置项,以使外发邮件邮件头包含 DKIM 签名。

在”/etc/postfix/main.cf”配置方便中添加如下内容:

smtpd_milters = inet:127.0.0.1:8891                 //设置通信端口
non_smtpd_milters = $smtpd_milters                  //设置通信端口
milter_default_action = accept                      //设置行为

至此,CentOS 8 系统使用 Postfix 和 Dovecot 搭建的邮件服务器就已经完成,并且外发邮件携带了 DKIM 签名信息,提升邮件送达率。

当然,此时的邮件服务器还不完美,因为邮件传输未加密,使用时文密码传递是十分不安全的。至于 Postfix 和 Dovecot 如何启用 SSL 加密,将在之后的文章中讲解。

One thought on “CentOS 8 系统搭建 Postfix+Dovecot 邮件服务器”

  1. 这文档做的很强大,阅读起来就很舒服,值得收藏。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注