这里我们会用到一个收发邮件,链接在下方,
链接:https://pan.baidu.com/s/1VKO3AqtKcFAh_fK8uqomkw
提取码:orm5
电子邮件是一种利用网络传递信息给远程服务器的信息传递行为。我们可以将文件或信息传送到地球上任何一个有网络的地方,我们也可以在任何有网络的地方连上internet去收取邮件。但是其中也存在一些问题:
1、夹带病毒的电子邮件问题
2、黑客通过邮件程序入侵
3、广告信息与垃圾信息等
4、主机被大量不明邮件塞满
我们通常接收到的E-mail都是使用“账号@主机名”的方式来处理的,由于恶意的邮件和垃圾邮件的泛滥等种种原因,导致我们不被允许直接利用主机的ip地址来发送邮件,所以说,邮件服务器一定要有一个合法注册过的主机名。既然用到了主机名,也就是在DNS的查询当中你的主机名需要拥有一个A标志。对于一般的服务器来说只要使用正解让客户端可以正确找到我们服务器的IP即可,由于目前收信端的邮件服务器会针对邮件的来源IP进行反解,而如果你的邮件服务器的地址不是固定IP时,该种IP在ISP方面通常会以xxx.dynamic.xxx之类的主机名来管理,偏偏这样的主机名会被主要的大型邮件服务器视为垃圾邮件,所以你的邮件服务器发出的邮件将可能会被丢弃。因此我们最好向ISP申请IP反解。
邮件服务器是如何通过DNS的信息来进行邮件的传递:
当我们在发送一封邮件的时候,主机首先会先分析那封信的目标主机的DNS,先取得MX标志(Mail Exchanger),然后以最优先MX主机为准将信发送出去。假设我们找到的目标主机DNS有如下信息:
haha.com IN MX 10 mail1.haha.com
haha.com IN MX 20 mail2.haha.com
haha.com IN A ip地址
1、当有一封信要传给user@haha.com时,由于MX记录标志最低者优先,所以该封信会先发送到mail1.haha.com这个主机上。
2、如果mail1.haha.com由于种种原因未能收下这封信,该封信将以第二优先的MX主机来传送,也就是mail2.haha.com。
3、如果所有的MX主机都无法负责的话,那么该封信会以A的标志,直接传送给自己。
邮件传输所需要的组件以及相关协议:
MUA:(Mail User Agent,邮件用户代理)
客户端要发送邮件有两种办法,第一种直接登录上邮件服务器(例如ssh)来主动发出邮件;第二种就是需要通过MUA来帮你把信送给邮件服务器。MUA的主要功能就是收取邮件主机的电子邮件,以及提供用户浏览与编写邮件。接收邮件所使用的客户端软件,例如foxmail,outlook,Thunderbird(雷鸟是linux下的客户端工具)、Mutt(linux下的字符界面客户端工具)。MUA使用SMTP、IMAP或POP3协议与服务器通信。
WebMail:基于Web的电子邮件收发系统,扮演邮件用户代理角色。一般而言,WebMail系统提供邮件收发、用户在线服务和系统服务管理等功能。WebMail的界面直观、友好,不需要借助客户端,免除了用户对E-mail客户软件进行配置时的麻烦,只要能上网就能使用WebMail,方便用户对邮件进行接收和发送。常用的webmail有Openwebmail、Squirrelmail、Extmail,Extman。
MTA:(Mail Transfer Agent,邮件发送代理)
MUA将用户的邮件发送到邮件主机上,如果这台邮件主机能够帮用户将这封邮件寄出去,那它就是一个MTA。Mail server就是一个MTA,MTA使用的协议是SMTP(Simple Mail Transfer Protocol)。MTA所使用的软件有sendmail,postfix,Exchange。
MTA的功能:
(1)接收邮件:
MTA会将来自客户端或是其它MTA的邮件收下来。这个时候MTA用的是SMTP协议,端口号为25.
(2)转发邮件
如果该封邮件的目的地并不是本身的用户,且该封邮件的相关数据符合使用MTA的权力,那么MTA就会将该封邮件再转发到下一台主机上。这是中继转发(Relay)的功能。
MDA:(Mail Delivery Agent,邮件投递代理)
实际上MDA是挂在MTA下面的一个小程序,最主要的功能是:分析由MTA所收到的邮件表头或内容等数据,来决定这封邮件的去向。MDA分析之后发现这封邮件的目标是MTA,那么MDA会将这封邮件放到用户的邮箱(Mailbox)中;如果不是,就准备转发出去。MDA还有分析与过滤邮件的功能:
(1)过滤垃圾邮件
(2)自动回复
不过各主要的MTA程序都有自己的MDA功能。
常用的MDA有:ProcMail(postfix默认的邮件投递工具)、MailDrop(相对比较专业的投递代理工具)。
Mailbox
电子信箱,就是某个账号专用的邮件收取文件。linux里面默认的系统邮箱是放在/var/spool/mail/用户账号中的。
通过本地的MUA将邮件发送到对方邮箱中的过程:
一、本地端的MUA想要使用MTA来发送邮件时,首先必须得取得MTA的权限。换言之,就是我们需要向MTA注册一个邮箱账号。
二、(1) 用户在MUA上编写完邮件后,发送至MTA上,邮件的数据主要有邮件标题和邮件内容,当你按下发送键后,你的这封邮件就会被放置到MTA的队列当中并等待发送。
(2) 如果该封邮件的目标是本地端MTA自己的账号,那么MDA会将这封信送到相应用户的Mailbox去。
(3) 如果该封邮件的目标是其它目标MTA,则开始中继转发的流程。首先,MTA会先判断该封包是否具有合法性,若具有权限时,则MDA会开始进行邮件转发,也就是该封邮件会通过我们的MTA向下一台MTA的SMTP(port 25)发送出去。如果该封邮件顺利地发出去了,那么就在队列中删除这封邮件。
三、远程的MTA会收到我们的MTA所发出的那封信,并将该邮件放置到正确的邮箱当中,等待用户来读取或者下载。
注意:这封邮件是留在对方的MTA上,而不是MUA上。
用户收信的过程:
MRA(Mail Retrieval Agent,邮件检索代理)
用户可以通过MRA服务器提供的POP(Post Office Protocol,邮政服务协议)来接收自己的邮件,也可以通过IMAP ( Intenet Message Access Protocol,交互式数据消息访问协议)协议将自己的邮件保留在邮件主机上面,并进一步进行建立邮件数据文件夹等高级工作。
使用POP3协议接收邮件:
(1)MUA通过POP3的协议连接到MRA的port110,并且输入账号与密码来取得正确的认证与授权。
(2)MRA确认该用户的账号和密码没有问题后,会前往该用户的Mailbox取得用户的邮件并发送到用户的MUA软件上。
(3)当所有的邮件传送完毕后,用户的Mailbox内的数据将会被删除。
由于使用POP3协议会将已经接收到的邮件删除,因此,出现了IMAP(端口号143),这个协议可以让你将mailbox的数据存储到你主机上的用户主目录内,即客户端收取邮件后邮件依旧保留在服务器上。
常用的MRA:dovecot是一个开源的支持IMAP和POP3协议的邮件服务器(自带SASL功能)。
SMTP、POP3、IMAP这三种通信协议全部都是明文传输,尤其是在POP3和IMAP这两个通信协议中,用户必须要输入账号和密码才能收发邮件。所以就有了POP3s,IMAPs通信协议的出现,他们是通过ssl加密实现的。那么有没有SMTPs呢?有,但是没人用。原因如下:
由于POP3、IMAP只与MRA和自己的用户有关,因此只要设定好用户和服务器使用的MRA协议一致即可,并不会影响到其他的服务器。但是MTA就不同了,因为MTA必须与其他的MTA沟通,因此,若你使用了SMTPs,那么全世界要与你的MTA沟通,就全部需要改变为SMTPs通信协议才行,那么这是目前没有办法实现的。
当然,如果是特殊情况,你也可以将自己的数据加密后,再由MTA转交即可。
Relay与认证机制的重要性
当需要MTA帮你将邮件转发到下一台MTA去时,这个操作就成为邮件中继转发(Relay)。当所有人都可以通过这一台MTA帮忙进行Relay时,这个情况称之为Open Relay的操作。当MTA发生Open Relay且该MTA是连上因特网的,很可能会产生如下问题:
(1)你主机所在网络正常使用的连接速度将会变慢,因为网络带宽都被广告、垃圾邮件耗光了。
(2)你的主机可能由于大量发送邮件导致主机资源被耗尽,容易产生宕机之类的问题。
(3)你的MTA将会被因特网社会定义为“黑名单”,从此很多正常的邮件就会无法收发。
所以,目前所有的distributions几乎都将MTA默认启动为仅监听内部循环接口,而且也将Open Relay的功能取消了。所以你要使用MTA的转发功能时,必须要取得合法使用这个MTA的权限。通常设置Relay的方法有以下几种:
(1)规定某一个特定客户端的IP或网段可使用Relay。
(2)若客户端的IP不固定可以利用认证机制来处理
(3)将MUA搭建在MTA上面,例如OpenWebMail之类的Web接口的MUA功能。
认证机制上面常见的有SMTP邮件认证机制,以及SMTP after POP两种,不论是哪一种机制,基本上都是通过让用户输入认证用的账号与密码,来确定他有合法使用该MTA的权限,然后针对通过认证的用户开启relay的支持就可以了。
电子邮件的数据内容:
E-mail的标题部分包括:发件人的账号、是由哪个MTA转发、要发给谁,转给哪个MTA、主题等。
邮件收发过程图:
邮件服务器的搭建:
rhel7默认就提供postfix,它主要的配置文件在/etc/postfix/里面。
/etc/postfix/main.cf 主要的postfix配置文件,几乎所有的设置参数都是在这文件内规范的。修改过该文件,需要重新启动postfix。
/etc/postfix/master.cf 主要规定了postfix每个程序的工作参数,这个文件默认已经好了,通常不需要更改。
/etc/postfix/access(利用postmap处理)可以设置开放Relay或拒绝连接的来源或目标地址等信息的外部配置文件,不过该文件在/etc/postfix/main.cf启动之后才生效,而且设置完毕后需要以postmap来处理成为数据库文件。
/etc/aliases(利用postalias或newaliases均可)作为邮件别名的用途,也可以作为邮件组的设置。
/usr/sbin/postconf 这个命令可以列出你的postfix的详细设置数据,包括系统参数值,数据量比较多。如果你只想要查看修改过的某些默认参数和非默认值的数据,可以使用postconf -n。
/usr/sbin/postfix 这是postfix的主要执行文件,可以使用这个命令来启动或重新读取配置文件。
postfix check 检查postfix相关的文件、权限等是否正确
postfix start/stop/reload
postfix flush 强制将目前正在邮件队列的邮件寄出
/etc/sbin/postalias 设置别名数据库的命令,因为MTA读取数据库格式的文件效率较好,所以要将ASCII格式的文件重建为数据库。在postfix中,这个命令主要用于转换/etc/aliases成为数据库文件。postaliases hash:/etc/aliases(hash为一种数据库格式,然后/etc/aliases就会自动被更新)
/usr/sbin/postcat主要用于检查放在队列当中的邮件内容。由于队列当中的邮件内容是给MTA看的,所以格式并不是我们一般看得懂的文字数据。
/usr/sbin/postmap这个命令用法和postaliases类似,它的作用在转换/etc/postfix/access文件的数据库.
/usr/sbin/postqueue类似mailq的输出结果,例如postqueue -p
设置主配置文件的要求:
“#”符号是注释;
每一行第一个字符不可以是空白符,设置的方法“参数 = 设置值”等号两边要有空格符;
可以使用“$”来引用变量值,例如myorigin = $myhostname;
如果该参数支持两个以上的数据,则使用空格符或逗号来分隔;
可使用多行表示同一个设置值,只要在第一行有逗号,且第二行开头为空格符,即可将数据延伸到第二行继续写;
若重复设置某一项目,则以较晚出现的设置值为准。
要使postfix可以收发邮件,需要启动以下参数:
myhostname:主机名,需使用FQDN。因为你的mydomain的设置项目默认会取$myhostname第一个小数点之后的名称。
myorigin:发信时所显示的“发信源主机”,也就是代表本MTA传出去的邮件将以此设置值为准。
inet_interfaces:设置postfix的监听接口,默认情况下你的postfix只会监听本机接口lo(127.0.0.1),如果开放全部的接口可写为all。
inet_protocol:设置postfix监听IP协议,如果想监听ipv4地址可写inet_protocols = ipv4
mydestination:设置能够收信的主机名,也就是说别人给你发邮件应该写成什么主机名。如果DNS里的设置有MX标志的话,最好将那个主机名写在mydestination内,否则很容易出现错误信息。
mynetworks:规定信任的客户端。
relay_domains:规范可以帮忙relay的下一台MTA主机地址,在默认情况下,这个设置值是$mydestination。
日志文件:/var/log/maillog
实验一:域内互相发送邮件
邮件服务器的地址为192.168.9.131
关闭防火墙和selinux
编辑主配置文件:
[root@localhost ~]# vim /etc/postfix/main.cf
编辑主机名
配置域名
指定发送邮件时所显示的域名
指定监听接口,注释掉116行
指定别人给你发邮件应该写什么主机名
指定信任的客户端
指定可以帮忙转发的MTA主机
重启服务
[root@localhost ~]# systemctl restart postfix
(一)用邮件服务器收发邮件
1.直接登录邮件服务器收发邮件,使用邮件服务器的root用户给redhat用户发邮件
用root用户给redhat发送邮件,切换到redhat用户并查看。(这里发送邮件退出用Ctrl+d)
2.直接登录邮件服务器群发邮件
使workgroup组中的用户都可以收到邮件
[root@localhost ~]# vim /etc/aliases
workgroup: xiaoming,redhat
[root@localhost ~]# postalias /etc/aliases
[root@localhost ~]# useradd xiaohong
[root@localhost ~]# useradd xiaoming
[root@localhost ~]# mail workgroup
分别切换几个用户查看邮件,我们可以看到只有workgroup组的用户xiaoming和redhat收到,而xiaohong没有收到
(二)使用MUA收发邮件
MUA使用SMTP、IMAP或POP3协议与服务器通信。MUA发送邮件使用的是SMTP协议,也就是MUA与MTA进行通信。MUA收邮件时使用的是IMAP或POP3协议与MRA进行通信。启动POP3和IMAP需要安装dovecot这个软件。
[root@localhost ~]# yum install dovecot -y
配置dovecot的主配置文件
[root@localhost ~]# vim /etc/dovecot/dovecot.conf
设置协议:
设置允许登录的IP网段
[root@localhost ~]# vim /etc/dovecot/conf.d/10-mail.conf
用户邮件所在地址
使用MUA收发邮件需要登录到邮件服务器,所以服务端需开启sasl认证(Simple Authentication and Security Layer)。sasl是一种用来扩充C/S模式验证能力的机制。在postfix中可以利用SASL来判断用户是否有权使用转发服务,或是辨认谁在使用你的服务器。sasl模块的软件包cyrus-sasl
[root@localhost ~]# vim /etc/postfix/main.cf
追加如下内容
broken_sasl_auth_clients = yes //启用sasl对客户端进行认证
smtpd_sasl_auth_enable = yes //启用sasl认证
smtpd_sasl_security_options = noanonymous //禁用匿名用户
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination //定义收件人限定
重启服务
[root@localhost ~]# systemctl restart postfix
[root@localhost ~]# systemctl restart dovecot
[root@localhost ~]# systemctl restart saslauthd
使用foxmail登录
第一步我们先手动创建一个redhat账户并登录(这里如果不能登录,请以管理员身份登录),
其次我们再手动创建一个xiaoming用户
如果使用MUA无法成功发送邮件,请查看inet_interfaces选项
[root@localhost ~]# chmod 0600 /var/mail/* //修改权限
如果不执行上面这个命令,可能会出现在系统中可以收到邮件,但是客户端无法收到邮。
然后我们在邮件服务器上发送消息客户端可以收到消息
实验二:域间互相发送邮件
实验环境:两台虚拟机地址分别为192.168.9.131和192.168.9.132
192.168.9.131的主机无需配置
192.168.9.132的主机配置如下:
[root@localhost ~]# yum install dovecot -y
[root@localhost ~]# yum install cyrus-sasl* -y
将sasl的安装包都安装上,否则会出现:【错误信息:远程主机强迫关闭了一个现有的连接。】
[root@localhost ~]# vim /etc/postfix/main.cf
76 myhostname = mail.ceshi.com
83 mydomain = ceshi.com
99 myorigin = $mydomain
113 inet_interfaces = all(注释116行)
164 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
264 mynetworks = 192.168.9.0/24
296 relay_domains = $mydestination
开启SASL认证
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
[root@localhost ~]# vim /etc/dovecot/dovecot.conf
24 protocols = imap pop3 lmtp
48 login_trusted_networks = 192.168.9.0/24
[root@localhost ~]# vim /etc/dovecot/conf.d/10-mail.conf
25 mail_location = mbox:~/mail:INBOX=/var/mail/%u
重启服务
[root@localhost ~]# systemctl restart postfix
[root@localhost ~]# systemctl restart dovecot
[root@localhost ~]# systemctl restart saslauthd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# chmod 0600 /var/mail/*
配置DNS服务器(将192.168.9.131当做DNS服务器)
[root@localhost ~]# yum install bind -y
[root@localhost ~]# vim /etc/named.conf
[root@localhost ~]# vim /var/named/zone.example.com
[root@localhost ~]# vim /var/named/zone.ceshi.com
[root@localhost ~]# systemctl restart named
修改两台虚拟机的DNS服务器的ip地址为自己搭建的DNS服务器地址
[root@localhost ~]# vim /etc/resolv.conf
我们在ceshi.com的主机上创建两个用户xixi和haha
使用foxmail登录,并验证域间能否正常收发邮件,通过验证域内发送邮件正常,域间可正常发送接收。
实验三:虚拟别名域
[root@localhost ~]# vim /etc/postfix/main.cf
在两个域的主配置文件中添加如下两行
virtual_alias_domains = group.com,work.com //该参数指定虚拟别名域的名称
virtual_alias_maps = hash:/etc/postfix/virtual //该参数用来指定含有虚拟别名域定义的文件路径
在example.com域的虚拟机上做如下操作:
[root@localhost ~]# vim /etc/postfix/virtual
添加如下内容
@group.com @example.com //表示将发送给虚拟域group.com的邮件实际投递到真实的本地域example.com
@work.com @ceshi.com
admin@group.com redhat,xiaoming,xixi@ceshi.com
//如果是本域用户不需要加后缀,即redhat和xiaoming都是example.com域的用户;这条相当于群发发给admin@group .com的邮件会转发给redhat,xiaoming和xixi
123@work.com xiaoming,haha@ceshi.com
[root@localhost ~]# postmap /etc/postfix/virtual
[root@localhost ~]# systemctl reload postfix
在ceshi.com域上做如下设置:
[root@localhost ~]# vim /etc/postfix/virtual
添加如下内容
@group.com @example.com
@work.com @ceshi.com
admin@group.com redhat@example.com,xiaoming@example.com,xixi
123@work.com xiaoming@group.com,haha
[root@localhost ~]# postmap /etc/postfix/virtual
[root@localhost ~]# systemctl reload postfix