一、电子邮件的简介

 电子邮件是因特网上最为流行的应用之一。如同邮递员分发投递传统邮件一样,电子邮件也是异步的,也就是说人们是在方便的时候发送和阅读邮件的,无须预先与别人协同。与传统邮件不同的是,电子邮件既迅速,又易于分发,而且成本低廉。另外,现代的电子邮件消息可以包含超链接、HTML格式文本、图像、声音甚至视频数据。我们将在本文中查看处于因特网电子邮件核心地位的应用层协议。

smtp

  SMTPSimple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把Email寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。

pop3

  POP3(Post Office Protocol 3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。POP3协议是TCP/IP协议族中的一员,,RFC 1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。

imap

Internet Mail Access Protocol(交互式邮件存取协议)IMAP是斯坦福大学在1986年开发的研发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。

电子邮件的种类

我们在选择好邮件服务器硬件后;接着就要考虑邮件软件应用系统,目前在服务器操作系统平台主要有Unix/Linux/Windows三种,Unix平台一般是针对大型企业的,具有对AIXSolaris等操作系统比较熟悉了解的,在此基础上构建企业的邮件系统,这样邮件服务器软件主要代表有SendmailSUNiPlanet Messaging ServerIBMDomino/Notes等。   

SendmailUnix的缺省配置中内置这个软件,只需要设置好操作系统,它就能立即运转起来。在Unix系统中,Sendmail是应用最广的电子邮件服务器软件。它也是一个免费软件,可以支持数千甚至更多的用户,而且占用的系统资源相当少。SUNiPlanet Messaging Server是一个强大的、可靠的、大容量的Internet邮件服务器,是为企业和服务提供商设计的。它采用集中的LDAP数据库存储用户、组和域的信息,支持标准的协议、多域名和Webmail,具有强大的安全和访问控制。

Postfix是一个由IBM资助下由Wietse Venema负责开发的自由软件工程的一个产物,其目的是为用户提供除sendmail之外的邮件服务器选择。Postfix力图做到快速、易于管理、提供尽可能的安全性,同时尽量做到和sendmail邮件服务器保持兼容性以满足用户的使用习惯。起初,Postfix是以VMailer这个名字发布的,后来由于商标上的原因改名为Postfix   Postfix设计中采用了web服务器的的设计技巧以减少进程创建开销,并且采用了其他的一些文件访问优化技术以提高效率,但同时保证了软件的可靠性。Postfix的设计目标就是成为Sendmail的替代者。

拓扑图:

 

二、配置步骤:

1、安装和配置sendmail服务

sendmail-8.13.8-2.el5                       #默认安装

[root@localhost ~]# cd /mnt/cdrom/Server/

rpm -ivh sendmail-cf-8.13.8-2.el5.i386.rpm 

工具m4-1.4.5-3.el5.1.i386.rpm     #sendmail.mc自动改成sengmail.cf

vim /etc/mail/sendmail.mc

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl #监听地址为所有

重启sendmial服务,查看端口和监听地址

[root@localhost mail]# netstat -tupln |grep sendmail

tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      3772/sendmail: ace

vim  /etc/mail/access

Connect:localhost.localdomain             RELAY

Connect:localhost                        RELAY

Connect:127.0.0.1                        RELAY

qq.com                                 OK                      #本地

sina.com                               RELAY        #中继

vim /etc/mail/local-host-names

qq.com                                                                       #域名

mail.qq.com                               #主机名

vim /etc/mail/local-host-names

qq.com

mail.qq.com

2、安装和配置DNS

安装DNS所需软件包

cd /mnt/cdrom/Server

[root@localhost Server]# rpm -ivh bind-9.3.6-4.P1.el5.i386.rpm

[root@localhost Server]# rpm -ivh caching-nameserver-9.3.6-4.P1.el5.i386.rpm

[root@localhost Server]# rpm -ivh bind-chroot-9.3.6-4.P1.el5.i386.rpm

cd /var/named/chroot/etc/

cp -p named.caching-nameserver.conf named.conf

 listen-on port 53 { any; };

 allow-query     { any; };

 allow-query-cache { any; };

forwarders { 192.168.10.20; };         #添加内容,开启转发

match-clients      { any; };

match-destinations { any; };              

dns的区域声明文件

vim /var/named/chroot/etc/named.rfc1912.zones

zone "qq.com" IN {

        type master;

        file "qq.com.zone";

        allow-update { none; };

};

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

        type master;

        file "192.168.10.zone";

        allow-update { none; };

};

cd /var/named/chroot/var/named/

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

cp -p named.local 192.168.10.zone

[root@localhost named]# vim qq.com.zone

[root@localhost named]# vim 192.168.10.zone

 

DNS指向

vim /etc/resolv.conf

search localdomain

nameserver 192.168.10.10

修改主机名称

vim /etc/sysconfig/network

NETWORKING=yes

NETWORKING_IPV6=yes

HOSTNAME=mail.qq.com    

接收服务器MAA

yum -y install dovecot

service dovecot restart

chkconfig dovecot on

启动服务

service sendmail start

service dovecot start

service named start

在服务器上创建账户user1user2,内部客户端互发邮件测试

三、客户端测试:

user1user2发送邮件

 

user2成功收到邮件邮件

mail.sina.com做类似的设置查看双方是否可正常接发邮件 

 

user3可以接受到来自user1的邮件

由于这种方式没有加密,安全性差,我们可以用抓包工具抓取用户的账号信息

yum -y install wireshark-1.0.8-1.el5_3.1.i386.rpm  #安装抓包工具

[root@mail Server]# tashark -ni eth0 -R "tcp.detport eq 110"

 

 

四、利用ssltsl加密传输

vim /etc/pki/tls/openssl.cnf

45 dir             = /etc/pki/CA        #证书路径

88 countryName             = optional

 89 stateOrProvinceName      = optional

 90 organizationName         = optional

cd /etc/pki/CA/

[root@mail CA]# mkdir crl certs newcerts

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

[root@mail CA]# echo "01">serial

[root@mail CA]# openssl genrsa 1024 >private/cakey.pem #为根证书产生钥匙

[root@mail CA]# chmod 600 private/*     #改变私钥文件所在位置的权限           

[root@mail CA]# openssl req -new -key private/cakey.pem -x509 -out cacert.pem –days 3650       #跟机构申请证书

Country Name (2 letter code) [CN]:

State or Province Name (full name) [BEIJING]:

Locality Name (eg, city) [BEIJING]:

Organization Name (eg, company) [SECCERNET]:

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

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

创建存放私有钥匙,请求证书,申请证书存放的位置

[root@mail CA]# mkdir -pv /etc/sendmail/certs

cd /etc/sendmail/certs/

[root@mail certs]# openssl genrsa 1024 >sendmail.key   #产生私钥

[root@mail certs]# openssl req -new -key sendmail.key -out sendmail.csr#利用私钥请求证书

[root@mail certs]# openssl ca -in sendmail.csr -out sendmail.cert#利用请求,得到证书信息

 

证书和服务器的捆绑

vim /etc/mail/sendmail.mc

60 define(`confCACERT_PATH', `/etc/pki/CA')dnl        # CA证书路径

61 define(`confCACERT', `/etc/pki/CA/cacert.pem')dnl

62 define(`confSERVER_CERT', `/etc/sendmail/certs/sendmail.cert')dnl

63 define(`confSERVER_KEY', `/etc/sendmial/certs/sendmail.key')dnl #服务器钥匙位置

134 DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl #启用加密机制

telnet 127.0.0.1  25                                                                               

EHLO 127.0.0.1

250-mail.qq.com Hello localhost.localdomain [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

客户端配置

 

user1user2互发邮件

 

证书验证

 

user2收到加密邮件

 

抓包看是不是可以抓到账号信息

 

在邮件接收服务器上申请证书

mkdir -pv /etc/dovecot/certs

cd /etc/dovecot/certs/

[root@mail certs]# openssl genrsa 1024 >dovecto.key

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

[root@mail certs]# openssl ca -in dovecto.csr -out dovecto.cert

vim /etc/dovecot.conf

22 protocols = pop3s      #只允许加密接受信件

91 ssl_cert_file = /etc/dovecot/certs/dovecto.cert

92 ssl_key_file = /etc/dovecot/certs/dovecto.key

重启服务

service dovecot restart

查看

[root@mail certs]# netstat -tupln |grep dovec

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

再来抓包,不能抓到账号的信息

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

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

Capturing on eth0

 73.323162 192.168.10.33 -> 192.168.10.10 TCP 1346 > 995 [SYN] Seq=0 Win=64240 Len=0 MSS=1460

 73.323663 192.168.10.33 -> 192.168.10.10 TCP 1346 > 995 [ACK] Seq=1 Ack=1 Win=64240 Len=0

 73.325811 192.168.10.33 -> 192.168.10.10 SSL Client Hello

 73.328585 192.168.10.33 -> 192.168.10.10 TLSv1 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message

 73.499762 192.168.10.33 -> 192.168.10.10 TCP 1346 > 995 [ACK] Seq=285 Ack=836 Win=63405 Len=0

 73.501030 192.168.10.33 -> 192.168.10.10 TLSv1 Application Data

客户端配置,这样就可以实现端到端的加密

 

五、邮件身份验证

vim /etc/mail/sendmail.mc

39 define(`confAUTH_OPTIONS', `A y')dnl    #启用验证选项

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

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

启动服务

[root@mail ~]# service saslauthd start           

[root@mail ~]# service sendmail restart

[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.qq.com ESMTP Sendmail 8.13.8/8.13.8; Mon, 10 Sep 2012 14:23:55 +0800

EHLO 127.0.0.1

250-AUTH LOGIN PLAIN

telnet测试

[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.qq.com ESMTP Sendmail 8.13.8/8.13.8; Mon, 10 Sep 2012 14:27:20 +0800

mail from:qq.sina.com

530 5.7.0 Authentication required    #身份验证遭拒绝

验证时必须把账户名和密码改为base64格式

echo  -n "user1@qq.com " | openssl base64

dXNlcjFAcXEuY29t

echo  -n "123 " | openssl base64

MTIz

验证成功,并且可以发送邮件

[root@mail ~]# telnet 127.0.0.1 25

220 mail.qq.com ESMTP Sendmail 8.13.8/8.13.8; Mon, 10 Sep 2012 14:40:33 +0800

AUTH LOGIN dXNlcjFAcXEuY29t

334 UGFzc3dvcmQ6              

MTIz

235 2.0.0 OK Authenticated

mail from:user1@qq.com

250 2.1.0 user1@qq.com... Sender ok

rcpt to:user2@qq.com

250 2.1.5 user2@qq.com... Recipient ok

data

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

subject:hi

hello!

.

客户端测试        

不设置验证,user1直接发送给user2,服务器拒绝要求验证

 

user1选择身份验证

 

user1user2发送发送成功

 

重新抓包,不能得到用户的账号信息

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

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

Capturing on eth0

  0.003777 192.168.10.33 -> 192.168.10.10 TCP 1365 > 25 [SYN] Seq=0 Win=64240 Len=0 MSS=1460

  0.006945 192.168.10.33 -> 192.168.10.10 TCP 1365 > 25 [ACK] Seq=1 Ack=1 Win=64240 Len=0

  0.115456 192.168.10.33 -> 192.168.10.10 SMTP C: EHLO ssc4ccb9baf9a1

  0.117290 192.168.10.33 -> 192.168.10.10 SMTP C: STARTTLS

  0.125214 192.168.10.33 -> 192.168.10.10 SMTP C: \026\003\001\000a