linux postfix部署邮箱服务

爷,独闯天下 提交于 2020-03-23 13:28:22

一. 邮箱部署前的知识

1. Mail Server与DNS关系

  • Mail Server 与MX和A的作用
    发送邮件的时候,目的地址使用“账号@域名”的方式发送邮件,因此必须通过DNS解析出来@后边的域名,然后才能投递到对方的邮件服务器。
    MX 代表的是 Mail eXchanger, 当一封邮件要传送出去时,邮件主机会先分析那封邮件的“目标域名的 DNS ”,先取得 MX 标志 (注意,MX 标志可能会有多部主机) 然后以最优先 MX 解析为目的将邮件发送出去,如果所有MX解析的目的接收邮件失败,则尝试使用A解析为目的发送邮件,所有都失败才提示邮件退回。
  • Mail Server与DNS反解的作用
    当邮件服务器收到邮件的时候,首先会对源IP进行反解,如果反解解析不出来注册域名,则列入垃圾邮件。

2. 邮件传输所需要的组件

  • MTA 即Mail Transfer Agent,是发送和转递邮件的服务器,发送和转递使用SMTP协议。
  • MRA 即Mail Retrieval Agent,是接收邮件的服务器,接收邮件使用的协议POP3或者IMAP。
  • MDA 即Mail Delivery Agent, MDA 是挂在 MTA 底下的一个小程序,分析由 MTA 所收到的信件表头或内容等数据,过滤垃圾邮件,实现自动回复。
  • Mail Box 就是某个账号专用的信件收受的文件,Linux 系统默认的信箱都是放在 /var/spool/mail/使用者账号 中。
  • MUA 即Mail User Agent,你可以登录到邮件服务器去直接发送邮件,也可以使用MUA去发送接收邮件,常见的MUA有Outlook、Foxmail等。

3. Relay 与认证机制的重要性

当你的 MTA 由于设定不良的关系导致具有 Open Relay 的状况,加上你的 MTA 确实是连上因特网时, 由于因特网上面用 port scan 软件的闲人太多,你的 MTA 具有 Open Relay 的功能这件事情, 将会在短时间内就被很多人察觉,此时那些不法的广告信、色情垃圾信业者将会利用你的这部 Open Relay MTA 发送他们的广告,所以应该关闭open relay功能,授权开放relay功能:

  • 规定某一个特定客户端的 IP 或网段,例如规定内部 LAN 的 192.168.1.0/24 可使用 Relay;
  • 若客户端的 IP 不固定时 (例如拨接取得的非固定 IP) 可以利用认证机制来处理。
  • 将 MUA 架设在 MTA 上面,例如 OpenWebMail 之类的 web 接口的 MUA 功能。

二. PostFix基础设定MTA服务器

1. PostFix软件结构介绍

  • /etc/postfix/main.cf
    这就是主要的 postfix 配置文件,几乎所有的设定参数都是在这个档案内规范的! 这个档案预设就是一个完整的说明档了,你可以参考这个档案的内容就设定好属于你的 postfix MTA ! 只要修改过这个档案,记得要重新启动 postfix !
  • /etc/postfix/master.cf 了解即可不需配置
    主要规定了 postfix 每个程序的运作参数,也是很重要的一个配置文件。不过这个档案预设已经很 OK 了,通常不需要更改他。
  • /etc/postfix/access(利用 postmap 处理)
    可以设定开放 Relay 或拒绝联机的来源或目标地址等信息的外部配置文件,不过这个档案要生效还需要在 /etc/postfix/main.cf 启动这个档案的用途才行。且设定完毕后需要以 postmap 来处理成为数据库档案呢!
  • /etc/aliases(利用 postalias 或 newaliases 均可)
    做为邮件别名的用途,也可以作为邮件群组的设定!
  • /usr/sbin/postconf(查阅 postfix 的设定数据)
    这个指令可以列出目前你的 postfix 的详细设定数据,包括系统默认值也会被列出来, 所以数据量相当的庞大!如果你在 main.cf 里面曾经修改过某些预设参数的话,想要仅列出非默认值的设定数据, 则可以使用『postconf -n』这个选项即可。
  • /usr/sbin/postfix (主要的 daemon 指令)
    [root@www ~]# postfix check <==检查 postfix 相关的档案、权限等是否正确!
    [root@www ~]# postfix start <==开始 postfix 的执行
    [root@www ~]# postfix stop <==关闭 postfix
    [root@www ~]# postfix flush <==强制将目前正在邮件队列的邮件寄出!
    [root@www ~]# postfix reload <==重新读入配置文件,也就是 /etc/postfix/main.cf
  • /usr/sbin/postalias
    设定别名数据库的指令,因为 MTA 读取数据库格式的档案效能较佳,所以我们都会将 ASCII 格式的档案重建为数据库。 在 postfix 当中,这个指令主要在转换 /etc/aliases 成为 /etc/aliases.db 啰!用法为:
    [root@www ~]# postalias hash:/etc/aliases
    hash 为一种数据库的格式,然后那个 /etc/aliases.db 就会自动被更新
  • /usr/sbin/postcat
    主要用在检查放在 queue (队列) 当中的信件内容。由于队列当中的信件内容是给 MTA 看的, 所以格式并不是一般我们人类看的懂的文字数据。所以这个时候你得要用 postcat 才可以看出该信件的内容。 在 /var/spool/postfix 内有相当多的目录,假设内有一个文件名为 /deferred/abcfile , 那你可以利用底下的方式来查询该档案的内容
    [root@www ~]# postcat /var/spool/postfix/deferred/abcfile
  • /usr/sbin/postmap
    这个指令的用法与 postalias 类似,不过他主要在转换 access 这个档案的数据库
    [root@www ~]# postmap hash:/etc/postfix/access
  • /usr/sbin/postqueue
    类似 mailq 的输出结果,例如你可以输入『postqueue -p』看看就知道了。

2. PostFix主配置文件使用语法

  • 『 # 』符号是批注的意思;
  • 所有设定值以类似『变量』的设定方法来处理,例如 myhostname = www.centos.jet,请注意等号的两边要给予空格符, 且第一个字符不可以是空白,亦即『my..』要由行首写起;
  • 可以使用『 $ 』来延伸使用变量设定,例如 myorigin = $myhostname,会等于 myorigin = www.centos.jet;
  • 如果该变量支持两个以上的数据,则使用空格符来分隔,不过建议使用逗号加空格符『, 』来处理。 例如: mydestination = $myhostname, $mydomain, linux.centos.jet,意指 mydestination 支持三个数据内容之意。
  • 可使用多行来表示同一个设定值,只要在第一行最后有逗号,且第二行开头为空格符, 即可将数据延伸到第二行继续书写 (所以刚刚第二点才说,开头不能留白!);
  • 若重复设定某一项目,则以较晚出现的设定值为准!

3. 让 Postfix 作为MTA的配置介绍

  • myhostname:设定主机名,需使用 FQDN 喔
    这个项目在于设定你的主机名,且这个设定值会被后续很多其他的参数所引用,所以必须要设定正确才行。 你应该要设定成为完整的主机名。在这个练习当中,应该设定为: myhostname = www.centos.jet 才对。 除了这个设定值之外,还有一个 mydomain 的设定项目,这个项目默认会取 $myhostname 第一个『.』之后的名称。 举例来说上头设定完毕后,预设的 mydomain 就是 centos.jet !你也可以自行设定他。

  • myorigin :发信时所显示的『发信源主机』项目
    这个项目在设定『邮件头上面的 mail from 的那个地址』, 也就是代表本 MTA 传出去的信件将以此设定值为准!如果你在本机寄信时忘记加上 Mail from 字样的话, 那么就以此值为准了。默认这个项目以 $myhostname 为主的,例如: myorigin = $myhostname

  • inet_interfaces :设定 postfix 的监听接口 (极重要)
    在预设的情况下你的 Postfix 只会监听本机接口的 lo (127.0.0.1) 而已,如果你想要监听整个 Internet 的话, 请开放成为对外的接口,或者是开放给全部的接口,常见的设定方法为: inet_interfaces = all 才对! 由于如果有重复设定项目时,会以最晚出现的设定值为准,所以最好只保留一组 inet_interfaces 的设定!

  • inet_protocols :设定 postfix 的监听 IP 协议
    预设 CentOS 的 postfix 会去同时监听 IPv4, IPv6 两个版本的 IP,如果你的网络环境里面仅有 IPv4 时,那可以直接指定 inet_protocols = ipv4 就会避免看到 :::1 之类的 IP 出现呦!

  • mydestination :设定『能够收信的主机名』 (极重要)

    • 这个设定项目很重要!因为我们的主机有非常多的名字,那么对方填写的 mail to 到底要写哪个主机名字我们才能将该信件收下? 就是在这里规范的!也就是说,你的许多主机名当中,仅有写入这个设定值的名称才能作为 email 的主机地址。所以写法为: mydestination = $myhostname,$mydomain
    • 如果你想要将此设定值移动到外部档案,那可以使用类似底下的作法: mydestination = /etc/postfix/local-host-names ,然后在 local-host-names 里面将可收信的主机名写入即可。一般来说,不建议你额外建立 local-host-names 这个档案啦, 直接写入 main.cf 即可说!特别留意的是,如果你的 DNS 里头的设定有 MX 标志的话,那么请将 MX 指向的那个主机名一定要写在这个 mydestination 内, 否则很容易出现错误讯息喔!一般来说,使用者最常发生错误的地方就在这个设定里头呢!
  • mynetworks_style :设定『信任网段』的一项指标
    这个设定值在规定『与主机在同一个网段的可信任客户端』的意思!保持默认,因为咱们可以从mynetworks设置。

  • mynetworks :规定信任的客户端 (极重要)
    你的 MTA 能不能帮忙进行 Relay 与这个设定值最有关系!举例来说,我要开放本机与内部网域的 IP 时,就可以这样进行设定: mynetworks = 127.0.0.0/8, 192.168.100.0/24。如果你想要以 /etc/postfix/access 这个档案来控制 relay 的用户时,建议你将上述的数据改写成这样: mynetworks = 127.0.0.0/8, 192.168.100.0/24, hash:/etc/postfix/access 然后你只要再建立 access 之后重整成数据库后,嘿嘿!就能够设定 Relay 的用户!

  • relay_domains :规范可以帮忙 relay 的下一部 MTA 主机地址

    • 相对于 mynetworks 是针对『信任的客户端』而设定的,这个 relay_domains 则可以视为『针对下游 MTA 服务器』而设定的。举例来说,如果你这部主机是 www.niki.centos.jet 的 MX 主机时, 那你就得要在 relay_domains 设定针对整个 niki.centos.jet 这个领域的目标信件进行转递才行。 在预设的情况下,这个设定值是 $mydestination 。
    • 你必需要注意的『Postfix 预设并不会转递 MX 主机的信件』,意思就是说:如果你有两部主机,一部是上游的 MTAup ,一部是下游的 MTAdown ,而 MTAdown 规范的 MX 主机是 MTAup,由于 DNS 的 MX 设定值与信件传递方向,我们知道任何想要寄给 MTAdown 主机的信件, 都会先经过 MTAup 来转递才行!此时如果那部 MTAup 没有开启帮 MTAdown 进行 relay 的权限时, 那么任何传给 MTAdown 的信件将『全部都被 MTAup 所退回』!从此 MTAdown 就无法收到任何信件了。
    • 上一段的说明请您特别再想一想,因为如果你在大公司服务而且你的公司上、下游均有 mail server 时, 并且也有设定 MX 的状况下,嘿嘿!这个 relay_domains 就很重要啦!上游的 MTA 主机必需要启动这个设定。 一般来说除非你是某部 MTA 主机的 MX 源头,否则这个设定项目可以忽略不设定他。 而如果你想要帮你的客户端转递信件到某部特定的 MTA 主机时,这个设定项目也是可以设定的。 默认请您保留默认值即可。
  • alias_maps :设定邮件别名
    就是设定邮件别名的设定项目,只要指定到正确的档案去即可,这个设定值可以保留默认值。

4. MTA收到一份信的动作

5. 作为MTA配置过程举例

#配置前请确保iptables规则配置妥当,selinux已经关闭,如果是centos7,firewall也要关闭。
iptables -A INPUT -p TCP -i $EXTIF --dport  25  --sport 1024:65534 -j ACCEPT

[root@www ~]# vim /etc/postfix/main.cf
myhostname = www.centos.jet 
myorigin = $myhostname 
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname,$mydomain
mynetworks = 127.0.0.0/8, 192.168.100.0/24, hash:/etc/postfix/access
relay_domains = $mydestination
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# 其他的设定值就先保留默认值即可!

# 生成别名数据库文件
[root@www ~]# postmap hash:/etc/postfix/access
[root@www ~]# postalias hash:/etc/aliases
# 检查配置文件的语法是否有错误
[root@www ~]# /etc/init.d/postfix check   <==没有信息输出,表示没有问题。

# 启动与观察 port number
[root@www ~]# /etc/init.d/postfix restart

假设要增加MTA的过滤机制

[root@www ~]# vim /etc/postfix/access
10.1.30.50		OK
.edu.com			OK
av.com			REJECT
192.168.2.  		REJECT
# OK 表示可接受,而 REJECT 则表示拒绝。

[root@www ~]# postmap hash:/etc/postfix/access
[root@www ~]# ls -l /etc/postfix/access*
#不必重新启动 postfix,只要重新生成数据库文件即可生效。

关于别名的配置(root权限配置)

#作用是将发给这些系统账号的邮件发一份给root。
[root@www ~]# vim /etc/aliases
mailer-daemon:  postmaster
postmaster:     root
bin:            root
daemon:         root
#左边是系统账号,也是别名设置位置,右边是root账号,也是实际接收邮件的账号。
#假如你的 MTA 内有一个实际的账号名称为 dmtsai ,这个使用者还想要使用 dermintsai 这个名称来收他的信件, 那么你可以这样做:
[root@www ~]# vim /etc/aliases
dermintsai:     dmtsai
# 左边是你额外所设定的,右边则是实际接收这封信的账号!

[root@www ~]# postalias hash:/etc/aliases
# 信件会传给 root 与 dmtsai 这两个账号!
[root@www ~]# vim /etc/aliases
root:		root,dmtsai  
[root@www ~]# postalias hash:/etc/aliases
#创建邮件组
[root@www ~]# vim /etc/aliases
student2011:	std001,std002,std003,std004...
[root@www ~]# postalias hash:/etc/aliases
#邮件别名除了填写自己主机上面的实体用户之外,其实你可以填写外部主机的 email !
# 例如你要将本机的 dermintsai 那个不存在的用户的信件除了传给 dmtsai 之外,还要外传到 dmtsai@mail.niki.centos.jet 时,可以这样做:
[root@www ~]# vim /etc/aliases
dermintasi:	dmtsai,dmtsai@mail.niki.centos.jet
[root@www ~]# postalias hash:/etc/aliases

个人化的邮件转递(普通用户): ~/.forward

#普通用户将自己的邮件同时收一份到jet和dmtsai@mail.niki.centos.jet下。
[dmtsai@www ~]$ vim .forward
# 注意!我现在的身份现在是 dmtsai 这个一般身份,而且在他的家目录下!
dmtsai
jet
dmtsai@mail.niki.centos.jet
[dmtsai@www ~]$ chmod 644 .forward
#该档案所在用户家目录权限,其 group、other 不可以有写入权限。
#.forward 档案权限,其 group、other 不可以有写入权限。

6. MTA的维护命令

[root@www ~]# postqueue -p   #查看MTA邮件队列
[root@www ~]# cd /var/spool/postfix/maildrop 
[root@www maildrop]# postcat 5CFBB21DB  <==这个档名就是 Queue ID
[root@www ~]# /etc/init.d/postfix restart
[root@www ~]# postfix flush

三. PostFix MRA服务器设定

1. 未加密的MRA设定

[root@www ~]# yum install dovecot
[root@www ~]# vim /etc/dovecot/dovecot.conf
# 找到底下这一行,大约是在第 25 行左右的地方,复制新增一行内容如下:
#protocols = imap pop3 lmtp
protocols = imap pop3
[root@www ~]# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = no   <==将第 6 行改成这样!
[root@www ~]# /etc/init.d/dovecot start
[root@www ~]# chkconfig dovecot on
[root@www ~]# netstat -tlnp | grep dovecot
Proto Recv-Q Send-Q Local Address   Foreign Address   State    PID/Program name
tcp        0      0 :::110          :::*              LISTEN   14343/dovecot
tcp        0      0 :::143          :::*              LISTEN   14343/dovecot

2. 加密的MRA设定

# 1. 建立凭证:到系统提供的 /etc/pki/tls/certs/ 目录下建立所需要的 pem 凭证档:
[root@www ~]# cd /etc/pki/tls/certs/
[root@www certs]# make vbirddovecot.pem
....(前面省略)....
Country Name (2 letter code) [XX]:China
State or Province Name (full name) []:China
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:test
Organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your server's hostname) []:mail.centos.jet
Email Address []:wang_zengyi@126.com

# 2. 因为担心 SELinux 的问题,所以请关闭selinux,并配置iptables规则
iptables -A INPUT -p TCP -i $EXTIF --dport 993  --sport 1024:65534 -j ACCEPT
iptables -A INPUT -p TCP -i $EXTIF --dport 995  --sport 1024:65534 -j ACCEPT

# 3. 开始处理 dovecot.conf,只要 pop3s, imaps 不要明码传输的咯!
[root@www certs]# vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes  <==第 9 行改成这样!取消批注!
[root@www certs]# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = required                                <==第 6 行改成这样
ssl_cert = </etc/pki/dovecot/vbirddovecot.pem <==12, 13 行变这样
ssl_key =  </etc/pki/dovecot/vbirddovecot.pem

[root@www certs]# vim /etc/dovecot/conf.d/10-master.conf
  inet_listener imap {
    port = 0     <== 15 行改成这样
  }
  inet_listener pop3 {
    port = 0     <== 36 行改成这样
  }

# 4. 处理额外的 mail_location 设定值!很重要!否则网络收信会失败:
[root@www certs]# vim /etc/dovecot/conf.d/10-mail.conf
mail_location = mbox:~/mail:INBOX=/var/mail/%u <==第 30 行改这样

# 5. 重新启动 dovecot 并且观察 port 的变化:
[root@www certs]# /etc/init.d/dovecot restart
[root@www certs]# netstat -tlnp | grep dovecot
Proto Recv-Q Send-Q Local Address  Foreign Address   State    PID/Program name
tcp        0      0 :::993         :::*              LISTEN   14527/dovecot
tcp        0      0 :::995         :::*              LISTEN   14527/dovecot
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!