一、基础知识:
   mail使用的协议是:
        smtp(sample mail transform protocol)<port:25>
        pop3(post office protocol)<port:110>
        smtps <port:465/tcp>
        pop3s <port:995/tcp>
        imap4 <port:143/tcp>
        imaps <port:993/tcp>
   MTA:mail transfer agent 邮件传输代理
    常用软件:
     Exchange(微软)
     Sendmail 开源的软件 目前有50%的邮件服务器使用这个软件
     Postfix  现在用的挺多
     Qmail    昙花一现
     Exim(英国剑桥大学开发的)
   MRA:mail retravial agent 邮件检索代理
    常见软件:
     courier-imap:pop3,imap4,imaps,pop3s (俄罗斯开发)
     dovecot
   MDA:mail delivery agent 邮件投递代理
    常见软件:
     procmail
     maildrop
   MUA:mail user agent 邮件用户代理
     outlook express
     Foxmail
     pine(linux)
     mutt(linux,经常用到的)
   MSA:邮件提交代理
  
   SASL:simple authenticaion security layer提供认证机制
  
   邮件服务器会拒绝无法进行正反方向解析的地址,所以配置邮件服务器的时候,
   要首先配置好DNS服务器
二、邮件服务器的安装和配置:
   修改主机名:
   #hostname mail.luowei.com
   #vi /etc/sysconfig/network
   把里面的HOSTNAME修改为mail.luowei.com
   本实验只要是采用postfix来实验,由于Sendmail默认的情况下是启用的,我这里先
   关闭Sendmail,最好是卸载了sendmail
   # service sendmail stop
   # rpm -e sendmail --nodeps
   由于本地配置好了yum源,就直接yum安装了
   # yum install postfix
   启动postfix服务
   # service postfix start
   这时可以使用
   #postconf -d 查看/etc/postfix/main.cf的默认配置
   #postconf -a 查看支持sasl的机制
   #postconf -n 查看修改后的配置文件
   但是这个时候还不能发送邮件,在你发送邮件的时候会出现如下的提示:
   #telnet 192.168.1.103 25      (192.168.1.103是我的邮件服务器的IP地址)
   telnet: connect to address 192.168.1.103: Connection refused
   telnet: Unable to connect to remote host: Connection refused
这个时候需要修改一下/etc/postfix/main.cf文件
myhostname = mail.luowei.com
mydomain = luowei.com
myorigin = $mydomain
inet_interfaces = all
mydestination  = $myhostname, localhost.$mydomain, localhost, $mydomain,
        mail.$mydomain
这样就能实现同一台主机之间的邮件传递了,但是如果我们还要向其他域的用户发邮件
这样就不行了,这就要配置DNS服务器了,需要开启DNS的转发功能,指向对方的域
接线来是就是实现不同域之间的发邮件了:
首先是DNS的配置:
#yum install bind
#vim /etc/named.conf 添加如下内容
      options {
        directory "/var/named";
      };
      zone "." IN {
        type hint;
        file "named.ca";
       };
      zone "localhost" IN {
        type master;
        file "localhost.zone";
       };
       zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.local";
        };
       zone "luowei.com" IN {
        type master;
        file "luowei.com.zone";
        };
        zone "1.168.192.in-addr.arpa" IN {
        type master;
        file "192.168.zone";
        };
        zone "a.org" IN {
        type forward;
        forwarders { 172.16.100.1; };//添加到指定域的地址
        };
#chown :named /etc/named.conf
然后到/var/named/下创建对应的区域文件
#dig -t NS . @a.root-servers.net > named.ca (在能连上网的基础上,创建根区域)
创建localhost.zone、named.local、luowei.com.zone、192.168.zone几个文件
#vim localhost.zone 添加如下内容
$TTL 86400
@       600     IN      SOA     localhost.      admin.localhost. (
                                        2011082001
                                        1H
                                        10M
                                        7D
                                         1D )
                       IN      NS      localhost.
localhost.      IN      A       127.0.0.1      
#vim named.local
$TTL 86400
@       600     IN      SOA     localhost.      admin.local. (
                                        2011082001
                                        1H
                                        10M
                                        7D
                                        1D )
                IN      NS      localhost.
103              IN      PTR     localhost.
#vim luowei.com.zone
$TTL 86400
@       600     IN      SOA       ns.luowei.com.     admin.luowei.com. (
                                                2011082001
                                                1H
                                                10M
                                                1D
                                                7D )
                IN      NS      ns.luowei.com.
                IN      MX 10   mail.luowei.com.
ns.luowei.com.  IN      A       192.168.1.103
mail.luowei.com. IN     A       192.168.1.103
#vim   192.168.zone                                          
$TTL 86400
@       600     IN      SOA     ns.luowei.com.  admin.luowei.com. (
                                2011082001
                                1H
                                10M
                                7D
                                1D )
                IN      NS      ns.luowei.com.
103             IN      PTR     mail.luowei.com.
103             IN      PTR     mail.luowei.com.
同时还要在/etc/postfix/main.cf中修改mynetworks
mynetworks = 127.0.0.1/8,192.168.1.0/24,172.16.0.0/16
修改/etc/resolv.conf文件
把nameserver 127.0.0.1是主机通过本DNS进行解析
这时就可以验证了,通常验证的方法如下进行发送邮件:
telnet exi127.0.0.1 25
HELLO mail.luowei.com
mail from:redhat@luowei.com
rcpt to:root@luowei.com
data
Subject:how are you?
内容
.
quit
然后使用
#mail命令的查看邮件
当然也可以查看邮件队列
#postqueue -p 查看邮件队列
#postqueue -f 强制发送邮件
三、高级邮件服务管理机制:
1、smtp的用户认证
  现在常用的用户认证机制是sasl,默认的情况下saslauthd是安装了但是没有启动的
  所以启动sasl认证
  具体步骤:
  ①启动sasl认证
  #service saslauthd start 
  #chkconfig saslauthd on //开机自动启动服务
  在/usr/lib/sasl2/下有一个smtpd.conf文件,如果你使用的是Sendmail的话,下面是
  sendmail.conf
  #vim /usr/lib/sasl2/smtpd.conf
  添加一下内容
  pwcheck_method:saslauthd  认证方法
  #service saslauthd restart
  ②调整/etc/postfix/main.cf文件,以便支持认证
  #vim /etc/postfix/main.cf
   smtpd_sasl_auth_enable=yes
   smtpd_sasl_security_options=noanonymous
   mynetworks = 127.0.0.1
   smtpd_recipient_restrictions=
     permit_mynetworks,
     permit_sasl_authenticated,
     reject_unauth_destination
   #service postfix reload 重新加载postfix
   ③验证
   [root@mail ~]# telnet 192.168.1.103 25
    Trying 192.168.1.103...
    Connected to mail.luowei.com (192.168.1.103).
    Escape character is '^]'.
    220 mail.luowei.com ESMTP Postfix
    EHLO mail.luowei.com
    250-mail.luowei.com
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250-AUTH LOGIN PLAIN   //出现了认证的功能
    250-ENHANCEDSTATUSCODES
    250-8BITMIME
    250 DSN
    接下来就是要输入发信人和接受人了
    MAIL FROM:redhat@luowei.com
    MAIL FROM:redhat@luowei.com
    250 2.1.0 Ok
    RCPT TO:root@luowei.com
    250 2.1.5 Ok
    RCPT TO:redhat@126.com
    554 5.7.1 <redhat@126.com>: Relay access denied
    由上面可以看出,发送给自己域内的可以OK,而发往其他外域的就denied
    但是如果这个时候我没使用
    AUTH LOGIN来从新输入发件人的话输入的是通过base64编码的用户名和密码
    (注:#printf "redhat" | openssl base64 或者使用echo -n "redhat" |openssl base64
    就能转换格式了,然后把转换后的内容粘贴到下面的提示中,当然密码也要编码,
    由于我的用户名和密码一样,所有下面的两处需要输入的地方都是一样的)
    AUTH LOGIN 
    334 VXNlcm5hbWU6
    cmVkaGF0   //通过转换成base64位的用户名
    334 UGFzc3dvcmQ6
    cmVkaGF0   //通过转换成base64位的密码
    235 2.0.0 Authentication successful  //认证成功了
    然后在输入
    MAIL FROM:redhat@luowei.com
    ....下面的都一样了
    接下来就是整个认证验证的全过程了:
    [root@mail ~]# !tel
    telnet mail.luowei.com 25  //*测试的开始
    Trying 192.168.1.103...
    Connected to mail.luowei.com (192.168.1.103).
    Escape character is '^]'.
    220 mail.luowei.com ESMTP Postfix
    EHLO mail.luowei.com  //*使用EHLO mail.luowei.com 来查看是否有认证功能
    250-mail.luowei.com
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250-AUTH LOGIN PLAIN   //*显示的有认证功能
    250-ENHANCEDSTATUSCODES
    250-8BITMIME
    250 DSN
    AUTH LOGIN            //*使用认证的方式登录
    334 VXNlcm5hbWU6
    cmVkaGF0             //*输入通过base64编码的用户名(redhat)
    334 UGFzc3dvcmQ6   
    cmVkaGF0             //*输入通过base64编码的用户密码(redhat)
    235 2.0.0 Authentication successful  //显示认证成功
    MAIL FROM:redhat@luowei.com      //*发邮件的用户
    250 2.1.0 Ok
    RCPT TO:test@126.com            //*接收邮件的用户
    250 2.1.5 Ok
    data                           //*邮件内容
    354 End data with <CR><LF>.<CR><LF>
    Subject:sasl test             //*邮件主题
    sasltest                      //*邮件内容
    .                             //*结束邮件的编辑
    250 2.0.0 Ok: queued as EF6826C2EE4
    quit                          //*退出测试
    21 2.0.0 Bye
    Connection closed by foreign host.(注:带“*”都是要输入的)
接下来就看日志信息来看看整个过程了:
#postqueue -p  查看邮件队列,如果有就没有发出,如果没有就结合着邮件日志来查看整个过程
我这里是没有的
#tail -20 /var/log/maillog
Aug 11 03:51:38 station78 postfix/smtpd[5314]: connect from mail.luowei.com[192.168.1.103]
Aug 11 03:52:44 station78 postfix/smtpd[5314]: EF6826C2EE4: client=mail.luowei.com[192.168.1.103], sasl_method=LOGIN, sasl_username=redhat
Aug 11 03:53:09 station78 postfix/cleanup[5319]: EF6826C2EE4: message-id=<20110810195244.EF6826C2EE4@mail.luowei.com>
Aug 11 03:53:09 station78 postfix/qmgr[5126]: EF6826C2EE4: from=<redhat@luowei.com>, size=372, nrcpt=1 (queue active)
Aug 11 03:53:11 station78 postfix/smtpd[5314]: disconnect from mail.luowei.com[192.168.1.103]
Aug 11 03:53:23 station78 postfix/smtp[5323]: EF6826C2EE4: to=<test@126.com>, relay=126mx01.mxmail.netease.com[220.181.15.141]:25, delay=59, delays=45/0.11/12/2, dsn=5.0.0, status=bounced (host 126mx01.mxmail.netease.com[220.181.15.141] said: 550 User not found: test@126.com (in reply to RCPT TO command))
Aug 11 03:53:23 station78 postfix/cleanup[5319]: E8F136C2EE6: message-id=<20110810195323.E8F136C2EE6@mail.luowei.com>
Aug 11 03:53:23 station78 postfix/qmgr[5126]: E8F136C2EE6: from=<>, size=2226, nrcpt=1 (queue active)
Aug 11 03:53:23 station78 postfix/bounce[5324]: EF6826C2EE4: sender non-delivery notification: E8F136C2EE6
Aug 11 03:53:23 station78 postfix/qmgr[5126]: EF6826C2EE4: removed
Aug 11 03:53:24 station78 postfix/local[5325]: E8F136C2EE6: to=<redhat@luowei.com>, relay=local, delay=0.23, delays=0.02/0.03/0/0.19, dsn=2.0.0, status=sent (delivered to mailbox)
Aug 11 03:53:24 station78 postfix/qmgr[5126]: E8F136C2EE6: removed
Aug 11 03:56:57 station78 postfix/anvil[5258]: statistics: max connection rate 1/60s for (smtp:192.168.1.103) at Aug 11 03:51:38
Aug 11 03:56:57 station78 postfix/anvil[5258]: statistics: max connection count 1 for (smtp:192.168.1.103) at Aug 11 03:51:38
Aug 11 03:56:57 station78 postfix/anvil[5258]: statistics: max cache size 1 at Aug 11 03:51:38
所以可以看出邮件是已经通过认证的方式发出去了,这就是当时我们针对本机设置认证,
如果想和外域的发邮件,就要先认证才能发送邮件,否者是被拒绝的。
 
2、设置用户别名和邮件群组
 所谓的用户别名就是通过给一个一个用户邮件转发给另一个用户
 别名有两个功能:地址转发,邮件群发
  使用文件/etc/aliases文件
  在里面添加记录
  格式如下:
     别名:地址1,地址2,地址3,...
  然后执行newaliases命令转换aliases.cb格式
  然后在postfix中添加一个别名机制
  步骤如下:
  ①在/etc/aliases中添加别名记录
   #vim /etc/aliases
   root: redhat   //凡是给root用户发的邮件转发给redhat用户
   #newaliases 生成新的aliases.db文件
   #service postfix reload
   # echo "TO root" |mail -s "to root" root@luowei.com //给root@luowei.com发邮件测试
   #tail /var/log/maillog查看日志文件
   Aug 11 04:21:33 station78 postfix/qmgr[5126]: D2A056C2EE5: from=<root@luowei.com>, size=294, nrcpt=1 (queue active)
   Aug 11 04:21:34 station78 postfix/local[8079]: D2A056C2EE5: to=<redhat@luowei.com>, orig_to=<root@luowei.com>, relay=local, delay=0.3, delays=0.11/0.02/0/0.18, dsn=2.0.0, status=sent (delivered to mailbox)
   Aug 11 04:21:34 station78 postfix/qmgr[5126]: D2A056C2EE5: removed
  这三行日志显示发给root@luowei.com 最终发给了redhat@luowei.com用户了
  #su - redhat
  #mail 查看邮件,你会发现刚写的邮件
  ②在/etc/aliases中添加群组的记录,这样就可以发送群邮件了
  #groupadd mygroup
  #vim /etc/aliases
  mygroup: redhat,student,root 
  #newaliases
  #service postfix reload
  测试同上面,查看日志文件
 
3、邮件加密
  邮件传送的时候会经过internet,所以存在安全隐患,为了跟好的保障邮件的传输
  以及数据的完整性,所以要对数据进行加密,在加密的过程中,可以使用smtps,pop3s,
  imaps方式。
  这就需要使用邮件服务的ssl了,接下来就是做这个过程了
  首先,使用wireshark抓把工具来进行抓包
  #yum install wireshark
  #tshark -ni eth0 -R "tcp.scrport eq 110 or tcp.dstport eq 110" 进行抓包
  然后在客户端等登录
  在window的cmd下输入 telnet 192.168.1.103 110
  USER redhat 
  PASS redhat   
  LIST     //列出邮件
  RETR NUM    //查看指定编号的邮件
  这个时候你分析抓包工具抓的数据包,能看到里面直接就有用户名和密码
  所以这样太危险了,为了安全考虑,我们需要使用ssl对数据进行加密,同时考
  虑到数据传输的特点,在接受邮件的时候进行加密会更好,所以使用pop3s,或
  imaps协议来实现加密功能
  具体步骤如下:
  ①建立ca
  #(umask 077;openssl genrsa 1024 >private/cakey.pem)  //建立ca的私钥
  # openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650//颁发一个自签的证书
  Country Name (2 letter code) [CN]:
  State or Province Name (full name) [Henan]:
  Locality Name (eg, city) [ZZ]:
  Organization Name (eg, company) [linux]:
  Organizational Unit Name (eg, section) []:ca
  Common Name (eg, your name or your server's hostname) []:ca.luowei.com
  Email Address []:ca@luowei.com
  # mkdir certs newcerts crl
  # touch index.txt serial
  # echo 01 > serial
  ②为dovecot创建私钥并申请证书
  #mkdir /etc/dovecot
  #cd /etc/dovecot
  #mkdir ssl
  #cd ssl
  #openssl genrsa 1024>dovecot.key
  #chmod 600 dovecot.key
  #openssl req -new -key dovecot.key -out dovecot.csr //申请证书
  Country Name (2 letter code) [CN]:
  State or Province Name (full name) [Henan]:
  Locality Name (eg, city) [ZZ]:
  Organization Name (eg, company) [linux]:
  Organizational Unit Name (eg, section) []:tech
  Common Name (eg, your name or your server's hostname) []:mail.luowei.com
  Email Address []:root@luowei.com
  ③颁发证书
  # openssl ca -in dovecot.csr -out dovecot.crt //颁发证书
  ④编辑/etc/dovecot.conf文件
  #cd /etc/dovecot/ssl
  #cp /etc/pki/CA/private/cacert.pem ./
  #mv cacert.pem cacert.crt
  #rm -fr dovecot.csr
  #vim /etc/dovecot.conf 修改如下内容
   ssl_cert_file = /etc/dovecot/ssl/dovecot.crt
   ssl_key_file = /etc/dovecot/ssl/dovecot.key
   ssl_ca_file = /etc/dovecot/ssl/cacert.crt
   protocols = imap imaps pop3 pop3s
   ⑤测试:
   #mutt -f pop3s://redat@mail.luowei.com
   测试会显示一个关于证书的,这样就实现了加密。
   这时候在使用抓包工具就不会抓到密码了
  
4、拒绝指定地址、指定用户发邮件
   ①指定地址拒绝发送邮件
   #vim /etc/postfix/main.cf
    smtpd_client_restrictions =hash:/etc/postfix/access_file
   #vim /etc/postfix/access_file
    192.168.1.103 REJECT
   #postmap /etc/postfix/access_file  //转换成二进制的格式
   #service postfix reload
   220 mail.luowei.com ESMTP Postfix
   HELO mail.luowei.com
   250 mail.luowei.com
   MAIL FROM:redhat@luowei.com
   250 2.1.0 Ok
   RCPT TO:root@luowei.com
   554 5.7.1 <unknown[192.168.1.100]>: Client host rejected: Access denied
   我在自己的客户机(192.168.1.100)上验证,这样就会拒绝指定的IP地址发送邮件了
   ②指定网段
    在/etc/postfix/access_file中添加网段
     如1.2.3 REJECT表示1.2.3.0这个网段的被拒绝
    剩下的步骤就和上面的一样了
   ③拒绝指定的用户发送邮件
    #vim /etc/postfix/main.cf
     smtpd_sender_restrictions=hash:/PATH/FILE_NAME
    #vim /PATH/FILE_NAME
     centos@luowei.com REJECT  拒绝指定的用户的指定邮箱
     @a.org REJECT    拒绝a.org这个域的用户
     gentoo@ REJECT   拒绝gentoo所在的所有的域  
    #postmap /PATH/FILE_NAME
    #service postfix reload