一,sendmail简介
人们在互联网上最常使用的就是电子邮件,很多企业用户也经常使用免费电子邮件系统。本文就以step by step的方式引导用户从sendmail源代码开始构建一个可以满足基本工作需要的邮件系统。
sendmail是最重要的邮件传输代理程序。理解电子邮件的工作模式是非常重要的。一般情况下,我们把电子邮件程序分解成用户代理,传输代理和投递代理。 用户代理用来接受用户的指令,将用户的信件传送至信件传输代理,如:outlook express、foxmail等。而投递代理则从信件传输代理取得信件传送至最终用户的邮箱,如:procmail。
当用户试图发送一封电子邮件的时候,他并不能直接将信件发送到对方的机器上,用户代理必须试图去寻找一个信件传输代理,把邮件提交给它。信件传输代理得到了邮件后,首先将它保存在自身的缓冲队列中,然后,根据邮件的目标地址,信件传输代理程序将找到应该对这个目标地址负责的邮件传输代理服务器, 并且通过网络将邮件传送给它。对方的服务器接收到邮件之后,将其缓冲存储在本地,直到电子邮件的接收者查看自己的电子信箱。
显然,邮件传输是从服务器到服务器的,而且每个用户必须拥有服务器上存储信息的空间(称为信箱)才能接受邮件(发送邮件不受这个限制)。可以看到,一个邮件传输代理的主要工作是监视用户代理的请求,根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之间传输并且将接收到的邮件缓冲或者 提交给最终投递程序。有许多的程序可以作为信件传输代理,但是sendmail是其中最重要的一个,事实证明它可以支持数千甚至更多的用户,而且占用的系统资源相当少。不过,sendmail的配置十分复杂,因此,也有人使用另外的一些工具,如qmail、postfix等等。
当sendmail程序得到一封待发送的邮件的时候,它需要根据目标地址确定将信件投递给对应的服务器,这是通过DNS服务实现的。例如一封邮件的目标地址是ideal@linuxaid.com.cn,那么sendmail首先确定这个地址是用户名(ideal)+机器名(linuxaid.com.cn)的格式,然后,通过查询DNS来确定需要把信件投递给某个服务器。
DNS数据中,与电子邮件相关的是MX记录,例如在linuxaid.com.cn这个域的DNS数据文件中有如下设置:
IN MX 10 mail
IN MX 20 mail1
mail IN A 202.99.11.120
mail1 IN A 202.99.11.121
显然,在DNS中说明linuxaid.com.cn有两个信件交换(MX)服务器,于是,sendmail试图将邮件发送给两者之一。一般来说,排在前面的的MX服务器的优先级别比较高,因此服务 器将试图连接mail.linuxaid.com.cn的25端口,试图将信件报文转发给它。如果成功,你的smtp服务器的任务就完成了,在这以后的任务,将由mail.linuxaid.com.cn来完成。在一般的情况下,mail换器会自动把信件内容转交给目标主机,不过,也存在这样的情况,目标主机(比如linuxaid.com.cn)可能并不存在,或者不执行smtp服务,而是由其mx交换器来执行信件的管理,这时候,最终的信件将保存在mx机器上,直到用户来察看它。
如果DNS查询无法找出对某个地址的MX记录(通常因为对方没有信件交换主机),那么sendmail将是试图直接与来自邮件地址的主机对话并且发送邮件。例如,test@aidgroup.linuxaid.com.cnDNS中没有对应的MX记录,因此sendmail在确定MX交换器失败后,将从DNS取得对方的IP地址并直接和对方对话试图发送邮件。
二,sendmail使用技巧 1、为什么不能配置邮件服务器为open relay的?
如果系统管理员将自己的邮件服务器设置为open relay,将会导致一些垃圾邮件发送者将你的邮件服务器作为转发自圾邮件的中继站,这将使垃圾邮件的接收者将矛头对准你,可能会导致报复性的邮件炸弹;垃圾邮件还能消耗你大量的资源,占用你的带宽。更为糟糕的事情可能是你的名字可能会上了黑名单,成为其他邮件接收者共同抵制的目标,你的邮件将被这些接收者所拒绝。
2、什么是邮件转发(mail relay)
设置好一个email服务器以后,该服务器将具有一个或若干个域名,这时email服务器将监听25号端口,等待远程的发送邮件的请求。网络上其他的mail服务器或者请求发送邮件的MUA(Mail User Agent,如outlook express、foxmail等等)会连接email服务器的25号端口,请求发送邮件,SMTP会话过程一般是从远程标识自己的身份开始,过程如下:
HELO remote.system.domainname
250 qmailserver.domain
MAIL FROM:user@somewherer.net
250 OK
RCPT TO: user1@elsewhere.net
邮件的接收者user1@elsewhere.net中的域名并不一定是本地域名,这时候本地系统可能有两种回答,接受它:
250 OK
或者拒绝接受它:
553 sorry,.that domain isnot in my domain list of allowed recphosts
第一种情况下,本地email服务器是允许relay的,它接收并同意传递一个目的地址不属于本地域名的邮件;而第二种情况则不接收非本地邮件。
email一般都有一个配置文件,其决定了是否接受一个邮件。只有当一个RCPT TO命令中的接收者地址的域名存在于该文件中时,才接受该邮件,否则就拒绝该邮件。若该文件不存在,则所有的邮件将被接受。当一个邮件服务器不管邮件接收者和邮件接收者是谁,而是对所有邮件进行转发(relay),则该邮件服务器就被称为开放转发(open relay)的。当email服务器没有设置转发限制时,其是开放转发的。
3、sendmail如何限制邮件转发
因为Send Mail 为了怕变成广告信转信站所以安装后只线本机上的使用者寄信,要让它为你转信需要修改一点东西。 修改 /etc/mail/access 档案在里面增加下面几行。
localhost RELAY
192.168.1 RELAY
就可以将 192.168.1 网域里的信转出去了。
三,sendmail服务器的搭建:
1,搭建163.com sendmail服务器
实验拓扑
安装dns服务并配置mx记录
[root@station2 ~]# cd /var/named/chroot/etc/
[root@station2 etc]# vim named.conf
图
[root@station2 etc]# vim /etc/named.rfc1912.zones
图
[root@station2 etc]# cd ../var/named/
[root@station2 named]# cp -p localhost.zone 163.com.zone
[root@station2 named]# vim 163.com.zone
[root@station2 named]# service named start
[root@station2 named]# vim /etc/resolv.conf
图
加载sendmail
[root@station2 Server]# mkdir /mnt/cdrom/
[root@station2 Server]# mount /dev/cdrom /mnt/cdrom/
[root@station2 Server]# cd /mnt/cdrom/Server/
[root@station2 Server]# rpm -ivh sendmail-cf-8.13.8-2.el5.i386.rpm
[root@mail Server]# rpm -ivh m4-1.4.5-3.el5.1.i386.rpm
[root@station2 Server]# cd /etc/mail/
[root@station2 mail]# vim sendmail.mc
[root@station2 mail]# vim access
[root@station2 mail]# vim local-host-names
图
[root@station2 mail]# service sendmail restart
测试
[root@mail ~]# mail -s ok user1
jx
.
Cc:
图
[root@mail ~]# cd /mnt/cdrom/Server/
[root@mail Server]# yum install dovecot-1.0.7-7.el5.i386.rpm
[root@mail ~]# useradd user1
[root@mail ~]# passwd user1
[root@mail ~]# useradd user2
[root@mail ~]# passwd user2
查看日志
邮件别名 实现邮件群发
[root@mail ~]# vim /etc/aliases
[root@mail ~]# mail jx
Subject: jx
111111111111111111
图
克隆一台主机 做sina服务器
sh-3.2# cd/var/named/chroot/etc/
sh-3.2#vim named.rfc1912.zones
sh-3.2#cd /var/named/chroot/var/named/
sh-3.2#mv 163.com.zone sina.com.zone
sh-3.2#vim sina.com.zone
sh-3.2#cd /etc/mail
sh-3.2#vim access
图
sh-3.2#vim local-host-names
图
sh-3.2#vim /etc/sysconfig/network
图
[root@mail ~]# userdel -r user1
[root@mail ~]# userdel -r user2
[root@mail ~]# passwd user3
[root@mail ~]# passwd user4
[root@mail ~]# vim /etc/resolv.conf
图
测试图
2,实现163与新浪邮件服务器通信
拓扑图:
[root@mail ~]# vim /var/named/chroot/etc/name.conf
图
在新浪服务器上
[root@mail ~]# vim /var/named/chroot/etc/named.conf
反向解析
[root@mail ~]# cd /var/named/chroot/etc/
[root@mail etc]# vim named.rfc1912.zones
图
[root@mail named]# cp -p named.local 192.168.220.zone
[root@mail named]# vim 192.168.220.zone
新浪
[root@mail etc]# vim named.rfc1912.zones
[root@mail etc]# cd ../var/named/
[root@mail named]# cp -p named.local 192.168.220.zone
[root@mail named]# vim 192.168.220.zone
图
测试
163向新浪发邮件
[root@mail ~]# telnet 127.0.0.1 25
mail from:user1@163.com
rcpt to:user3@sina.com
data
subject:123
111111111111111111111111
.
新浪user3用户接受
[root@mail ~]# su - user3
[user3@mail ~]$ mail
图
3,测试不安全性 用wireshark抓包
[root@mail Server]# yum install
wireshark-1.0.8-1.el5_3.1.i386.rpm
[root@mail Server]# tshark -ni eth0 -R "tcp.dstport eq 110"
安全性考虑首先创建CA详情见本博客其他文章
4,实现加密通信
将一系列私钥证书请求申请证书钥匙放入目录
[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]# vim /etc/mail/sendmail.mc
不安全改权限
[root@mail certs]# chmod 600 *
[root@mail certs]# service sendmail restart
测试
[root@mail certs]# telnet 127.0.0.1 25
ehlo 127.0.0.1
图启用了 starttls
实现了邮件加密
测试邮件客户端
图
抓包图
[root@mail ~]# tshark -ni eth0 -R "tcp.dstport eq 25"
抓包给另一个用户发信
加密的图
接收加密
[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
[root@mail certs]# vim /etc/dovecot.conf
图
[root@mail certs]# service dovecot restart
测试客户端设置 图
抓包[root@mail ~]# tshark -ni eth0 -R "tcp.dstport eq 995 or tcp.srcport eq 995"
实现加密传输
5,实现账号验证
[root@mail Server]# vim /etc/mail/sendmail.mc
[root@mail ~]# service saslauthd start
测试验证机制起来没
再次测试身份验证
测试:用外部主机telnet到服务器上测试
[root@mail ~]# echo -n "user1@163.com" |openssl base64
dXNlcjFAMTYzLmNvbQ==
[root@mail ~]# echo -n "123" |openssl base64
MTIz
查看日志结果
[root@localhost ~]# vim /etc/sysconfig/network
##修改主机名 必须是本地dns域中能解析的主机名
3 HOSTNAME=mail.163.com
测试开台XP虚拟机使用outlook客户端工具
图
与squrrelmail结合
[root@station2 Server]# yum install squirrelmail-1.4.8-5.el5_3.7.noarch.rpm
[root@mail Server]# cd /var/www/html/
[root@mail html]# ln -s /usr/share/squirrelmail/ mail
[root@mail html]# cd mail
[root@mail mail]# cd config/
[root@mail config]# ./conf.pl
此处如果是postfix则需要选择3中sendmail改为smtp
[root@mail config]# vim /etc/httpd/conf/httpd.conf
[root@mail config]# service httpd restart
本文出自 “心欲无痕” 博客,谢绝转载!