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 加密,将在之后的文章中讲解。
这文档做的很强大,阅读起来就很舒服,值得收藏。