邮件服务/Sendmail/Dovecot/Postfix的配置与应用

余二五 2017-11-16

服务器 配置 SSL postfix Access 邮件服务器

 

电子邮件使用的协议:

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.。

wps_clip_image-1057

邮件系统组成部分:

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

wps_clip_image-12170

[lily@station39 ~]$ echo "I am fine, And you?" | mail -s 'Hello' lily

使用telnet来发邮件:

[root@station39 ~]# telnet 127.0.0.1 25

wps_clip_image-23206

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。

wps_clip_image-17277

  lucy:             lily

monkey:           terra ,lucy, lily     //** 群发邮件

我们使用windows 的OutLook Express来发送邮件试试:

工具——账户

wps_clip_image-13284

wps_clip_image-26009

wps_clip_image-31919

wps_clip_image-21498

wps_clip_image-21731

su到lucy用户看下有没有新邮件:

wps_clip_image-26745

但此时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

wps_clip_image-10937

wps_clip_image-27937

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功能添加进去)

wps_clip_image-18912

如果有说明支持startls但并未启用。

下面开始申请证书:

[root@station39 CA]# cd /etc/mail

[root@station39 mail]# mkdir certs

[root@station39 mail]# cd certs

[root@station39 certs]# openssl genrsa 1024 &gt;sendmail_key.pem

[root@station39 certs]# openssl req -new -key sendmail_key.pem -out senmail_cert.csr -days 3655

wps_clip_image-18805

提交签署请求:

[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 发邮件试试:

添加一个新账户:

wps_clip_image-17455

wps_clip_image-30401

wps_clip_image-2358

发送邮件的时候出现的提示,说明已经可以使用SSL加密了:

wps_clip_image-23560

为邮件服务器提供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

wps_clip_image-27376

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发送就会出现如下提示:

wps_clip_image-30286

修改账号属性

wps_clip_image-354

OK!此时已经可以用OE通过验证身份的方式发送邮件了。

PS:在启用sasl功能之后,access的设置就不起效,因为所有的认证都是通过sasl来实现了。

此时,smtp就不再基于IP地址来认证,只需提供账户密码即可。

为dovecot增加SASL功能:pop3----&gt;pop3s  imap-----&gt; imaps

先生成证书:

[root@station39 ~]# mkdir -pv /etc/dovecot/ssl

[root@station39 ~]# cd /etc/dovecot/ssl

[root@station39 ssl]# openssl genrsa 1024 &gt; dovecot.key

[root@station39 ssl]# openssl req -new -key dovecot.key -out dovecot.csr

wps_clip_image-6224

[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,试一下,添加一个账户,作如下配置:

wps_clip_image-11253

要求身份验证:

wps_clip_image-9451

接受邮件使用SSL连接:

wps_clip_image-9923

此时接受邮件就可以使用SSL了。

使用mutt 接收邮件,看到了吧,已经是基于SSL的连接

[root@station39 ssl]# mutt -f imaps://lily@192.168.0.39

或者

[root@station39 ssl]# mutt -f imaps://lily@mail.a.com

wps_clip_image-447

输入lily的密码进入后就可以看到邮件了:

wps_clip_image-6964

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-----&gt;HELO------&gt;mail from------&gt; rcpt to -----&gt; data-----&gt; quit

wps_clip_image-11209

wps_clip_image-3742

修改主配置文件进行限定:

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

保存退出,此时登录时就需要验证身份了。










本文转自 490999122 51CTO博客,原文链接:http://blog.51cto.com/lyp0909/543657,如需转载请自行联系原作者
登录 后评论
下一篇
云攻略小攻
2310人浏览
2019-10-21
相关推荐
使用ZooKeeper实现配置同步
3433人浏览
2016-04-11 11:05:21
Weblogic的架构
1928人浏览
2016-05-24 17:46:56
深入实践Spring Boot导读
2814人浏览
2017-05-02 16:41:00
网管到底要学什么(二)
857人浏览
2017-11-22 20:43:00
0
0
0
1183