基于虚拟账号的邮件系统
什么是邮件系统
要想知道这个问题,首先要了解电子邮件的发展阶段,而电子邮件的发展经过了三个阶段:
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服务器间的对发跟加密
(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
客户端配置:
再接受user1的邮件便可以收到了:
来解决它吧
此时我们知道从服务器内部是能往外发得(刚接受到的那封就是)
在/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" >serial 给它一个起始序列号
产生一个钥匙输出到cakey.pem文件中
[root@mail CA]# echo "01" >serial
[root@mail CA]# openssl genrsa 1024 >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 >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.名称
关于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
>N 1 user4@sh.com Sun Jul 24 20:59 13/401 "hello"
& 客户端收到了邮件,验证成功!!!!
这时我们是outlook客户端试试:
结果是能发出去的,不信可以试试哦!
做验证时。服务器会对客户端传来的服务器名跟账号做双重验证,验证通过的才通过它发信
实现端到端的加密 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 -> 192.168.20.77 POP Response: +OK Dovecot ready.
38.003489 192.168.20.77 -> 192.168.20.88 POP Request: USER user3 这里抓获到接受方账户
38.003822 192.168.20.88 -> 192.168.20.77 POP Response: +OK
38.004056 192.168.20.77 -> 192.168.20.88 POP Request: PASS 123 接受方密码
38.031182 192.168.20.88 -> 192.168.20.77 POP Response: +OK Logged in.
38.031324 192.168.20.77 -> 192.168.20.88 POP Request: STAT
38.033710 192.168.20.88 -> 192.168.20.77 POP Response: +OK 0 0
38.034272 192.168.20.77 -> 192.168.20.88 POP Request: QUIT
38.035143 192.168.20.88 -> 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 >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 -> 192.168.20.77 POP Response: +OK Dovecot ready.
115.584041 192.168.20.77 -> 192.168.20.88 POP Request: USER user4
115.584105 192.168.20.88 -> 192.168.20.77 TCP 110 > 1176 [ACK] Seq=21 Ack=13 Win=5840 Len=0
115.588781 192.168.20.88 -> 192.168.20.77 POP Response: +OK
115.589361 192.168.20.77 -> 192.168.20.88 POP Request: PASS 123
发现还是能抓获到接收用户的账户密码
现在我们采用加密的方法进行接收:
接着为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 -> 192.168.20.77 TLSv1 Application Data
25.564435 192.168.20.77 -> 192.168.20.88 TLSv1 Application Data
25.594029 192.168.20.88 -> 192.168.20.77 TLSv1 Application Data
25.596274 192.168.20.77 -> 192.168.20.88 TLSv1 Application Data
25.669378 192.168.20.88 -> 192.168.20.77 TCP 993 > 1184 [ACK] Seq=1202 Ack=914 Win=7504 Len=0
25.669655 192.168.20.77 -> 192.168.20.88 TLSv1 Application Data
25.669736 192.168.20.88 -> 192.168.20.77 TCP 993 > 1184 [ACK] Seq=1202 Ack=937 Win=7504 Len=0
25.735889 192.168.20.88 -> 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:\> 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 -> /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 -> ../../../../etc/squirrelmail/config_local.php
lrwxrwxrwx 1 root root 39 07-24 14:39 config.php -> ../../../../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其他工具)
编译
[root@mail config]# vim /etc/httpd/conf/httpd.conf
747 #AddDefaultCharset UTF-8 禁用该行
然后重启postfix 如果apache没有启动,记得启动
但是登录时会出现报错
此时我们需要安装dovecot ,然后启用它
[root@mail config]# yum install dovecot -y
[root@mail config]# service dovecot start
启动 Dovecot Imap: [确定]
我们把做的那几行关于验证的设置禁用了便可以了:
[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: [确定]
然后再发就可以发出去了,同时也能接受到
转载于:https://blog.51cto.com/mh3570/991780