• 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
    
  • 相关阅读:
    cocos2d3.8.1 使用prebuild提升发布android速度
    AS3条件编译
    Box2d FilterData
    旋转关节(Revolute Joint)
    线关节(Line Joint)
    平移关节(Prismatic Joint)
    滑轮关节(b2PulleyJoint)
    PAT Basic 1043 输出PATest (20 分)
    PAT Basic 1042 字符统计 (20 分)
    PAT Basic 1039 到底买不买 (20 分)
  • 原文地址:https://www.cnblogs.com/wangzengyi/p/12551520.html
Copyright © 2020-2023  润新知