一、电子邮件的简介
电子邮件是因特网上最为流行的应用之一。如同邮递员分发投递传统邮件一样,电子邮件也是异步的,也就是说人们是在方便的时候发送和阅读邮件的,无须预先与别人协同。与传统邮件不同的是,电子邮件既迅速,又易于分发,而且成本低廉。另外,现代的电子邮件消息可以包含超链接、HTML格式文本、图像、声音甚至视频数据。我们将在本文中查看处于因特网电子邮件核心地位的应用层协议。
smtp
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。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)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。
电子邮件的种类
我们在选择好邮件服务器硬件后;接着就要考虑邮件软件应用系统,目前在服务器操作系统平台主要有Unix/Linux/Windows三种,Unix平台一般是针对大型企业的,具有对AIX、Solaris等操作系统比较熟悉了解的,在此基础上构建企业的邮件系统,这样邮件服务器软件主要代表有Sendmail、SUN的iPlanet Messaging Server、IBM的Domino/Notes等。
Sendmail是Unix的缺省配置中内置这个软件,只需要设置好操作系统,它就能立即运转起来。在Unix系统中,Sendmail是应用最广的电子邮件服务器软件。它也是一个免费软件,可以支持数千甚至更多的用户,而且占用的系统资源相当少。SUN的iPlanet 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
在服务器上创建账户user1和user2,内部客户端互发邮件测试
三、客户端测试:
user1给user2发送邮件
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"
四、利用ssl和tsl加密传输
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
客户端配置
user1与user2互发邮件
证书验证
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选择身份验证
user1向user2发送发送成功
重新抓包,不能得到用户的账号信息
[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