电子邮件使用的协议:
SMTP :(Simple Mail Transmission Protocol)简单邮件传输协议 ,监听tcp 25号端口。
POP3 :(Post Office Protocol) 邮局协议 ,监听tcp 110端口。
IMAP4:(Internet Mail Access Protocol) 互联网邮件访问协议,监听tcp 143端口。
MIME:(Multipurpose Internet Mail Extensions)多用途、多功能互联网邮件扩展:以文本的方式对二进制数据做重新编码,并能够实现以文本协议发送二进制数据。常用编码编码方式:base64.。
邮件系统组成部分:
MUA :(Mail User Agent) 邮件用户代理:就是用户与电子邮件系统的接口,在大多数情况下就是在邮件客户端上运行的程序。常见MUA:使用最广泛的基于网页来实现的webmail。其他的有Outlook,Foxmail,thunderbird(雷鸟),Evolution,mutt(基于字符界面)。
MTA :(Mail Transfer Agent)邮件传输代理:主要功能发送和接收邮件,同时向发件人报告邮件的传送情况。根据用途可将邮件服务器分为邮件服务器(SMTP服务器)和接受邮件服务器(POP3/IMAP4服务器)。常用Exchange,lotus Notes Domino (内部使用),互联网上使用较多的软件sendmail(较老),postfix,Qmail(短小精悍)
MDA:(Mail Delivery Agent)邮件投递代理:到本地邮局之后,将邮件放在用户的邮箱中。可以是MTA下面的一个小程序,也可以单独是一个软件例如procmail,maildrop。
MAA:(Mail Access Agent)邮件访问代理:代为MUA提供访问message store并接收邮件功能的一台IMAP/POP3服务器,常用courrier-imap ,dovecot。
SASL:(Simple Authorization Secure Layer)简单认证安全层协议,用于为没有提供认证功能的协议提供认证功能。软件包:cyus-sasl,进程:saslauthd。
整合STMP,clainav(扫描病毒),SpamAssassin(apache提供,扫描垃圾邮件)的工具成称之为caller(调用器)。常见调用器Caller:mimedefang Mailscanner amavisd-new。
邮箱类型:mbox 所有邮件放在同一个文件中,新邮件直接追加在文件后面。
maildir 建一个目录,每一封邮件被当成一个单独文件存放在目录里
redhat默认使用mbox方式,sendmail默认使用mbox,postfix默认两种都支持。
SMIME:提供端到端的邮件加密解密协议。
我们先来简单示范下怎样发邮件:
[root@station39 mail]# useradd lucy
[root@station39 mail]# useradd lily
[root@station39 mail]# echo "redhat" | passwd --stdin lucy
[root@station39 mail]# echo "redhat" | passwd --stdin lily
[root@station39 mail]# su - lucy
[lucy@station39 ~]$ mail -v lily
[lily@station39 ~]$ echo "I am fine, And you?" | mail -s 'Hello' lily
使用telnet来发邮件:
[root@station39 ~]# telnet 127.0.0.1 25
MAIL FROM:lucy@station39.example.com
250 2.1.0 lucy@station39.example.com... Sender ok
RCPT TO:lily@station39.example.com
250 2.1.5 lily@station39.example.com... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
lily,I miss you!
.
250 2.0.0 p2R5fglf012439 Message accepted for delivery
quit
221 2.0.0 station39.example.com closing connection
Connection closed by foreign host.
查看日志:
[root@station39 ~]# tail /var/log/maillog
PS:默认情况下,sendmail已经安装,但sendmail不向外提供服务,要想对外提供服务,需要再安装一个软件包sendmail-cf(提供sendmail.cf这个设置文件的默认整合数据),附属包,提供帮助文档sendmail-doc,还有一个包m4(辅助将sendmail-cf的数据转成实际可用的配置文件)。
[root@station39 ~]# rpm -qa | grep -E "sendmail|m4"
m4-1.4.5-3.el5.1
sendmail-8.13.8-2.el5
[root@station39 ~]# yum install sendmail-cf -y
编辑/etc/mail/sendmail.mc文件
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl //**line 116 提供对外的服务
保存退出,重启服务,再连接下试试,看!已经可以了!
[root@station39 mail]# telnet 192.168.0.39 25
Trying 192.168.0.39...
Connected to station39.example.com (192.168.0.39).
PS:为了服务器的安全,拒绝开放式中继。默认情况下,只允许本机到本机。要中继其他主机发来的邮件我们要用到一个文件access,定义了允许哪些人可以通过这台服务器来发邮件。
Connect:localhost.localdomain RELAY
Connect:localhost RELAY
Connect:127.0.0.1 RELAY
Connect:192.168.0 RELAY
local-host-names:用于界定哪些是本机负责接收的域,哪些不是需要转发出去。正常情况下,需要将本机上的域添加到此文件中确认这些域是本机所负责接收的域。
[root@station39 mail]# vim local-host-names
# local-host-names - include all aliases for your machine here.
station39.example.com
example.com
126.com
邮件别名:/etc/alias,将原本发给lucy的邮件通过在此文件中定义后转发给lily。
lucy: lily
monkey: terra ,lucy, lily //** 群发邮件
我们使用windows 的OutLook Express来发送邮件试试:
工具——账户
su到lucy用户看下有没有新邮件:
但此时window客户端却没法接收邮件,因为我们还没有用来接受邮件的MAA,下面就来演示如何让用户远程接受邮件:
[root@station39 mail]# yum install dovecot -y
主配置文件/etc/dovecot.conf
protocols = pop3 //**默认所提供的服务 line21
# protocol pop3 {
# listen = *:10100
# ..
# } //** 自定义端口
接受下邮件试试:
[root@station39 mail]# telnet 192.168.0.39 110
Trying 192.168.0.39...
Connected to station39.example.com (192.168.0.39).
Escape character is '^]'.
+OK Dovecot ready.
list
user lucy
+OK
list
pass redhat
+OK Logged in.
list
+OK 0 messages:
发件地址伪装:编辑/etc/mail/sendmail.conf
MASQUERADE_AS(`example.com')dnl //** line 160 后面有dnl表示在文件转换的时候
消除多余的空格
FEATURE(masquerade_envelope)dnl //** line 164
FEATURE(allmasquerade)dnl //** 添加一行
重启服务,OK!此时无论你在发邮件的时候地址怎么写,发出去之后都会变成example.com。
下面我们来构建一个基于DNS的完整的邮件系统:
我们这里bind已经安装完毕,直接开始配置:
/etc/named.conf
options {
directory "/var/named";
};
zone "."{
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
};
zone "a.com" IN {
type master;
file "a.com.zone";
};
zone "0.168.192.in-addr.arpa" IN {
type master;
file "0.168.192.zone";
};
[root@station39 named]# chown :named /etc/named.conf
[root@station39 named]# ll /etc/named.conf
-rw-r--r-- 1 root named 404 Mar 28 10:43 /etc/named.conf
/var/named/a/com.zone
$TTL 86400
$ORIGIN a.com.
@ IN SOA a.com. root (
100 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS ns
IN MX 10 mail
ns IN A 192.168.0.39
mail IN A 192.168.0.39
www IN CNAME mail
0.168.192.zone
$TTL 86400
@ IN SOA a.com. root (
100 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS ns.a.com.
39 IN PTR ns.a.com.
39 IN PTR mail.a.com.
[root@station39 named]# chown :named ./*
[root@station39 etc]# hostname mail.a.com //**修改主机名,切记
编辑本地解析记录:/etc/hosts
192.168.0.39 mail.a.com mail
下面开始配置sendmail:
1 编辑sendmail 主配置文件/etc/mail/sendmai.mc
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl //**line 116 提供对外的服务
2 编辑local-host-names文件:
mail.a.com
a.com
3 打开中继功能,编辑access:
Connect:192.168.0 RELAY
4 设置别名(可选)
重启服务。
我们使用另一台主机192.168.0.127连接一下试试,注意这台服务器的DNS一定要指向192.168.0.39。
/etc/resolv.conf
OK!邮件发送完毕,我们返回到邮件服务器上查看一下日志:
[root@station39 mail]# tail /var/log/maillog
Mar 28 11:45:55 station39 sendmail[21990]: p2S3idqc021990: from=lucy@a.com, size=30, class=0, nrcpts=1, msgid=<201103280345.p2S3idqc021990@mail.a.com>, proto=SMTP, daemon=MTA, relay=[192.168.0.127]
Mar 28 11:45:55 station39 sendmail[22019]: p2S3idqc021990: to=lily@a.com, ctladdr=lucy@a.com (3307/3307), delay=00:00:27, xdelay=00:00:00, mailer=local, pri=30390, dsn=2.0.0, stat=Sent
PS:在两台服务器之间互发邮件需要确保sendmail.mc 中
FEATURE(`relay_based_on_MX')dnl 打开。
为邮件服务器添加SMTPS功能:
SMTPS:通过一个独立的端口向用户提供ssl/tls加密的服务,监听端口:465。
STARTLS:通过25号端口同时提供加密/不加密的功能。
[root@station39 mail]# sendmail -d0.1 -bv //**查看sendmail是否支持startls功能(取决于二
进制程序在编译的时候是否将startls功能添加进去)
如果有说明支持startls但并未启用。
下面开始申请证书:
[root@station39 CA]# cd /etc/mail
[root@station39 mail]# mkdir certs
[root@station39 mail]# cd certs
[root@station39 certs]# openssl genrsa 1024 >sendmail_key.pem
[root@station39 certs]# openssl req -new -key sendmail_key.pem -out senmail_cert.csr -days 3655
提交签署请求:
[root@station39 certs]# scp senmail_cert.csr 192.168.0.127:/tmp
切换到192.168.0.127主机上(CA在这台主机上):
签署证书:
[root@server27 tmp]# openssl ca -in senmail_cert.csr -out sendmail_cert.pem
将签署后的证书返回提交申请的机构:
[root@server27 tmp]# scp sendmail_cert.pem 192.168.0.39:/etc/mail/certs
[root@station39 certs]# rm senmail_cert.csr
PS:sendmail要启用ssl功能还须将CA的证书下载下来,放到certs目录下才行。
[root@station39 certs]# scp 192.168.0.127:/etc/pki/CA/cacert.pem ./
[root@station39 certs]# chmod 600 ./*
[root@mail certs]# ll
total 24
-rw------- 1 root root 1200 Mar 28 14:26 cacert.pem
-rw------- 1 root root 3152 Mar 28 14:20 sendmail_cert.pem
-rw------- 1 root root 891 Mar 28 14:11 sendmail_key.pem
三个文件已经准备完毕,到此,证书已经申请成功,下面开始修改配置文件/etc/mail/sendmail.mc:
line60~63
define(`confCACERT_PATH', `/etc/mail/certs')dnl //** CA 证书的存放目录
define(`confCACERT', `/etc/mail/certs/cacert.pem')dnl //**CA 证书的证书文件
define(`confSERVER_CERT', `/etc/mail/certs/sendmail_cert.pem')dnl //** 发给sendmail的证书
define(`confSERVER_KEY', `/etc/mail/certs/sendmail_key.pem')dnl //**私钥文件
DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl //** line 134 监听465端口
define(`confLOG_LEVEL', `14')dnl //** 打开日志功能 line21
保存,重启服务。
使用telnet来验证一下:
[root@station39 certs]# telnet mail.a.com 25
Trying 192.168.0.39...
Connected to mail.a.com (192.168.0.39).
Escape character is '^]'.
220 mail.a.com ESMTP Sendmail 8.13.8/8.13.8; Mon, 28 Mar 2011 14:42:20 +0800
EHLO mail.a.com
250-mail.a.com Hello mail.a.com [192.168.0.39], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-STARTTLS
250-DELIVERBY
OK!看到了吧!已经有startls功能了!
我们使用windows 上的outlook Express 发邮件试试:
添加一个新账户:
发送邮件的时候出现的提示,说明已经可以使用SSL加密了:
为邮件服务器提供SASL功能:
PS:SASL只是说可以认证了,但是本身并不提供认证 机制。
默认已经安装。
编辑/etc/mail/sendmail.mc 启用认证功能:
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl //** line52~53
define(`confAUTH_OPTIONS', `A y')dnl //** line 39 update
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA,M=Ea')dnl //** line 116 必须启用认证
编辑/usr/lib/sasl2/sendmail.conf配置文件:
[root@station39 mail]# cd /usr/lib/sasl2/
[root@station39 sasl2]# vim Sendmail.conf
pwcheck_method:saslauthd
mech_list: login plain
保存,重启服务!
再使用telnet来验证一下:
先对账号和密码做base64位编码
[root@mail ~]# echo -n 'root@a.com' | openssl base64
cm9vdEBhLmNvbQ==
[root@mail ~]# echo -n 'redhat' | openssl base64
cmVkaGF0
mail from:root@a.com
530 5.7.0 Authentication required
AUTH cm9vdEBhLmNvbQ==
504 5.3.3 AUTH mechanism cm9vdEBhLmNvbQ== not available
AUTH LOGIN cm9vdEBhLmNvbQ==
334 UGFzc3dvcmQ6
cmVkaGF0
235 2.0.0 OK Authenticated
mail from:root@a.com
250 2.1.0 root@a.com... Sender ok
rcpt to:lucy@a.com
250 2.1.5 lucy@a.com... Recipient ok
此时再用OE发送就会出现如下提示:
修改账号属性
OK!此时已经可以用OE通过验证身份的方式发送邮件了。
PS:在启用sasl功能之后,access的设置就不起效,因为所有的认证都是通过sasl来实现了。
此时,smtp就不再基于IP地址来认证,只需提供账户密码即可。
为dovecot增加SASL功能:pop3---->pop3s imap-----> imaps
先生成证书:
[root@station39 ~]# mkdir -pv /etc/dovecot/ssl
[root@station39 ~]# cd /etc/dovecot/ssl
[root@station39 ssl]# openssl genrsa 1024 > dovecot.key
[root@station39 ssl]# openssl req -new -key dovecot.key -out dovecot.csr
[root@station39 ssl]# scp dovecot.csr 192.168.0.127:/tmp
CA签署请求,并颁发证书:
[root@server27 tmp]# openssl ca -in dovecot.csr -out dovecot.crt -days 3655
[root@server27 tmp]# scp dovecot.crt 192.168.0.39:/etc/dovecot/ssl
[root@station39 ssl]# chmod 600 ./*
证书准备好了,开始修改/etc/dovecot.conf :
protocols = imaps //**line 21
ssl_cert_file = /etc/dovecot/ssl/dovecot.crt //** line 96~97 add
ssl_key_file = /etc/dovecot/ssl/dovecot.key
保存,重启服务!
使用OE,试一下,添加一个账户,作如下配置:
要求身份验证:
接受邮件使用SSL连接:
此时接受邮件就可以使用SSL了。
使用mutt 接收邮件,看到了吧,已经是基于SSL的连接
[root@station39 ssl]# mutt -f imaps://lily@192.168.0.39
或者
[root@station39 ssl]# mutt -f imaps://lily@mail.a.com
输入lily的密码进入后就可以看到邮件了:
PS:
抓包工具:tshark
[root@station39 ssl]# yum install wireshark -y
[root@mail ~]# tshark -ni eth0 -R "tcp.srcport eq 110 or tcp.dstport eq 110"
可以轻易的抓取到账号。
[root@mail ~]# tshark -ni eth0 -R "tcp.srcport eq 993 or tcp.dstport eq 993"
Postfix邮件服务器的配置
Postfix:模块化设计,每个功能都使用一个独立的进程来实现,尽可能降低给整体系统带来风险。极大兼容了sendmail的配置文件(access,alias等)。
核心进程:master 配置文件master.cf 仅仅是用来协调其他进程如何工作。
守护进程:
smtpd:服务端,监听tcp 25号端口接收客户端发来的邮件,并将它们提交到cleanup进程,
cleanup进程将这些邮件检查后将他们添加到“incoming”队列。
pickup :分拣功能,类似于MSP(邮件提交进程)。
cleanup:清理进程,检查邮件语法是否规范。
qmgr :队列管理器,对队列中的邮件进行排队,清理。按照一定的规则在队列之间进行调配。postfix常见的管理队列:incoming(入栈),active(活动),deferred(延迟)。
smtp:客户端,当服务器发现收件人不是自己所管理的域,需要将邮件转发到其他MTA时,服务器会当做客户端尝试去连接其他的MTA,此时就会用到smtp进程。此进程只要在中继的时候使用。
local:本地投递代理(MDA),软件自带。建议使用maildrop(sendmail默认的有一个第三方软件procmail)
主配置文件:main.cf 记录子进程在运行时所需要的参数文件
PS:关于主配置文件,如果一行有空白会被当做上一行的延续,所以任何一行前边不能有多余的空白,否则会被当做上一行的延续。
任何一个参数在前边定义完之后可以在后边调用
命令:postconf 默认显示正在生效的选项
-n 查看修改过的参数
-d 查看默认参数
-e 修改设定 “$mydomain = b.net”
man 5 postconf 查看main.cf中各 parameter(参数)的使用方法
下面就来安装使用postfix:
切记如果有sendmail的话建议先卸载sendmail。
DNS要运行正常。
[root@mail ~]# rpm -qa | grep sendmail
sendmail-8.13.8-2.el5
sendmail-cf-8.13.8-2.el5
[root@mail ~]# rpm -e sendmail --nodeps
[root@mail ~]# rpm -e sendmail-cf --nodeps
[root@mail ~]# yum install postfix -y
编辑主配置文件:
[root@mail ~]# vim /etc/postfix/main.cf
myhostname = mail.a.com //** 根据此来判断自己所处的域 line 71
mydomain = a.com //** 显式指定自己所在的域 line 79
myorigin = $mydomain //** 地址伪装 可选 line 96
inet_interfaces = all //** 监听端口 line 112
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain //** 本地所负责
接收的邮件 line 157
mynetworks = 192.168.0.0/24,127.0.0.0/8 //** 来自哪些网段的邮件可以提供中继 line 260
保存退出,重启服务。
/etc/postfix/access 类似于sendmail的access功能,我们在这里添加允许中继哪些网段过来的邮件:
[root@mail postfix]# vim access
192.168.0.10 REJECT
192.168.0 OK
PS:与主配置文件中mynetworks 选项重复,二者选其一。
同sendmail一样,access文件定义好之后需要做手动转换:
[root@mail postfix]# postmap access
对发送邮件进行限定:
telnet----->HELO------>mail from------> rcpt to -----> data-----> quit
修改主配置文件进行限定:
smtpd_sender_restrictions = permit_mynetworks,
reject_unauth_destination,check_client_access hash:/etc/postfix/access
保存退出。
[root@mail postfix]# postfix check //**语法检查
基于SASL的认证:
编辑主配置文件添加sasl认证功能:
#mynetworks = 192.168.0.0/24,127.0.0.0/8 //** 注释掉
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = 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
编辑/usr/lib/lib/sasl2/smtpd.conf,默认已经设置好 (sendmail是sendmail.conf )。
pwcheck_method: saslauthd
保存退出,此时登录时就需要验证身份了。