基于虚拟账号的邮件系统

什么是邮件系统

要想知道这个问题,首先要了解电子邮件的发展阶段,而电子邮件的发展经过了三个阶段:

1.免费电子邮箱

2.收费电子邮箱(包括现在的企业邮局)

3.邮件系统

在概念上,TCP/IP的电子邮件系统也分为用户界面和文件传输两部分,但文件传输部分并未独立出来,形成一个类似于MOTIS中 MTA的概念。其中的原因在于TCP/IP自始至终坚持端到端的思想,它的电子邮件系统也不例外地采用端到端的传输方式,不存在邮件的存储转发问题,因此也就没有必要引入像MTA一样负责存储转发的机构了。

在端到端方式中,虽然初始主机要参与邮件传输的全过程,但由于TCP/IP下层协议的简洁性,其效率反而比存储转发来得高。

同MOTIS一样,TCP/IP电子邮件系统要解决的首要问题也是收方主机(叫作远地机)暂时不能访问(比如未开机、出故障、不能建立网络连接等)时,如何发送电子邮件的问题。在TCP/IP的术语中,这叫延迟传递(delayed delivery)。

电子邮件系统的优点

电子邮件系统的优点是即便远地机不可访问,发送者也可以把文件发送出去。为此TCP/IP采用spooling缓冲技术,将用户收发文件与实际的文件传输区别开,这种划分实际是UA和MTA划分的原型。

用户发送邮件时,首先利用用户界面生成邮件,然后把它传给发送邮件spooling区,相当于文件从UA到MS。然后的整个发送过程用户都不必关心,等待关于发送结果的报告就可以了。负责发送邮件的客户(相当于MTA的发送部分)是一个后台进程,它一发现发送缓冲区有 邮件待发,立刻将其取出,并把信宿机名映射成IP地址,然后请求与对方的服务器(相当于MTA的接收部分)建立TCP连接。如果连接成功,便发送邮件,对 方服务器将接收到的邮件存放在接收邮件邮箱(相当于MS)中;发送完后,客户将相应邮件从发送缓冲区删除。假如连接不成功,客户记下发送时间。客户进程周期性地检查发送缓冲区,每当它发现未发邮件,或用户传来一个新邮件,客户立即着手发送。当发现某邮件很长时间(如有些系统将这个时间设置为3天)都发不出 去,客户将它返回发送者。

电子邮件系统的工作原理

电子邮件系统的运作方式与其它的网络应用有着根本上的不同。在其它的绝大多数的网络应用中,网络协议直接负责将数据发送到目的地。而在电子邮件系统中,发送者并不等待发送工作完成,而是仅仅将要发送的内容发送出去。

例如:文件传输协议(FTP)就象打电话一样,实时地接通对话双方,如果一方暂时没有应答,则通话就会失败。而电子邮件系统则 不同,发送方将要发送的内容通过自己的电子邮局将信件发给接收方的电子邮局。如果接收方的电子邮局暂时繁忙,那么发送方的电子邮局就会暂存信件,直到可以发送。而当接收方未上网时,接收方的电子邮局就暂存信件,直到接收方去取。可以这么说,电子邮件系统就象是在Internet上实现了传统邮局的功能,而且是更加快捷方便地实现。

现在作为一个普通的用户想要连接到Internet,那么就必须找一家Internet服务商(ISP)提供连接服务。在中国,最大的ISP就是中国电信。ISP在提供连接的同时,还会提供一个电子邮局,分配一个电子信箱给用户使用。而且在Internet上还有许多免费的电子邮局提供电子邮件服务

值得一提的是,电子邮件总是有一个空间大小的叙述,这是什么意思呢?也就是电子邮局给每个用户所提供的暂存信件的空间。当然,越大越好嘛。

下面我们来尝试着实现mail服务器间的对发跟加密

clip_image002

(1)首先我们先配置北京的mail服务器

系统默认已经安装了sendmail的,它只能实现mta

[root@localhost Server]# rpm -qa |grep sendmail

sendmail-8.13.8-8.el5

还需要一些其他的包

sendmail-cf-8.13.8-8.el5.i386.rpm  生成易配置的配置文件跟脚本

sendmail-devel-8.13.8-8.el5.i386.rpm   开发包

sendmail-doc-8.13.8-8.el5.i386.rpm  文档包

m4-1.4.5-3.el5.1.i386.rpm     转换工具包

我们需要把这几个包一个个的安装

安装完后在目录/etc/mail上生成文件:sendmail.mc主配置文件 直接编译后重启便由m4转换成sendmail.cf    还有生成文件access  可以直接编译,会由m4装换为saccess.db

如图:若北京用户向上海用户发送邮件,那么就需要dns,还用到转发

首先搭建dns服务器:

1.安装包:bind-9.3.6-4.P1.el5_4.2.i386.rpm

         bind-chroot-9.3.6-4.P1.el5_4.2.i386.rpm

  caching-nameserver-9.3.6-4.P1.el5_4.2.i386.rpm

2.生成主配置文件:

[root@localhost Server]# cd /var/named/chroot/etc/

[root@localhost etc]# cp -p named.caching-nameserver.conf named.conf

[root@localhost etc]# vim named.conf

options {

        listen-on port 53 { any; };  更改监听范围

        listen-on-v6 port 53 { ::1; };

        directory       "/var/named";

        dump-file       "/var/named/data/cache_dump.db";

        statistics-file "/var/named/data/named_stats.txt";

        memstatistics-file "/var/named/data/named_mem_stats.txt";

        allow-query     { any; };  改为any

};

logging {

        channel default_debug {

                file "data/named.run";

                severity dynamic;

        };

};

view localhost_resolver {

        match-clients      { any; };  改为any

        match-destinations { any; };  改为any

        recursion yes;

        include "/etc/named.rfc1912.zones";

};

2.声明区域:[root@localhost etc]# vim named.rfc1912.zones

zone "bj.com" IN {

        type master;

        file "bj.com.db";

        allow-update { none; };

};

3.创建数据库:

[root@localhost named]# pwd

/var/named/chroot/var/named

[root@localhost named]# cp -p localhost.zone bj.com.db

[root@localhost named]# vim bj.com.db

$TTL    86400

@               IN SOA  ns.bj.com.       root (

                                        42              ; serial (d. adams)

                                        3H              ; refresh

                                        15M             ; retry

                                        1W              ; expiry

                                        1D )            ; minimum

@               IN NS           ns.bj.com.

ns              IN A            192.168.20.99

mail            IN A            192.168.20.99

pop3            IN CNAME        mail

smtp            IN CNAME        mail

@               IN MX 10         mail   创建邮件交换器,便于别人向本地区发信

4.启动dns  service named start,并改变dns指向

[root@localhost named]# vim /etc/resolv.conf

nameserver 192.168.20.99

到此dns服务器便搭配好了

我们这里要做的是mail服务器,我们需要把主机名称也改了

[root@localhost named]# vim /etc/hosts

127.0.0.1          mail.bj.com  localhost.localdomain localhost    添加

::1             localhost6.localdomain6 localhost6

[root@localhost named]# vim /etc/sysconfig/network

NETWORKING=yes

NETWORKING_IPV6=yes

HOSTNAME=mail.bj.com  修改名称

修改完成之后重启系统

其他邮件发送方法telnet

[root@mail ~]# telnet 192.168.20.99 25

Trying 192.168.20.99...

telnet: connect to address 192.168.20.99: Connection refused

telnet: Unable to connect to remote host: Connection refused

这里被拒绝了,所以我们需要在主配置文件中更改

[root@mail ~]# vim /etc/mail/sendmail.mc

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl

然后重启sendmail就可以了service sendmail restart

[root@mail ~]# netstat -tupln |grep 25

tcp   0    0 0.0.0.0:25       0.0.0.0:*      LISTEN  3769/sendmail: acce

[root@mail ~]# telnet 192.168.20.99 25  再次连接

Trying 192.168.20.99...

Connected to 192.168.20.99 (192.168.20.99).

Escape character is '^]'.

220 mail.bj.com ESMTP Sendmail 8.13.8/8.13.8; Sat, 6 Aug 2011 11:19:35 +0800

Help  获取帮助

214-2.0.0 This is sendmail

214-2.0.0 Topics:

214-2.0.0  HELO EHLO MAIL RCPT DATA

214-2.0.0  RSET NOOP QUIT HELP VRFY

214-2.0.0  EXPN VERB ETRN DSN AUTH

214-2.0.0  STARTTLS

214-2.0.0 For more info use "HELP <topic>".

214-2.0.0 To report bugs in the implementation see

214-2.0.0  http://www.sendmail.org/email-addresses.html

214-2.0.0 For local information send email to Postmaster at your site.

214 2.0.0 End of HELP info

HElo mail.bj.com  向服务器打个招呼

250 mail.bj.com Hello [192.168.20.99], pleased to meet you

mail from:hhh@hh.com   发送邮件(这里是不没有邮箱验证的,名字可以随便写)

250 2.1.0 hhh@hh.com... Sender ok

rcpt to :user1@mail.bj.com   收件人@服务器

250 2.1.5 user1@mail.bj.com... Recipient ok

Data   

354 Enter mail, end with "." on a line by itself

subject:hello

hekkllll

.

250 2.0.0 p763JZIk003784 Message accepted for delivery

quit

221 2.0.0 mail.bj.com closing connection

Connection closed by foreign host.

这时我们可以用tail /var/log/maillog查看邮件发送的状态,发现已经发送成功,但是任何用户都可以发送了,此服务器就成了垃圾中转站了,所以我们还可以做一些其他的机制

除了telnet外,我们还可以用windo自带的outlook 发送

首先我们先安装服务器端的pop3

[root@mail Server]# yum install dovecot

Divecot安装后默认情况下开启了pop3,pop3s,imap ,imaps

[root@mail Server]# netstat -tupln |grep dov

tcp  0  0 :::993   :::*    LISTEN      3863/dovecot        (imaps)

tcp  0  0 :::995   :::*    LISTEN      3863/dovecot        (pops)

tcp  0  0 :::110   :::*    LISTEN      3863/dovecot       

tcp  0  0 :::143   :::*    LISTEN      3863/dovecot

[root@mail Server]# vim /etc/dovecot.conf   编译它的主配置文件

protocols =  pop3   我们这里可以设置只使用pop3

然后启动dovecot     -------service dovecot star

客户端配置:

clip_image004

再接受user1的邮件便可以收到了:

clip_image006

来解决它吧

此时我们知道从服务器内部是能往外发得(刚接受到的那封就是)

在/etc/mail目录下的access文件是一个中继文件

[root@mail ~]# vim /etc/mail/access

Connect:localhost.localdomain      RELAY

Connect:localhost                  RELAY

Connect:localhost                   RELAY

Connect:127.0.0.1                RELAY

Connect:192.168.20.        RELAY    如果客户端处于不同网段,一定要为其添加中继

/etc/mail/local-host-names 记录本地域名,必须知道自己负责的域

[root@mail ~]# vim /etc/mail/local-host-names

mail.bj.com         添加本地服务器名

bj.com       添加本地域名

做完之后重启sendmail ,然后在客户端便可以向服务器本地发了

(2)我们再用同样的方法配置上海的mail服务器

sendmail-cf-8.13.8-8.el5.i386.rpm  生成易配置的配置文件跟脚本

sendmail-devel-8.13.8-8.el5.i386.rpm   开发包

sendmail-doc-8.13.8-8.el5.i386.rpm  文档包

m4-1.4.5-3.el5.1.i386.rpm     转换工具包

我们需要把这几个包一个个的安装

首先搭建dns服务器:

3.安装包:bind-9.3.6-4.P1.el5_4.2.i386.rpm

         bind-chroot-9.3.6-4.P1.el5_4.2.i386.rpm

  caching-nameserver-9.3.6-4.P1.el5_4.2.i386.rpm

4.生成主配置文件:

[root@localhost Server]# cd /var/named/chroot/etc/

[root@localhost etc]# cp -p named.caching-nameserver.conf named.conf

[root@localhost etc]# vim named.conf

options {

        listen-on port 53 { any; };  更改监听范围

        listen-on-v6 port 53 { ::1; };

        directory       "/var/named";

        dump-file       "/var/named/data/cache_dump.db";

        statistics-file "/var/named/data/named_stats.txt";

        memstatistics-file "/var/named/data/named_mem_stats.txt";

        allow-query     { any; };  改为any

};

logging {

        channel default_debug {

                file "data/named.run";

                severity dynamic;

        };

};

view localhost_resolver {

        match-clients      { any; };  改为any

        match-destinations { any; };  改为any

        recursion yes;

        include "/etc/named.rfc1912.zones";

};

2.声明区域:[root@localhost etc]# vim named.rfc1912.zones

zone "sh.com" IN {

        type master;

        file "sh.com.db";

        allow-update { none; };

};

3.创建数据库:

[root@localhost named]# pwd

/var/named/chroot/var/named

[root@localhost named]# cp -p localhost.zone bj.com.db

[root@localhost named]# vim bj.com.db

$TTL    86400

@               IN SOA  ns.sh.com.       root (

                                        42              ; serial (d. adams)

                                        3H              ; refresh

                                        15M             ; retry

                                        1W              ; expiry

                                        1D )            ; minimum

                IN NS           ns.sh.com.

ns              IN A            192.168.20.88

mail            IN A            192.168.20.88

pop3            IN CNAME        mail

smtp            IN CNAME        mail

@               IN MX 10        mail   创建邮件交换器,便于别人向本地区发信

5.启动dns  service named start,并改变dns指向

[root@localhost named]# vim /etc/resolv.conf

nameserver 192.168.20.88

到此dns服务器便搭配好了

我们这里要做的是mail服务器,我们需要把主机名称也改了

[root@localhost named]# vim /etc/hosts

127.0.0.1          mail.sh.com  localhost.localdomain localhost    添加

::1             localhost6.localdomain6 localhost6

[root@localhost named]# vim /etc/sysconfig/network

NETWORKING=yes

NETWORKING_IPV6=yes

HOSTNAME=mail.sh.com  修改名称

修改完成之后重启系统

默认sendmail是安装的,这里我们设置允许telnet连接服务器的其它地址的25号口进行收发邮件,所以我们需要在主配置文件中更改

[root@mail ~]# vim /etc/mail/sendmail.mc

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl

然后重启sendmail就可以了service sendmail restart

[root@mail ~]# netstat -tupln |grep 25

tcp   0    0 0.0.0.0:25       0.0.0.0:*      LISTEN  3739/sendmail: acce

[root@mail ~]# telnet 192.168.20.88 25  再次连接

Trying 192.168.20.88...

Connected to 192.168.20.88 (192.168.20.88).

Escape character is '^]'.

220 mail.bj.com ESMTP Sendmail 8.13.8/8.13.8; Sat, 6 Aug 2011 11:19:35 +0800

quit

221 2.0.0 mail.bj.com closing connection

Connection closed by foreign host.

除了telnet外,我们还可以用windows自带的outlook 发送

首先我们先安装服务器端的pop3

[root@mail Server]# yum install dovecot

Divecot安装后默认情况下开启了pop3,pop3s,imap ,imaps

[root@mail Server]# netstat -tupln |grep dov

tcp  0  0 :::993   :::*    LISTEN      3863/dovecot        (imaps)

tcp  0  0 :::995   :::*    LISTEN      3863/dovecot        (pops)

tcp  0  0 :::110   :::*    LISTEN      3293/dovecot       

tcp  0  0 :::143   :::*    LISTEN      3863/dovecot

[root@mail Server]# vim /etc/dovecot.conf   编译它的主配置文件

protocols =  pop3   我们这里可以设置只使用pop3

然后启动dovecot     -------service dovecot start

在/etc/mail目录下的access文件是一个中继文件

[root@mail ~]# vim /etc/mail/access

Connect:localhost.localdomain      RELAY

Connect:localhost                  RELAY

Connect:localhost                   RELAY

Connect:127.0.0.1                RELAY

Connect:192.168.20.        RELAY    如果客户端处于不同网段,一定要为其添加中继

/etc/mail/local-host-names 记录本地域名,必须知道自己负责的域

[root@mail ~]# vim /etc/mail/local-host-names

mail.sh.com         添加本地服务器名

sh.com       添加本地域名

做完之后重启sendmail ,然后在客户端便可以向服务器本地发了

(3)基本的对发

北京地区用户要给上海用户大发邮件,首先会发给自己的服务器,然后自己的服务器再转发给上海的邮件服务器,再由该服务器下发到对端,该过程中服务器间的对发需要用到域名解析,所以需要在本地dns上做转发

在北京跟上海的dns上分别做转发:编译主配置文件

[root@mail ~]# vim /var/named/chroot/etc/named.conf

options {

        listen-on port 53 { any; };

        listen-on-v6 port 53 { ::1; };

        directory       "/var/named";

        dump-file       "/var/named/data/cache_dump.db";

        statistics-file "/var/named/data/named_stats.txt";

        memstatistics-file "/var/named/data/named_mem_stats.txt";

          forwarders    { 192.168.20.88; };    装发到对端的服务器地址

        allow-query     { any; };

        allow-query-cache { any; };

};

做完转发后,就位其他区域转发做中继

分别在北京跟上海为对端的服务区域做转发中继

[user1@mail ~]$ vim  /etc/mail/access

Connect:localhost.localdomain     RELAY

Connect:localhost                 RELAY

Connect:127.0.0.1                RELAY

Connect:192.168.20.              RELAY

bj.com                    OK

sh.com                 RELAY     

重启sendmail后便可以做转发了,实现北京和上海的对发了,但是速度很慢

(4)但是这样不能避免垃圾软件,我们为了避免垃圾邮件,每一个邮件服务器根据对方的mx记录找到对方的地址,再根据地址解析一下名称是否是对方的那个名称

所以我们需要在双方dns上做反向dns

1.为反向查找做区域声明:(两边都做)

[root@mail user1]# vim /var/named/chroot/etc/named.rfc1912.zones

zone "20.168.192.in-addr.arpa" IN {

        type master;

        file "192.168.20.db";

        allow-update { none; };

};

2.产生反向查找的数据库文件(两边都做)

[root@mail user1]# cd /var/named/chroot/var/named/

[root@mail named]# cp -p named.local  192.168.20.db

[root@mail named]# vim 192.168.20.db

$TTL    86400

@     IN   SOA  localhost.   root.localhost.  (   “本机就是该反向dns的服务”器

                                      1997022700 ; Serial

                                      28800      ; Refresh

                                      14400      ; Retry

                                      3600000    ; Expire

                                      86400 )    ; Minimum

        IN      NS      localhost.

99       IN      PTR    mail.bj.com.  添加服务器记录

88       IN      PTR    mail.sh.com.  添加对端服务器记录

做完之后执行rndc  reload  便可以解析了

此时再用客户端相互对发便可以很快的发送过去了

我们可以替管理员做邮件的别名,这个别名账号数不需要创建,只是一个外号而已,这个外号可以对应好几个账号,那么所发得邮件就会发到它对应的每一个

这个别名在/etc/aliases中配置,由于m4会将aliases的改变更新到aliases.db中,系统真正使用的是aliases.db数据库

编译aliases文件,为用户添加别名记录

[root@mail etc]# vim /etc/aliases

master:         user5,user6   (用户间可以用逗号隔开)

做完之后重启sendmail,那么往该别名发送的邮件都会被user5与user6收到

加密 认证

发送 smtps

smtp  明文

smtps  465 (ssl)

Starttls  sasl

接受 pop3s   imaps

认证 sasl

验证sendmail是否启用starttls加密机制(默认是没有启用的) 点到点加密

[root@mail ~]# telnet mail.bj.com 25

Trying 192.168.20.99...

Connected to mail.bj.com (192.168.20.99).

Escape character is '^]'.

220 mail.bj.com ESMTP Sendmail 8.13.8/8.13.8; Sat, 6 Aug 2011 18:31:03 +0800

ehlo mail.sh.com

250-mail.bj.com Hello mail.sh.com [192.168.20.88], pleased to meet you

250-ENHANCEDSTATUSCODES

250-PIPELINING

250-8BITMIME

250-SIZE

250-DSN

250-ETRN

250-DELIVERBY

250 HELP

quit

我们这里可以查看是否支持该协议

[root@mail ~]# sendmail -d0.1 -bv

Version 8.13.8

Compiled with: DNSMAP HESIOD HES_GETMAILHOST LDAPMAP LOG MAP_REGEX

MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6

NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF SOCKETMAP STARTTLS

TCPWRAPPERS USERDB USE_LDAP_INIT

============ SYSTEM IDENTITY (after readcf) ============

      (short domain name) $w = mail

  (canonical domain name) $j = mail.sh.com

         (subdomain name) $m = sh.com

              (node name) $k = mail.sh.com

========================================================

Recipient names must be specified

可以看到,它是支持SASLv2与STARTTLS的

我们使用smtps或者starttls都会使用到证书,CA将证书颁发给邮件服务器

下面我们利用上海的服务器搭建一个CA 

编译ssl的主配置文档

[root@mail ~]# cd /etc/pki/

[root@mail pki]# vim tls/openssl.cnf

45dir             = /etc/pki/CA     CA的路径(定义dir变量)

46certs           = $dir/certs       存放证书目录 (需要创建)

47 crl_dir         = $dir/crl          吊销证书目录 (需要创建)

48 database        = $dir/index.txt       需要创建该文件

51 new_certs_dir   = $dir/newcerts       需要创建该目录 .

53 certificate     = $dir/cacert.pem      

54 serial          = $dir/serial  (需要创建)发送证书的序列号(需要给一个起始序列号)

匹配条件:(这里选择可以决定能否对外发放证书)

87 [ policy_match ]

88 countryName             = optional (若往下三项都为math则,只能往该城市发证书)

89 stateOrProvinceName     = optional

90 organizationName        = optional

91 organizationalUnitName  = optional

92 commonName             = supplied

93 emailAddress            = optional

退出编译后,我们首先创建那些目录跟文件

[root@mail pki]# cd CA

[root@mail CA]# mkdir certs newcerts  crl

[root@mail CA]# touch index.txt serial

[root@mail CA]# echo "01" &gt;serial   给它一个起始序列号

产生一个钥匙输出到cakey.pem文件中

[root@mail CA]# echo "01" &gt;serial

[root@mail CA]# openssl genrsa 1024 &gt;private/cakey.pem  里面含有私钥

Generating RSA private key, 1024 bit long modulus

.++++++

....................++++++

e is 65537 (0x10001)

[root@mail CA]# chmod 600 private/*  (为了安全起见)

[root@mail CA]# ll private/

-rw------- 1 root root 887 07-24 18:38 cakey.pem (产生一个钥匙)

自己给自己颁发一个证书

[root@mail CA]# openssl req -x509 -new -key private/cakey.pem -out cacert.pem -days 3650

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [GB]:CN

State or Province Name (full name) [Berkshire]:HENAN

Locality Name (eg, city) [Newbury]:ZHENZHOU

Organization Name (eg, company) [My Company Ltd]:CACENTER

Organizational Unit Name (eg, section) []:TEC

Common Name (eg, your name or your server's hostname) []:test.net.net

Email Address []:

[root@mail CA]# ll

总计 28

-rw-r--r-- 1 root root 1139 07-24 18:45 cacert.pem   产生了一个CA证书

为我们的邮件服务器做证书

[root@mail CA]# cd /etc/mail

[root@mail mail]# mkdir certs  创建一个存放证书与钥匙的文件夹

[root@mail mail]# cd certs/

[root@mail certs]# openssl genrsa 1024 &gt;sendmail.key  产生自己的钥匙

Generating RSA private key, 1024 bit long modulus

........................++++++

................................++++++

e is 65537 (0x10001)

[root@mail certs]# openssl req -new -key sendmail.key -out sendmail.csr 向CA产生请求文件

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [GB]:CN

State or Province Name (full name) [Berkshire]:SH

Locality Name (eg, city) [Newbury]:SH

Organization Name (eg, company) [My Company Ltd]:LL

Organizational Unit Name (eg, section) []:TEC

Common Name (eg, your name or your server's hostname) []:mail.sh.com  服务器名

Email Address []:

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

[root@mail certs]# ll

总计 8

-rw-r--r-- 1 root root 631 07-24 18:53 sendmail.csr  产生的请求文件

-rw-r--r-- 1 root root 887 07-24 18:51 sendmail.key  产生的钥匙文件

根据请求文件让CA签发一个证书(证书上只包含公钥)

[root@mail certs]# openssl ca -in  sendmail.csr -out sendmail.crt 输出sendmail.crt(邮件证书)

[root@mail certs]# ll

总计 12

-rw-r--r-- 1 root root 3053 07-24 19:05 sendmail.crt  产生一个证书文件

-rw-r--r-- 1 root root  631 07-24 18:53 sendmail.csr

-rw-r--r-- 1 root root  887 07-24 18:51 sendmail.key

[root@mail certs]# chmod  600 *  为了安全起见,更改一个他们的权限

Sendmail在实现smtps时需要ca的证书,必须把ca的证书放到每一个目录上

[root@mail certs]# cp /etc/pki/CA/cacert.pem  ./     拷贝ca机构的证书

[root@mail certs]# chmod  600 *

[root@mail certs]# ll

总计 16

-rw------- 1 root root 1139 07-24 19:11 cacert.pem    ca机构的证书(一个证书只包含公钥)

-rw------- 1 root root 3053 07-24 19:05 sendmail.crt 邮件服务器的自己的证书

-rw------- 1 root root  631 07-24 18:53 sendmail.csr

-rw------- 1 root root  887 07-24 18:51 sendmail.key

改写sendmail的配置,让它支持利用证书来实现加密

[root@mail certs]# vim /etc/mail/sendmail.mc

60 define(`confCACERT_PATH', `/etc/mail/certs')dnl   ca证书存放的路径

61 define(`confCACERT', `/etc/mail/certs/cacert.pem')dnl   ca证书的文件路径及名称

62 define(`confSERVER_CERT', `/etc/mail/certs/sendmail.crt')dnl  服务的证书及路径

63 define(`confSERVER_KEY', `/etc/mail/certs/sendmail.key')dnl 服务器的密钥及路径

134  DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl 打开smtps

然后重启sendmail

在就可以检测到STARTTLS已经启用了

[root@mail certs]# telnet mail.sh.com 25

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 mail.sh.com ESMTP Sendmail 8.13.8/8.13.8; Sun, 24 Jul 2011 19:39:28 +0800

ehlo mail.sh.com

250-mail.sh.com Hello mail.sh.com [127.0.0.1], pleased to meet you

250-ENHANCEDSTATUSCODES

250-PIPELINING

250-8BITMIME

250-SIZE

250-DSN

250-ETRN

250-STARTTLS

250-DELIVERBY

250 HELP

此时关于证书的验证,我们在服务器端已经做好 了,下面我们来配置客户端

客户端证书:1.有效期 2.ca是否可信 3.名称

clip_image008

关于smtps的利用证书的安全机制便可以实现了

但是smtps需要证书,但是它只针对有证书段的传输进行了加密,没有证书段的仍是明文传输

认证

Sasl(简单认证安全协议)

系统针对实现sasl协议有专门的软件包 -------cyrus-sasl.i386 (默认已安装)

形成的服务的名称: saslauthd  没有端口号

查看是否安装sasl

[root@mail certs]# telnet mail.sh.com 25

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 mail.sh.com ESMTP Sendmail 8.13.8/8.13.8; Sun, 24 Jul 2011 19:39:28 +0800

ehlo mail.sh.com

250-mail.sh.com Hello mail.sh.com [127.0.0.1], pleased to meet you

250-ENHANCEDSTATUSCODES

250-PIPELINING

250-8BITMIME

250-SIZE

250-DSN

250-ETRN

250-STARTTLS

250-DELIVERBY

250 HELP

quit

发现系统默认是没有安装auth  验证的 也就是说现在邮件服务器上任何账户都可以送邮件,这样会造成垃圾邮件范围扩大

所以我们需要对发送邮件的用户身份做认证

[root@mail certs]# vim /etc/mail/sendmail.mc    编译sendmail的主配置文件

39 define(`confAUTH_OPTIONS', `A y')dnl   (“y” 启用认证的选项)

52 TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

53 define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl   (52,53:信任的认证机制)

116 DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA,M=Ea')dnl

(“M=Ea”强制认证)

在文件/usr/lib/sasl2/Sendmail.conf 中描述一下验证方法

[root@mail certs]# vim  /usr/lib/sasl2/Sendmail.conf

pwcheck_method:saslauthd    默认启用sasl验证

做完之后重启sendmail,saslauthd及再使用telnet进行测试:

[root@mail ~]# service saslauthd restart

停止 saslauthd: [确定]

启动 saslauthd: [确定]

[root@mail ~]# echo -n "user3@sh.com" |openssl base64

dXNlcjNAc2guY29t     输出user3@sh.com用base64加密后的密文(-n表示去后面的回车)

[root@mail ~]# echo -n "123" |openssl base64

MTIz

[root@mail certs]# telnet mail.sh.com 25    使用telnet测试

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 mail.sh.com ESMTP Sendmail 8.13.8/8.13.8; Sun, 24 Jul 2011 20:33:36 +0800

ehlo mail.sh.com

250-mail.sh.com Hello mail.sh.com [127.0.0.1], pleased to meet you

250-ENHANCEDSTATUSCODES

250-PIPELINING

250-8BITMIME

250-SIZE

250-DSN

250-AUTH LOGIN PLAIN    此时已经启用了验证

250-STARTTLS

250-DELIVERBY

250 HELP

mail from:user3@bj.com    使用明文是被拒绝的

530 5.7.0 Authentication required

Help   可以使用help获取帮助

214-2.0.0 This is sendmail

214-2.0.0 Topics:

214-2.0.0 HELOEHLOMAILRCPTDATA

214-2.0.0 RSETNOOPQUITHELPVRFY

214-2.0.0 EXPNVERBETRNDSNAUTH

214-2.0.0 STARTTLS

214-2.0.0 For more info use "HELP <topic>".

214-2.0.0 To report bugs in the implementation see

214-2.0.0 http://www.sendmail.org/email-addresses.html

214-2.0.0 For local information send email to Postmaster at your site.

214 2.0.0 End of HELP info

auth login dXNlcjNAc2guY29t   验证账号

334 UGFzc3dvcmQ6 

MTIz    验证密码

235 2.0.0 OK Authenticated   验证成功

mail from:user4@sh.com        测试发邮件

250 2.1.0 user4@sh.com... Sender ok

rcpt to:user4@sh.com

250 2.1.5 user4@sh.com... Recipient ok

data

354 Enter mail, end with "." on a line by itself

subject:hello

11111111111

.

[root@mail certs]# su - user4

[user4@mail ~]$ mail

Mail version 8.1 6/6/93.  Type ? for help.

"/var/spool/mail/user4": 1 message 1 new

&gt;N  1 user4@sh.com          Sun Jul 24 20:59  13/401   "hello"

&        客户端收到了邮件,验证成功!!!!

这时我们是outlook客户端试试:

clip_image010

clip_image012

clip_image014

结果是能发出去的,不信可以试试哦!

clip_image016

clip_image018

clip_image020

做验证时。服务器会对客户端传来的服务器名跟账号做双重验证,验证通过的才通过它发信

实现端到端的加密  s/mime   pgp

抓包工具:    tcpdumap    wireshark(图形) tshark(字符界面)

wireshark.i386               tshark(字符界面)

wireshark-gnome.i386          wireshark(图形)

我们这里安装基于字符的

安装后使用下列命令抓包

在本地eth0网卡上抓基于目标与源110端口的包,同时我们在两地使用客户端对发一封邮件,并查看抓包状态

[root@mail ~]# tshark -ni eth0 -R "tcp.srcport eq 110 or tcp.dstport eq 110"

38.002424 192.168.20.88 -&gt; 192.168.20.77 POP Response: +OK Dovecot ready.

38.003489 192.168.20.77 -&gt; 192.168.20.88 POP Request: USER user3 这里抓获到接受方账户

38.003822 192.168.20.88 -&gt; 192.168.20.77 POP Response: +OK

38.004056 192.168.20.77 -&gt; 192.168.20.88 POP Request: PASS 123  接受方密码

38.031182 192.168.20.88 -&gt; 192.168.20.77 POP Response: +OK Logged in.

38.031324 192.168.20.77 -&gt; 192.168.20.88 POP Request: STAT

38.033710 192.168.20.88 -&gt; 192.168.20.77 POP Response: +OK 0 0

38.034272 192.168.20.77 -&gt; 192.168.20.88 POP Request: QUIT

38.035143 192.168.20.88 -&gt; 192.168.20.77 POP Response: +OK Logging out.

由此可以发现,在接受的过程我们很容易就能抓获到通信的账户密码,这样是很不安全的

让CA给dovecot颁发证书

为dovecot创建存放证书目录

[root@mail ~]# mkdir -pv /etc/dovecot/certs

mkdir: 已创建目录 “/etc/dovecot”

mkdir: 已创建目录 “/etc/dovecot/certs”

[root@mail ~]# cd /etc/dovecot/certs/

[root@mail certs]# openssl genrsa 1024 &gt;dovecot.key

Generating RSA private key, 1024 bit long modulus

...............................................................++++++

......................................++++++

e is 65537 (0x10001)

产生证书请求文件:

[root@mail certs]# openssl req -new -key dovecot.key  -out dovecot.csr

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

Country Name (2 letter code) [GB]:cn

State or Province Name (full name) [Berkshire]:sh

Locality Name (eg, city) [Newbury]:sh

Organization Name (eg, company) [My Company Ltd]:ll

Organizational Unit Name (eg, section) []:tec

Common Name (eg, your name or your server's hostname) []:imap.sh.com

Email Address []:

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

[root@mail certs]# ll

-rw-r--r-- 1 root root 631 07-25 01:57 dovecot.csr  产生了请求文件

-rw-r--r-- 1 root root 887 07-25 01:53 dovecot.key

[root@mail certs]# openssl ca -in dovecot.csr -out dovecot.crt  颁发证书

[root@mail certs]# ll

总计 12

-rw-r--r-- 1 root root 3053 07-25 01:57 dovecot.crt   产生一个证书文件

-rw-r--r-- 1 root root  631 07-25 01:57 dovecot.csr

-rw-r--r-- 1 root root  887 07-25 01:53 dovecot.key

[root@mail certs]# chmod 600 *    将该目录下所有文件的权限改了

[root@mail certs]# vim /etc/dovecot.conf    编译dovecot的主配置文件

21   protocols =  pop3            去掉之前我们添加的这一行,改为默认配置

91 ssl_cert_file = /etc/dovecot/certs/dovecot.crt   添加dovecot证书的路径

92 ssl_key_file = /etc/dovecot/certs/dovecot.key   添加dovecot密钥的路径

做完之后重启dovecot

[root@mail certs]# service dovecot restart

停止 Dovecot Imap: [确定]

启动 Dovecot Imap: [确定]

[root@mail certs]# netstat -tupln |grep dov   查看dovecot的端口

tcp     0   0 :::993    :::*     LISTEN      5183/dovecot       

tcp     0   0 :::995    :::*     LISTEN      5183/dovecot       

tcp     0  0 :::110    :::*     LISTEN      5183/dovecot       

tcp    0  0 :::143     :::*     LISTEN      5183/dovecot 

这时我们利用客户端给上海的用户发邮件,然后使用该用户接受,并使用wireshark抓接受时的包

[root@mail certs]# tshark -ni eth0 -R "tcp.srcport eq 110 or tcp.dstport eq 110"

Running as user "root" and group "root". This could be dangerous.

Capturing on eth0

115.580578 192.168.20.88 -&gt; 192.168.20.77 POP Response: +OK Dovecot ready.

115.584041 192.168.20.77 -&gt; 192.168.20.88 POP Request: USER user4

115.584105 192.168.20.88 -&gt; 192.168.20.77 TCP 110 &gt; 1176 [ACK] Seq=21 Ack=13 Win=5840 Len=0

115.588781 192.168.20.88 -&gt; 192.168.20.77 POP Response: +OK

115.589361 192.168.20.77 -&gt; 192.168.20.88 POP Request: PASS 123

发现还是能抓获到接收用户的账户密码

现在我们采用加密的方法进行接收:

clip_image022

clip_image024

clip_image026

clip_image028

clip_image030

接着为imap在dns上添加记录:

[root@mail ~]# vim /var/named/chroot/var/named/sh.com.db   编译数据库文件

imap            IN CNAME        mail   添加一条关于imap的记录

完成之后重读数据库文件 rndc  reload

再使用客户端对本地用户发邮件,并接受,然后抓包,因为我们该用imap服务器接受包了,所以抓包是监听的端口是993

[root@mail certs]# tshark -ni eth0 -R "tcp.srcport eq 993 or tcp.dstport eq 993"

25.564050 192.168.20.88 -&gt; 192.168.20.77 TLSv1 Application Data

25.564435 192.168.20.77 -&gt; 192.168.20.88 TLSv1 Application Data

25.594029 192.168.20.88 -&gt; 192.168.20.77 TLSv1 Application Data

25.596274 192.168.20.77 -&gt; 192.168.20.88 TLSv1 Application Data

25.669378 192.168.20.88 -&gt; 192.168.20.77 TCP 993 &gt; 1184 [ACK] Seq=1202 Ack=914 Win=7504 Len=0

25.669655 192.168.20.77 -&gt; 192.168.20.88 TLSv1 Application Data

25.669736 192.168.20.88 -&gt; 192.168.20.77 TCP 993 &gt; 1184 [ACK] Seq=1202 Ack=937 Win=7504 Len=0

25.735889 192.168.20.88 -&gt; 192.168.20.77 TLSv1 Application Data

这时我们发现抓获的包都是被加密的,再没有账户密码信息了

Master    /etc/postfix、master.conf

Smtpd

Smtp 

Local (mda)

      Sendmail   procmail

   Postfix   local

Qmgr  inconing  active    defer

安装包:

postfix-2.3.3-2.1.el5_2.i386.rpm

安装完之后编译主配置文档

主配置文档  /etc/postfix/main.conf

Postconf -n  改变配置

Postconf  -d   默认配置

Master    /etc/postfix/master.conf

Pickup    邮件的分拣

Cleanup    邮件的检测

Linux系统默认是安装了sendmail的,而且是默认的开机启动的,所以需要关闭sendmail

[root@ttttttttt ~]# chkconfig --list |grep sendmail

sendmail        0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭

[root@ttttttttt ~]# service sendmail status   查看sendmail是否正在运行

sendmail (pid  2896) 正在运行...

那么我们就得停止sendmail服务

[root@ttttttttt ~]# service sendmail stop

关闭 sm-client:                                           [确定]

关闭 sendmail:                                            [确定]

[root@ttttttttt ~]# chkconfig sendmail off

[root@ttttttttt ~]# netstat -tupln |grep 25

tcp        0      0 0.0.0.0:111                 0.0.0.0:*           LISTEN      2583/portmap       

udp        0      0 0.0.0.0:36257               0.0.0.0:*                               3003/avahi-daemon: 

udp        0      0 0.0.0.0:111                 0.0.0.0:*                               2583/portmap 

在/etc/目录下就形成了postfix的文件夹

为该邮件服务器搭建dns服务器

更改主机名:

[root@ttttttttt named]# vim /etc/sysconfig/network

NETWORKING=yes

NETWORKING_IPV6=no

HOSTNAME=mail.sh.com

更改dns指向:

[root@ttttttttt named]# vim /etc/resolv.conf

nameserver 192.168.20.66         

[root@ttttttttt named]# chkconfig named on    开机启动dns

然后重启系统

再次登录后我们试着只用postfix发送一封邮件

[root@mail ~]# telnet 127.0.0.1 25

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 mail.sh.com ESMTP Postfix

ehlo mail.sh.com

250-mail.sh.com

250-PIPELINING

250-SIZE 10240000

250-VRFY

250-ETRN

250-ENHANCEDSTATUSCODES

250-8BITMIME

250 DSN

mail from:user1@sh.com

250 2.1.0 Ok

rcpt to:user2@sh.com

250 2.1.5 Ok

data

354 End data with <CR><LF>.<CR><LF>

subject:ok

llllhhhhhhhhh

.

250 2.0.0 Ok: queued as BBD6822A37F

quit

221 2.0.0 Bye

Connection closed by foreign host.

此时这封邮件是可以成功发出并接受的

查看postfix的配置手册

[root@mail ~]# man 5  postconf

进入编辑postfix的 主配置文件

[root@mail ~]# vim /etc/postfix/main.cf

70 myhostname = mail.sh.com     添加邮件服务器的名

  77 mydomain = sh.com           添加邮件服务器的域名

107 inet_interfaces = all    启用监听所有的地址

110 #inet_interfaces = localhost   将只监听本地的禁用了

此时查看监听的端口:

root@mail ~]# netstat -tupln |grep 25

tcp        0      0 0.0.0.0:111     0.0.0.0:*     LISTEN      2597/portmap       

tcp        0      0 0.0.0.0:25       0.0.0.0:*    LISTEN      3898/master        

udp        0      0 0.0.0.0:111      0.0.0.0:*   

但是此时user1给user2发送邮件接受不倒

我们需要在

[root@mail ~]# vim /etc/postfix/main.cf

155 mydestination = $myhostname, localhost.$mydomain, localhost,$mydomain

然后重启postfix后就可以接受到了

做转发中继:(默认情况下从服务器上可以往其他服务器发,而连接的客户端不行)

再编译[root@mail ~]# vim /etc/postfix/main.cf

255 mynetworks = 192.168.20.0/24, 127.0.0.0/8 

将做转发的网段添加进来然后重启postfix就可以了

做本地验证

首先启动sasl验证:

编译main.cf ,使其支持sasl

编译[root@mail sasl2]# vim /etc/postfix/main.cf

文件中添加这几行:

broken_sasl_auth_clients = yes  

smtpd_sasl_auth_enable = yes    启动sasl认证

smtpd_sasl_security_options = noanonymous  安全选项 ,不允许匿名用户

smtpd_sasl_application_name = smtpd   

smtpd_recipient_restrictions =permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

中继设定

做完之后重启postfix,再用本地发邮件试试,发现只有通过认证后的才可以通过它发信,但是其他客户端却可以不通过认证就可以发信,

重新编译[root@mail sasl2]# vim /etc/postfix/main.cf

限定客户端:

smtpd_client_restrictions = permit_sasl_authenticated,reject

Xshell:\&gt; telnet 192.168.20.66 25

Connecting to 192.168.20.66:25...

Connection established.

Escape character is '^@]'.

220 mail.sh.com ESMTP Postfix

mail from:user1@sh.com

250 2.1.0 Ok

rcpt to:user2@sh.com

554 5.7.1 <unknown[192.168.20.22]>: Client host rejected: Access denied

auth login dXNlcjFAc2guY29t

334 UGFzc3dvcmQ6

MTIz

235 2.0.0 Authentication successful

次时postfix邮件服务器我们就配置完成了

(注:cp复制不行的,因为squirrelmail很多文件的路径都是相对路径,如果必须改很多代码后)

[root@mail squirrelmail]# cd /var/www/html/

[root@mail html]# ln -s /usr/share/squirrelmail mail

[root@mail html]# ll

总计 4

-rw-r--r-- 1 root root 42 07-16 02:53 index.html

lrwxrwxrwx 1 root root 23 07-24 15:58 mail -&gt; /usr/share/squirrelmail

配置squirrelmail的默认参数

主要的配置文件时config.php,在aquirrelmail的config目录下,可以手动修改这个文件,也可以使用squirrel为我们准备的配置脚本来定制参数。这个脚本是config目录下的conf.pl,运行这个脚本需要系统的内装有perl的解释器

[root@mail html]# cd mail/

[root@mail mail]# cd config/

[root@mail config]# ll

总计 188

-rw-r--r-- 1 root root  29548 2009-10-05 config_default.php

lrwxrwxrwx 1 root root     45 07-24 14:39 config_local.php -&gt; ../../../../etc/squirrelmail/config_local.php

lrwxrwxrwx 1 root root     39 07-24 14:39 config.php -&gt; ../../../../etc/squirrelmail/config.php

-rwxr-xr-x 1 root root 148706 2009-10-05 conf.pl

-rw-r--r-- 1 root root    492 2009-10-05 index.php

[root@mail config]# ./conf.pl  执行该脚本(注意执行时最好在系统3级别中区设置,不要使用png其他工具)

clip_image032

clip_image034

编译

[root@mail config]# vim /etc/httpd/conf/httpd.conf

747 #AddDefaultCharset UTF-8      禁用该行

然后重启postfix   如果apache没有启动,记得启动

clip_image036

但是登录时会出现报错

此时我们需要安装dovecot ,然后启用它

[root@mail config]# yum install dovecot -y

[root@mail config]# service dovecot start

启动 Dovecot Imap:                                        [确定]

clip_image038

我们把做的那几行关于验证的设置禁用了便可以了:

[root@mail config]# vim /etc/postfix/main.c

#broken_sasl_auth_clients = yes

#smtpd_sasl_auth_enable = yes

#smtpd_sasl_security_options = noanonymous

#smtpd_sasl_application_name = smtpd

#smtpd_recipient_restrictions =permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

#smtpd_client_restrictions = permit_sasl_authenticated,reject

然后重启postfix

[root@mail config]# service postfix restart

关闭 postfix:                                             [确定]

启动 postfix:                                             [确定]

然后再发就可以发出去了,同时也能接受到