一、简介

         Sendmail是一款运行在Unix平台下的基于简单邮件传输协议smtp的电子邮件消

息传输软件。Sendmail 是最重要的邮件传输代理程序。一般情况下,我们把电子邮件

程序分解成用户代理,传输代理和投递代理。用户代理用来接受用户的指令,将用

户的信件传送至信件传输代理,如:outlook express、foxmail等。而投递代理则从信件

传输代理取得信件传送至最终用户的邮箱,如:procmail。

         邮件传输是从服务器到服务器的,而且每个用户必须拥有服务器上存储信息的

空间(称为信箱)才能接受邮件(发送邮件不受这个限制)。可以看到,一个邮件

传输代理的主要工作是监视用户代理的请求,根据电子邮件的目标地址找出对应的

邮件服务器,将信件在服务器之间传输并且将接收到的邮件缓冲或者提交给最终投

递程序。有许多的程序可以作为信件传输代理,但是sendmail是其中最重要的一个,

事实证明它可以支持数千甚至更多的用户,而且占用的系统资源相当少。不过,

sendmail的配置十分复杂,因此也有人使用另外的一些工具,如qmail、postfix等等。

sendmail工作原理:

1

电子邮件系统的相关术语:

Mua 邮件用户代理

Msa:邮件提交代理

Mta:邮件传输代理

Mda:邮件投递代理

Maa:邮件访问代理

电子邮件系统的相关协议

SMTP

– Simple Mail Transfer Protocol-简单邮件传输协议

– 用于发送和接收邮件

– 端口号25

POP3

– Post Office Protocol v3-邮局协议版本3

– 用于客户端接收邮件

– 端口号110

Imap

网际消息访问协议4,提供邮件下载服务。支持pop所有功能。

Sendmail特点和不足

        如果使用sendmail来构建网站的电子邮件系统,基本上不必费心,因为几乎所有

的Unix的缺省配置中都内置这个软件,只需要设置好操作系统,它就能立即运转起

来。然而,Internet用户的要求更为苛刻,纷纷指出sendmail中包含的各个不足之处。

         第一个重要的缺点是它的安全性较差。由于邮件系统需要处理的是外部发送来

的各种各样的信息,甚至包含一些恶意数据,然而sendmail在大多数系统中都是以

root身份运行,一旦出现问题,就会对系统安全造成严重影响。在这种情况下,要防

止出现安全问题,仅仅依赖程序本身是不可取的,应该从系统结构出发,使程序拥

有的特殊权限限制到最小。

         此外,也是由于其早期的Internet用户数量及邮件数量都相当小,Sendmail的系

统结构并不适合较大的负载,对于高负载的邮件系统,需要对Sendmail进行复杂的调

整。

        使用 Sendmail还会遇到的另一个问题是它的设置相当复杂,对于使用缺省设置

来收发电子邮件,问题并不存在。当管理员打算进行一些特殊设置,以便利用

Sendmail提供的复杂邮件处理能力时,就不得不面对复杂的宏和正则表达式。虽然现

在Sendmail使用了宏预处理程序m4使设置更易于理解一些,但是掌握Sendmail的设置

仍然是对系统管理员的一大挑战。

二、基本配置

案例

拓扑图

1

163.com服务器端配置

安装DNS服务器:

[root@mail ~]# mkdir /mnt/cdrom

[root@mail ~]# mount /dev/cdrom /mnt/cdrom

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

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

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

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

安装完成。

配置DNS服务器:

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

[root@mail etc]# vim named.conf

编辑结果:

14 options {
15         listen-on port 53 { any; };
16         listen-on-v6 port 53 { ::1; };
17         directory       "/var/named";
18         dump-file       "/var/named/data/cache_dump.db";
19         statistics-file "/var/named/data/named_stats.txt";
20         memstatistics-file "/var/named/data/named_mem_stats.txt";
21
22         // Those options should be used carefully because they disab    le port
23         // randomization
24         // query-source    port 53;    
25         // query-source-v6 port 53;
26
27         allow-query     { any; };
28         allow-query-cache { any; };
29 };

36 view localhost_resolver {
37         match-clients      { any; };
38         match-destinations { any; };
39         recursion yes;
40         include "/etc/named.rfc1912.zones";
41 };

[root@mail etc]# vim named.rfc1912.zones

编辑结果:

21 zone "163.com" IN {
22         type master;
23         file "163.com.zone";
24         allow-update { none; };
25 };

[root@mail etc]# cd ../var/named/

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

[root@mail named]# vim 163.com.zone

编辑结果:

1 $TTL    86400
2 @               IN SOA  ns.163.com.       root (
3                                         42              ; serial (d.     adams)
4                                         3H              ; refresh
5                                         15M             ; retry
6                                         1W              ; expiry
7                                         1D )            ; minimum
8
9                 IN NS           ns.163.com.
10 ns              IN A            192.168.101.2
11 mail            IN A            192.168.101.2
12 pop3          IN CNAME        mail
13 smtp          IN CNAME        mail
14 @               IN MX 10        mail

[root@mail named]# service named start
启动 named:                                               [确定]
[root@mail named]# chkconfig named on

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

编辑结果:

nameserver 192.168.101.2

DNS服务器配置完成。

安装Sendmail-cf:

[root@mail ~]# mount /dev/cdrom /mnt/cdrom

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

[root@mail Server]# rpm -ivh sendmail-cf-8.13.8-2.el5.i386.rpm

安装完成。

修改sendmail配置:

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

[root@mail mail]# vim sendmail.mc

编辑结果:

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

[root@mail mail]# vim access

编辑结果:

Connect:localhost.localdomain           RELAY
Connect:localhost                            RELAY
Connect:127.0.0.1                           RELAY
Connect:192.168.101                      RELAY
sina.com                                         RELAY
163.com                                         OK

[root@mail mail]# vim local-host-names

编辑结果:

# local-host-names - include all aliases for your machine here.
163.com
mail.163.com

[root@mail mail]# service sendmail restart

修改配置完成。

安装接收代理dovecot:

[root@mail Server]# rpm -ivh perl-DBI-1.52-2.el5.i386.rpm

[root@mail Server]# rpm -ivh mysql-5.0.77-3.el5.i386.rpm

[root@mail Server]# rpm -ivh dovecot-1.0.7-7.el5.i386.rpm

[root@mail Server]# service dovecot start
启动 Dovecot Imap:                                        [确定]

[root@mail Server]# chkconfig dovecot on

安装完成。

实现群发功能:

[root@mail Server]# vim /etc/aliases  //不安全,慎用

添加用户:

[root@mail ~]# useradd user1

[root@mail ~]# passwd user1

[root@mail ~]# useradd user2

[root@mail ~]# passwd user2

163.com服务器端配置完成。

sina.com服务器端配置

安装DNS服务器:

[root@mail ~]# mkdir /mnt/cdrom

[root@mail ~]# mount /dev/cdrom /mnt/cdrom

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

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

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

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

安装完成。

配置DNS服务器:

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

[root@mail etc]# vim named.conf

编辑结果:

14 options {
15         listen-on port 53 { any; };
16         listen-on-v6 port 53 { ::1; };
17         directory "/var/named";
18         dump-file "/var/named/data/cache_dump.db";
19         statistics-file "/var/named/data/named_stats.txt";
20         memstatistics-file "/var/named/data/named_mem_stats.txt";
21
22         // Those options should be used carefully because they disab le port
23         // randomization
24         // query-source port 53;
25         // query-source-v6 port 53;
26
27        allow-query { any; };
28        allow-query-cache { any; };
29 };

36 view localhost_resolver {
37         match-clients { any; };
38         match-destinations { any; };
39         recursion yes;
40         include "/etc/named.rfc1912.zones";
41 };

[root@mail etc]# vim named.rfc1912.zones

编辑结果:

21 zone "sina.com" IN {
22          type master;
23          file "sina.com.zone";
24          allow-update { none; };
25 };

[root@mail etc]# cd ../var/named/

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

[root@mail named]# vim sina.com.zone

编辑结果:

1 $TTL 86400
2 @                     IN SOA    ns.sina.com.          root (
3                                                    42               ; serial (d. adams)
4                                                    3H               ; refresh
5                                                  15M               ; retry
6                                                   1W               ; expiry
7                                                  1D )               ; minimum
8
9                         IN NS       ns.sina.com.
10 ns                   IN A         192.168.101.4
11 mail                 IN A         192.168.101.4
12 pop3               IN CNAME   mail
13 smtp               IN CNAME    mail
14 @                   IN MX 10     mail

[root@mail named]# service named start
启动 named: [确定]
[root@mail named]# chkconfig named on

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

编辑结果:

nameserver 192.168.101.4

DNS服务器配置完成。

安装Sendmail-cf:

[root@mail ~]# mount /dev/cdrom /mnt/cdrom

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

[root@mail Server]# rpm -ivh sendmail-cf-8.13.8-2.el5.i386.rpm

安装完成。

修改sendmail配置:

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

[root@mail mail]# vim sendmail.mc

编辑结果:

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

[root@mail mail]# vim access

编辑结果:

Connect:localhost.localdomain    RELAY
Connect:localhost                     RELAY
Connect:127.0.0.1                    RELAY
Connect:192.168.101                RELAY
sina.com                                   OK
163.com                                   RELAY

[root@mail mail]# vim local-host-names

编辑结果:

# local-host-names - include all aliases for your machine here.
sina.com
mail.sina.com

[root@mail mail]# service sendmail restart

修改配置完成。

安装接收代理dovecot:

[root@mail Server]# rpm -ivh perl-DBI-1.52-2.el5.i386.rpm

[root@mail Server]# rpm -ivh mysql-5.0.77-3.el5.i386.rpm

[root@mail Server]# rpm -ivh dovecot-1.0.7-7.el5.i386.rpm

[root@mail Server]# service dovecot start
启动 Dovecot Imap: [确定]

[root@mail Server]# chkconfig dovecot on

安装完成。

添加用户:

[root@mail ~]# useradd user3

[root@mail ~]# passwd user3

[root@mail ~]# useradd user4

[root@mail ~]# passwd user4

sina.com服务器端配置完成。

 

三、安全问题

1.机密性问题

      由于Sendmail开发时Internet的用户还很少,安全性并没有得到重视,所以它的

安全性较差。因此需要采取一些措施来增加它的安全性,可以采用CA证书身份验证的

方法。

方法如下所示:

创建邮件验证密钥:

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

编辑结果:

43 [ CA_default ]
44
45 dir             = /etc/pki/CA           # Where everything is kept
46 certs          = $dir/certs             # Where the issued certs are kept
47 crl_dir        = $dir/crl                 # Where the issued crl are kept
48 database    = $dir/index.txt       # database index file.

87 [ policy_match ]
88 countryName                 = optional
89 stateOrProvinceName      = optional
90 organizationName           = optional
91 organizationalUnitName   = optional
92 commonName                = supplied
93 emailAddress                 = optional

134 [ req_distinguished_name ]
135 countryName                         = Country Name (2 letter code)
136 countryName_default              = CN
137 countryName_min                   = 2
138 countryName_max                  = 2
139
140 stateOrProvinceName                = State or Province Name (full name)
141 stateOrProvinceName_default     = HENAN
142
143 localityName                       = Locality Name (eg, city)
144 localityName_default            = ZHENGZHOU

创建相应文件夹:

[root@mail ~]# 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 –days

3650 -out cacert.pem

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

[root@mail CA]# cd /etc/mail/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

[root@mail certs]# chmod 600 *

证书和服务器捆绑:

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

编辑结果:

60 define(`confCACERT_PATH', `/etc/pki/CA')dnl
61 define(`confCACERT', `/etc/pki/CA/cacert.pem')dnl
62 define(`confSERVER_CERT', `/etc/mail/certs/sendmail.cert')dnl

63 define(`confSERVER_KEY', `/etc/mail/certs/sendmail.key')dnl

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

[root@mail certs]# service sendmail restart

dovecot证书的创建与签发:

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

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

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

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

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

证书和dovecot捆绑:

[root@mail certs]# vim /etc/dovecot.conf

编辑结果:

20 protocols = pop3s

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

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

[root@mail certs]# service dovecot restart

2.防垃圾邮件

        防垃圾邮件可以采用身份验证的方法,可以借助sasl软件进行身份验证。

方法如下所示:

[root@mail ~]# service saslauthd start

[root@mail ~]# chkconfig saslauthd on

[root@mail ~]# 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 LO    GIN PLAIN')dnl

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

[root@mail ~]# service sendmail restart

测试:

[root@mail ~]# telnet 127.0.0.1 25

mail from:user1@163.com
530 5.7.0 Authentication required
auth login dXNlcjFAMTYzLmNvbQ==
334 UGFzc3dvcmQ6
MTIz

登录的用户名和口令需要转换为base64编码:

[root@mail ~]# echo -n "user1@163.com" |openssl base64
dXNlcjFAMTYzLmNvbQ==
[root@mail ~]# echo -n "123" |openssl base64
MTIz

3.防病毒