linux postfix部署邮箱服务
一. 邮箱部署前的知识
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 :设定邮件别名
就是设定邮件别名的设定项目,只要指定到正确的档案去即可,这个设定值可以保留默认值。 -
message_size_limit
message_size_limit = 40000000 #设置单份邮件40MB -
mailbox_size_limit
mailbox_size_limit = 1000000000 #设置单用户占用邮箱1GB
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
home_mailbox = Maildir/ #设置用户邮箱目录
# 其他的设定值就先保留默认值即可!
# 生成别名数据库文件
[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 jet.pem
....(前面省略)....
Country Name (2 letter code) [XX]:CH
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]# cp -a jet.pem /etc/pki/dovecot/jet.pem
[root@www certs]# vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
[root@www certs]# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert = </etc/pki/dovecot/jet.pem
ssl_key = </etc/pki/dovecot/jet.pem
[root@www certs]# vim /etc/dovecot/conf.d/10-master.conf
inet_listener imap {
port = 0
}
inet_listener pop3 {
port = 0
}
# 4. 处理额外的 mail_location 设定值!很重要!否则网络收信会失败:
[root@www certs]# vim /etc/dovecot/conf.d/10-mail.conf
#mail_location = mbox:~/mail:INBOX=/var/mail/%u
mail_location = maildir:~/Maildir
# 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