使用示例配置Postfix邮件服务器和客户端(CentOS/RHEL 7/8)
Postfix是一个邮件传输代理(MTA),负责使用SMTP协议在邮件服务器之间传输电子邮件。在本文中,我将分享使用后缀SMTP中继配置后缀邮件服务器和客户端的步骤,以及一些示例,以检查CentOS/RHEl 7/8 Linux中的SMTP服务器检查配置和连接。
实验室环境
我在Linux服务器上安装了Oracle VirtualBox上的两个虚拟机。
我们将使用其中一个VM(centos-8.example.com)配置Postfix邮件服务器和DNS服务器,而另一个VM(rhel-8.example.com)充当客户端。我已经在CentOS/RHEL 8上验证了这些步骤,但是我假设相同的步骤在CentOS/RHEL 7上也可以工作。
以下是我的Postfix Mail Server
(也是我的DNS Server
)
节点 | 说明 |
---|---|
主机名/FQDN | centos-8. example.com |
IP地址 | 192.168.0.10 |
名称mail.example.com | |
世纪8 |
以下是我的"客户端服务器"
节点 | 说明 |
---|---|
主机名/FQDN | rhel-8. example.com |
IP地址 | 192.168.0.11 |
操作系统8 |
为什么SMTP邮件服务器需要DNS服务器
如果我们希望为单个节点配置postfix邮件服务器,用户可以其中相互本地发送邮件,并且我们可以在本地主机上接收有关系统活动的电子邮件警报,则DNS邮件服务器不需要DNS服务器。
工作站
server1.example.com
上的用户hynman不会知道DNS服务器所在的server2.example.com
上可用的用户amit
。我们在DNS服务器中使用MX记录,因为它们提供了邮件路由信息。它们为域指定邮件交换器,即为域名处理所有邮件的邮件集线器的名称。
因此,我们配置了充当MTA的postfix邮件服务器,它将充当SMTP中继主机,并且可以从server1.example.com接收来自hynman用户的邮件,并将其传输到server2.example.com上的用户amit `,反之亦然。
诸如Postfix之类的MTA需要一种方法来确定哪些主机是域的邮件中心。 DNS MX记录提供此信息。
我已经写了另一篇文章,其中有详细的说明和在CentOS/RHEL 7和8 Linux的chroot环境中配置BIND DNS服务器的步骤。
此外,其中我们需要向现有的DNS正反区域文件中添加一些MX和CNAME记录,以配置后缀邮件服务器。
DNS服务器上的示例DNS正反向区域文件
以下是我的示例正向区域文件。其中我使用的是一个单一的邮件服务器,即我的本地主机,即centos-8.example.com
。我还定义了一个CNAME记录,因此可以使用更熟悉的FQDN来向服务器发送邮件,而不是使用centos-8.example.com
。
[root@centos-8 ~]# cat /var/named/example.com.zone $TTL 1D @ IN SOA example.com root ( 4 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS localhost localhost IN A 127.0.0.1 ; Host Address example.com. IN A 192.168.0.10 centos-8 IN A 192.168.0.10 rhel-8 IN A 192.168.0.11 ; Mail Server example.com. IN MX 10 192.168.0.10 ; CNAME mail IN CNAME centos-8.example.com.
还有我的示例反向区域文件。类似于我的转发区域文件,我已经定义了CNAME和MX记录地址。
[root@centos-8 ~]# cat /var/named/example.com.rzone $TTL 1D @ IN SOA example.com. root.example.com. ( 20191116 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS localhost. 10 IN PTR centos-8.example.com. 10 IN PTR mail.example.com. 11 IN PTR rhel-8.example.com.
在重新启动named-chroot服务之前,请确保我们已验证区域配置文件。
[root@centos-8 ~]# systemctl restart named-chroot.service
验证DNS服务器配置
确保DNS服务器正常工作以配置后缀邮件服务器,这可以通过执行主机查找来完成。我们需要bind-utils
rpm才能使用nslookup,可以使用yum
进行安装。
[root@centos-8 ~]# nslookup mail.example.com Server: 192.168.0.10 Address: 192.168.0.10#53 mail.example.com canonical name = centos-8.example.com. Name: centos-8.example.com Address: 192.168.0.10
使用主机命令,我们可以查询邮件服务器(MX记录)
[root@centos-8 ~]# host -t mx example.com example.com mail is handled by 10 192.168.0.10.example.com.
配置Postfix邮件服务器(CentOS/RHEL 7/8)
现在,我们已经完成了所有准备工作。现在是时候配置postfix邮件服务器了。配置Postfix服务器需要执行几个步骤。此过程涉及的基本步骤是
编辑
master.cf文件
确定本地邮件传递方法。
编辑
main.cf
文件。创建一个别名表。
启动并测试Postfix。
创建启动脚本以启动Postfix。
创建任何用户定义的文件。
我们将这些任务分配在不同的文章中,否则将成为一篇无聊的文章。让我们尝试拥有并配置postfix邮件服务器(基本)。
安装Postfix rpm
首先,要配置postfix邮件服务器,我们需要的主要成分是postfix rpm。默认情况下,大多数CentOS/RHEL 7/8软件组都安装了postfix,但如果没有,则可以使用yum进行安装。
说明:
在RHEL系统上,我们必须具有RHN的有效订阅,或者我们可以配置本地脱机存储库,通过该本地脱机存储库,yum
软件包管理器可以安装提供的rpm及其依赖项。
[root@centos-8 ~]# yum -y install postfix
Postfix RPM安装会自动执行以下操作:
创建一个名为
postfix
的新系统用户。创建一个名为
postfix
的新系统组。创建
/etc/postfix
和/var/spool/postfix
目录创建所有Postfix消息队列目录
创建默认的Postfix配置文件
创建一个默认的Postfix别名数据库
配置master.cf文件
Postfix主守护程序会根据需要启动所有其他Postfix服务。在master.cf文件中指定了各种服务及其运行方式。
要配置后缀邮件服务器(基本的SMTP服务器),我们现在不需要对此文件进行任何修改。
有关master.cf文件中各个参数和部分的更多详细信息,请参阅Postfix:The Definitve Guide和Postfix Mail Server
配置main.cf
与sendmail相似,Postfix使用配置文件来定义其操作行为。 Postfix配置文件的不同之处在于,它使用纯文本和常识性描述来表示参数名称和值,而不是使用密码或者进行编译。
全局Postfix配置文件称为main.cf
。它位于Postfix配置目录中,默认情况下为/etc/postfix
。
备份现有的main.cf
文件很重要
[root@centos-8 ~]# cp /etc/postfix/main.cf /etc/postfix/main.cf.BAK
现在,此文件包含多个参数,但是在本文中,我们仅需要使用有限的指令来配置postfix邮件服务器,因此,我将仅关注以下指令:
另请阅读:
如何在Linux中使用fsarchiver备份和还原整个分区和文件系统
修改inet_interfaces
" inet_interfaces"用于指示SMTP邮件服务器将在哪个网卡上侦听。默认情况下,它设置为localhost,这意味着默认情况下,postfix邮件服务器将仅侦听来自回送地址的所有流量。现在,如果要在域环境中使用此邮件服务器,则没有任何意义。现在,如果我们仅在本地计算机上使用此SMTP邮件服务器将邮件从crontab
作业传递给root用户或者特定用户,那很好,但是如果我们希望在域环境中使用SMTP邮件服务器,则我们需要更改此设置。
我们将使用全部,以使用SMTP邮件服务器计算机上可用的所有地址。
inet_interfaces = all
说明:
现在,以我为例,我只有一个接口,这很好,但是如果SMTP邮件服务器节点上有多个接口,则可以使用$myhostname。配置后缀邮件服务器时,请确保也在文件中定义此变量。
myhostname = centos-8.example.com
修改mydomain
接下来,我们需要设置邮件服务器的本地域名。例如,如果我们的邮件服务器的FQDN为mailserver.example.com
,而该"邮件服务器"负责为整个" example.com"私有域传递邮件,则域名为example.com
mydomain = example.com
说明:
该地址将被添加到我们从服务器发送出去的任何邮件消息中。如果尚未定义,则系统将使用" myhostname"代替域名。
修改肌源性
myorigin参数定义了Postfix系统发送的所有消息的原始地址格式。默认情况下," myorigin"参数将采用" myhostname"参数的值。
如果将" myorigin"设置为" myhostname",则任何传递的消息都将包含本地主机的FQDN。因此,如果用户" hynman"从" centos-8.example.com"发送邮件,则其"发件人:"部分中的地址看起来像[email protected],但是如果我们将" myorigin"设置为" mydomain"在本例中为example.com,发件人部分为[email protected]。
因此,我们将使用" myorigin"作为域名
myorigin = $mydomain
定义myhostname
myhostname参数指定邮件服务器的标准域名(FQDN)。除非邮件管理员另行指定,否则此地址将用作所有本地用户的默认地址。
myhostname = centos-8.example.com
修改目的地
" mydestination"参数定义了Postfix服务器接受哪些主机名作为最终目的地。此参数仅适用于本地主机的主要主机名和别名,不应包含其他主机的虚拟域。
" mydestination"参数通常支持可能具有除为其分配的常规主机名之外的DNS名称的主机。例如,我们为mail.example.com
添加了CNAME记录。 mydestination`参数可以配置为:
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mail.$mydomain
这使Postfix服务器可以接受以下格式的地址消息:
webmaster [email protected] [email protected] [email protected]
发送到这四个地址中的任何一个的邮件都将被接受并传递给本地Postfix服务器上的Webmaster用户。
修改我的网络
" mynetworks"参数用于控制Postfix将为其中继邮件的SMTP客户端。默认情况下,Postfix将中继来自任何IP地址与" mynetworks"参数中的设置匹配的客户端的邮件。
" mynetworks"参数包含IP网络地址列表以及子网值,以指定对SMTP客户端的替代网络限制。 " mynetworks"参数的格式为
mynetworks = ipaddress1, ipaddress2, ...
其中" ipaddress1"和" ipaddress2"代表IP地址网络值
其中我提供了子网的价值
mynetworks = 192.168.0.0/24, 127.0.0.0/8
这限制了可以将Postfix服务器用作SMTP中继主机的客户端。
修改中继主机
" relayhost"参数定义了Postfix SMTP中继主机。 relayhost
参数有两种格式:
relay_host = gateway.my.domain relay_host = [an.ip.add.ress]
第一种格式通过其DNS名称标识SMTP中继主机邮件服务器。 Postfix将所有出站邮件转发到此主机。第二种格式通过其数字IP地址标识中继主机。对于使用到中继主机的拨号连接的Postfix服务器,应使用第二种格式。由于Postfix服务器没有全时连接到Internet来解析中继主机DNS名称,因此最好使用IP地址来引用它。这样可以防止由于DNS错误而导致邮件传递出现问题。在我们的例子中,我们使用Postfix MTA作为SMTP中继主机。
relayhost = [centos-8.example.com]
修改home_mailbox和mail_spool_directory
" home_mailbox"参数可以定义Postfix将邮件传递到本地邮件用户的位置。 Postfix可以使用三种不同的传递样式:
sendmail-style:/var/spool/mail邮箱
Individual:``$HOME/Mailbox
文件qmail-style:$HOME/Maildir目录
默认情况下,Postfix将邮件传递到标准系统邮箱目录。在大多数Linux系统上,这是/var/spool/mail
目录。
home_mailbox = Maildir/ mail_spool_directory = /var/spool/mail
现在,这些配置修改足以配置postfix邮件服务器(基本)。其中我没有实现任何与安全性相关的指令,我将在以后的文章中介绍它们。
配置Postfix SMTP中继(客户端)
我将配置" rhel-8.example.com"作为我的客户端,该客户端将使用我们的Postfix SMTP中继服务器" centos-8.example.com"发送电子邮件。
安装postfix和sendmail
尽管我们计划使用Come客户端工具发送需要安装sendmail rpm的邮件,但我们将使用postfix作为主要配置文件。
[root@rhel-8 ~]# yum -y install postfix
安装更多本文将需要的工具
[root@rhel-8 ~]# yum -y install bind-utils telnet mailx sendmail
我们需要使用" nslookup"工具来验证由" bind-utils"," telnet"提供的客户端DNS配置,以确保我们的SMTP端口25可以访问。发送邮件到远程服务器
配置客户端DNS(更新/etc/resolv.conf)
现在,在我们的主DNS服务器上,我们已经为rhel-8.example.com
定义了A和PTR记录,因此在客户端节点上,我们只需要更新/etc/resolv.conf
。
[root@rhel-8 ~]# cat /etc/resolv.conf # Generated by NetworkManager search example.com nameserver 192.168.0.10
192.168.0.10是我们的DNS服务器的IP地址
验证DNS服务器配置
我们将执行少量DNS查找,以确保DNS服务器可访问
[root@rhel-8 ~]# nslookup rhel-8 Server: 192.168.0.10 Address: 192.168.0.10#53 Name: rhel-8.example.com Address: 192.168.0.11
[root@rhel-8 ~]# host -t mx mail.example.com mail.example.com is an alias for centos-8.example.com.
因此,我们的A和MX记录运行正常。
配置/etc/postfix/main.cf
现在,我们必须在postfix main.cf中配置和修改某些值,以便能够使用SMTP中继服务器发送邮件
修改inet_interfaces
类似于我们的SMTP邮件服务器,我们将inet_interfaces
值修改为所有
inet_interfaces = all
修改中继主机
我们将使用Postfix邮件服务器作为SMTP中继主机,因此我们将在relayhost
中提供Postfix邮件服务器FQDN。
relayhost = [centos-8.example.com]
修改我的网络
在客户端节点上,我们可以为mynetworks
指令添加回送地址。
mynetworks = 127.0.0.0/8
修改目的地
同样,对于客户端后缀main.cf
,此伪指令可以为null。
mydestination =
这些是我们将为客户端后缀配置修改的指令,以配置后缀邮件服务器。
说明:
对于本文,我禁用了firewalld
和selinux
配置。我们可以在配置正常运行后将SMTP规则添加到"防火墙"中
# firewall-cmd --permanent --add-service=smtp && firewall-cmd --reload
接下来在客户端节点上启动postfix服务
[root@rhel-8 ~]# systemctl start postfix
我们可以使用telnet来确保端口25可以访问
[root@rhel-8 ~]# telnet localhost 25 Trying ::1... Connected to localhost. Escape character is '^]'. 220 rhel-8.example.com ESMTP Postfix QUIT 221 2.0.0 Bye Connection closed by foreign host.
如何在Linux中检查SMTP服务器配置
有不同的邮件客户端可用,例如mutt,mail等。
我们可以使用" SWAKS"(瑞士军刀SMTP)来检查Linux中的SMTP服务器配置。一旦我们配置了后缀邮件服务器,下一步将是检查SMTP服务器配置,并确保邮件已成功发送和传递。
我们在作为客户端的RHEL 8主机上安装SWAKS。
现在,SWAKS在RHEL存储库上不可用,因此我们必须安装EPEL存储库。
接下来使用yum
安装SWAKS
[root@rhel-8 ~]# yum install swaks
因此,在我们的节点上,我们安装了以下版本的swak,以检查SMTP服务器配置
[root@rhel-8 ~]# rpm -q swaks swaks-20161104.0-5.el8.noarch
现在,要检查使用标准SMTP邮件端口25的SMTP服务器配置,并让我们的Postfix服务器运行在IP地址192.168.0.10上,我们正在向Linux系统用户" hynman"远程发送邮件,该用户在我们的系统上具有系统用户帐户Postfix服务器:
[root@rhel-8 ~]# swaks --server 192.168.0.10 --to [email protected] === Trying 192.168.0.10:25... === Connected to 192.168.0.10. <- 220 centos-8.example.com ESMTP Postfix -> EHLO rhel-8.example.com <- 250-centos-8.example.com <- 250-PIPELINING <- 250-SIZE 10240000 <- 250-VRFY <- 250-ETRN <- 250-STARTTLS <- 250-ENHANCEDSTATUSCODES <- 250-8BITMIME <- 250-DSN <- 250 SMTPUTF8 -> MAIL FROM:<[email protected]> <- 250 2.1.0 Ok -> RCPT TO:<[email protected]> <- 250 2.1.5 Ok -> DATA <- 354 End data with . -> Date: Mon, 18 Nov 2019 12:34:01 +0530 -> To: [email protected] -> From: [email protected] -> Subject: test Mon, 18 Nov 2019 12:34:01 +0530 -> Message-Id: <[email protected]> -> X-Mailer: swaks v20161104.0 jetmore.org/john/code/swaks/ -> -> This is a test mailing -> -> -> . <- 250 2.0.0 Ok: queued as 9DF4E6027A -> QUIT <- 221 2.0.0 Bye === Connection closed with remote host.
Swaks创建输出,如果邮件传输成功,则应该给我们提示。
我们还可以通过以下方式测试是否成功执行了最后一条命令:在Postfix服务器上以" hynman"用户身份登录,然后检查并读取本地邮箱的收件箱,该收件箱应包含带有swaks工具发送的测试邮件的文件。文件名在计算机上会有所不同),如下所示:
[hynman@centos-8 ~]$cat Maildir/new/1574061098.Vfd00Ia1558M372782.centos-8.example.com Return-Path: <[email protected]> X-Original-To: [email protected] Delivered-To: [email protected] Received: from rhel-8.example.com (rhel-8.example.com [192.168.0.11]) by centos-8.example.com (Postfix) with ESMTP id 524DD602C2 for <[email protected]>; Mon, 18 Nov 2019 12:41:38 +0530 (IST) Date: Mon, 18 Nov 2019 12:41:38 +0530 To: [email protected] From: [email protected] Subject: test Mon, 18 Nov 2019 12:41:38 +0530 Message-Id: <[email protected]> X-Mailer: swaks v20161104.0 jetmore.org/john/code/swaks/ This is a test mailing
说明:
现在,我尚未在此处配置Active Directory域,这就是为什么我在收件人地址中使用FQDN而不是Domain Name的原因。如果我们已将RHEL/CentOS 7/8节点连接到Active Directory或者已配置基于Linux的Active Directory,则只能在收件人地址中使用域名。
日志文件,用于解决与Postfix Mail Server相关的问题
对于使用sendmail发送的每封邮件,我们应该能够看到在/var/log/maillog文件中出现的一些新行,其中包含状态信息和邮件的其他重要日志文本。
如果我们从根目录向用户hynman发送了一条消息,并且服务器的FQDN为rhel-8.example.com,则添加到日志文件的新输出行应包含`from = <root @ rhel-8. example.com>,一个to = <[email protected]>,如果成功交付,则显示status = sented信息。如果没有这样的日志记录信息,请检查Postfix服务的状态。
例如,我们将从" root [email protected]"向" [email protected]"发送虚拟邮件。
[root@rhel-8 ~]# mail -s test message [email protected] <. Null message body; hope that's ok
为此,我们在rhel-8.example.com
的/var/log/maillog
中有以下日志条目
Nov 18 12:53:13 rhel-8 sendmail[8849]: xAI7NDhe008849: from=root, size=240, class=0, nrcpts=2, msgid=<[email protected]>, relay=root@localhost Nov 18 12:53:13 rhel-8 postfix/smtpd[8831]: connect from localhost[127.0.0.1] Nov 18 12:53:13 rhel-8 sendmail[8849]: STARTTLS=client, relay=[127.0.0.1], version=TLSv1.3, verify=FAIL, cipher=TLS_AES_256_GCM_SHA384, bits=256/256 Nov 18 12:53:13 rhel-8 postfix/smtpd[8831]: 684EE20B88: client=localhost[127.0.0.1] Nov 18 12:53:13 rhel-8 postfix/cleanup[8834]: 684EE20B88: message-id=<[email protected]> Nov 18 12:53:13 rhel-8 postfix/qmgr[6230]: 684EE20B88: from=<[email protected]>, size=661, nrcpt=2 (queue active) Nov 18 12:53:13 rhel-8 sendmail[8849]: xAI7NDhe008849: to=message,[email protected], ctladdr=root (0/0), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=60240, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (Ok: queued as 684EE20B88) Nov 18 12:53:13 rhel-8 postfix/smtpd[8831]: disconnect from localhost[127.0.0.1] ehlo=2 starttls=1 mail=1 rcpt=2 data=1 quit=1 commands=8 Nov 18 12:53:13 rhel-8 postfix/smtp[8835]: 684EE20B88: to=<[email protected]>, relay=centos-8.example.com[192.168.0.10]:25, delay=0.21, delays=0.06/0/0.11/0.03, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 94D62602FF) Nov 18 12:53:13 rhel-8 postfix/smtp[8835]: 684EE20B88: to=<[email protected]>, relay=centos-8.example.com[192.168.0.10]:25, delay=0.21, delays=0.06/0/0.11/0.03, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 94D62602FF) Nov 18 12:53:13 rhel-8 postfix/smtpd[8831]: connect from centos-8.example.com[192.168.0.10] Nov 18 12:53:13 rhel-8 postfix/qmgr[6230]: 684EE20B88: removed
我们可以在服务器端检查相同的日志文件(/var/log/maillog
),即centos-8.example.com
Nov 18 12:53:13 centos-8 postfix/smtpd[17583]: connect from rhel-8.example.com[192.168.0.11] Nov 18 12:53:13 centos-8 postfix/smtpd[17583]: 94D62602FF: client=rhel-8.example.com[192.168.0.11] Nov 18 12:53:13 centos-8 postfix/cleanup[17586]: 94D62602FF: message-id=<[email protected]> Nov 18 12:53:13 centos-8 postfix/qmgr[17460]: 94D62602FF: from=<[email protected]>, size=835, nrcpt=2 (queue active) Nov 18 12:53:13 centos-8 postfix/local[17587]: 94D62602FF: to=<[email protected]>, relay=local, delay=0.03, delays=0.02/0/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Postfix(MTA)邮件服务器如何工作?
Postfix MTA服务可以使用SMTP协议从邮件客户端或者其他远程MTA服务器接收传入的电子邮件。
如果传入的电子邮件是针对MTA服务器配置的最终目标域的(例如,使用收件人地址
hynman @ example.com
发送的邮件被传入example.com配置的Postfix MTA服务器),则它将传递将邮件发送到服务器上安装的本地邮箱(在文件系统或者数据库系统(例如MariaDB)中)。如果传入的邮件不是发往该服务器的,它将被中继(转发)到另一个MTA。
请记住,这就是Postfix服务器的全部功能,仅此而已:从邮件客户端或者其他MTA接收传入的SMTP连接,将邮件传递到服务器上的本地邮箱,以及使用SMTP将邮件转发到其他MTA
与通常的看法相反,Postfix无法将邮件从其本地邮箱传输到最终用户。
其中我们需要另一种称为传递代理的MTA,它使用不同的邮件协议,例如IMAP或者POP3.
如果从我们网络中另一台计算机发送的传入电子邮件在收件人的电子邮件地址中具有与我们的Postfix服务器在其FQDN中相同的域名,那么它将被传递到收件人部分定义的适当本地邮箱中电子邮件;所有外部电子邮件地址都将中继到外部MTA。