编译安装postfix+sasl+mysql+dovecot+extmail构建完成的邮件系统(一)

编译安装postfix

    在之前的文章我增提到过,目前linux常用的MTA软件有sendmail,qmail,exim,postfix。虽然目前使用最多的MTA是sendmail,但是sendmail实现的功能远没有postfix功能强大,而且postfix兼容sendmail,执行效率比sendmail更高,也更安全,postfix采用模块化设计。因此,由于具有众多的优点,postfix越来越流行。因此,此章主要是介绍如何使用postfix来搭建一台服务器,并使用sasl来为客户端提供认证功能。

 

使用postfix搭建邮件服务器步骤如下:

一、安装postfix前需要准备的事项:

1、我想大家都发过邮件的,在发送邮件的时候,我们一般指定收件人的格式是这样的:user@domain,

因此,当客户在发送一封邮件时,首先会到DNS服务器中查找该domain内的MX记录,并由MX记录找到这个domain内的邮件服务器(也就是该MX主机的A记录)。因此在安装前,需要配置好DNS的相关参数,在这里我不在详述如何来配置这些,只需要在该domain配置好MX,A,PTR记录(邮件服务器支持反向解析)即可。假设这里的domain为xsl.com,邮件服务器为mail.xsl.com,对于的A记录为192.168.108.251

 

2、安装以下开发所用到的rpm包组:

Development Libraries

Development Tools

Legacy Software Development

X Software Development

 

3、安装所需的rpm包,这包括以下这些:

httpd, mysql, mysql-server, mysql-devel, openssl-devel, dovecot, perl-DBD-MySQL, tcl, tcl-devel, libart_lgpl, libart_lgpl-devel, libtool-ltdl, libtool-ltdl-devel, expect

 

4、关闭sendmail(默认系统的邮件服务器软件是sendmail,且是开启的),并将它随系统开机自动启动的功能关闭

#service sendmail stop

#chkconfig sendmail off

 

 

二、安装mysql-5.5.28

1、准备数据存放的文件系统

 

新建一个逻辑卷,并将其挂载至特定目录即可。这里不再给出过程。

 

这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录。

 

2、新建用户以安全方式运行进程:

 

# groupadd -r mysql

# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql

# chown -R mysql:mysql /mydata/data

 

3、安装并初始化mysql-5.5.28

#tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local

#cd  /usr/local

#ln -sv mysql-5.5.28-linux2.6-i686  mysql

#cd mysql

#chown -R  mysql:mysql  .

#scripts/mysql_install_db --user=mysql --datadir=/mydata/data   

(#以mysql的身份来初始化数据库并指定数据的存放位置)

#chown  -R  root   .  #(将mysql目录的属主改为root,防止mysql进程被攻破,将具有mysql的一切权限)

 

4、为mysql通过配置文件

#cd  /usr/local/mysql

#cp support-files/my-large.cnf  /etc/my.cnf

说明:这个目录下有多个配置文件,需要根据自己的内存来选择

这些配置文件有(在/usr/local/mysql/support-files目录下),my-small.cnf、my-medium.cnf、my-large.cnf、my-huge.cnf等等。我这里选择的是my-large.cnf作为我的配置文件

并且编辑/etc/my.cnf,找到[mysqld]的这一段落,修改thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行:
thread_concurrency = 2

另外还需要添加如下行指定mysql数据文件的存放位置:
datadir = /mydata/data

 

在这里说明一下。mysql的配置文件有多个,因此mysql在加载配置文件的顺序是:

/etc/my.cnf---->/etc/mysql/my.cnf--->$BASEDIR/my.cnf--->~/.my.cnf

 

5、为mysql通过Sysv服务脚本

#cd /usr/local/mysql

#cp support-files/mysql.server  /etc/rc.d/init.d/mysqld

#chmod +x  /etc/rc.d/init.d/mysqld

 

6、添加至服务列表

chkconfig  --add  mysqld

如果想让mysqld开机自动启动,可以使用chkconfig  mysqld   on命令来实现

 

通过上述6步就完成mysql的安装了,并且也可以进行测试了。

 

为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:
7、输出mysql的man手册至man命令的查找路径:

编辑/etc/man.config,添加如下行即可:
MANPATH  /usr/local/mysql/man

 

8、输出mysql的头文件至系统头文件路径/usr/include:

这可以通过简单的创建链接实现:
# ln -sv /usr/local/mysql/include  /usr/include/mysql

 

9、输出mysql的库文件给系统库查找路径:

# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf

而后让系统重新载入系统库:
# ldconfig

 

9、修改PATH环境变量,让系统可以直接使用mysql的相关命令

可以在/etc/profile.d/目录下创建以*.sh结尾的文件

#vim  /etc/profile.d/mysqld.sh

#添加如下行:

export  PATH=$PATH:/usr/local/mysql/bin

这样mysql就可以直接使用它的相关命令了,不需要输入绝对路径来使用

 


三、安装配置postfix

1、安装postfix

# groupadd -g 2525 postfix
# useradd -g postfix -u 2525 -s /sbin/nologin -M postfix
# groupadd -g 2526 postdrop
# useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop

 

# tar zxvf postfix-2.9.9.tar.gz
# cd postfix-2.9.9

# make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl  -DUSE_TLS ' 'AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2  -lssl -lcrypto'

# make
# make install

 

 

按照以下的提示输入相关的路径([]号中的是缺省值,”]”后的是输入值,省略的表示采用默认值)

  install_root: [/] /
  tempdir: [/root/postfix-2.9.3] /tmp/postfix
  config_directory: [/etc/postfix] /etc/postfix
  daemon_directory: [/usr/libexec/postfix]
  command_directory: [/usr/sbin]
  queue_directory: [/var/spool/postfix]
  sendmail_path: [/usr/sbin/sendmail]
  newaliases_path: [/usr/bin/newaliases]
  mailq_path: [/usr/bin/mailq]
  mail_owner: [postfix]
  setgid_group: [postdrop]  
    html_directory: [no]/var/www/html/postfix
    manpages: [/usr/local/man]
    readme_directory: [no]

 

 #  newaliases

#这个目录主要是将/etc/aliases转换成/etc/aliases.db,这样MTA读取数据库格式的文件效率更高

#在postfix-2.9.9.tar.gz版本中,不需要执行该命令

#只要每次修改了/etc/aliases文件就需要执行该命令


 

 2、配置postfix的主配置文件

 

# vim /etc/postfix/main.cf
修改以下几项为您需要的配置
myhostname = mail.xsl.com

myorigin = xsl.com

mydomain = xsl.com

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.108.0/24, 127.0.0.0/8

说明:
myorigin参数用来指明发件人所在的域名,即做发件地址伪装;
mydestination参数指定postfix接收邮件时收件人的域名,即您的postfix系统要接收到哪个域名的邮件;
myhostname 参数指定运行postfix邮件系统的主机的主机名,默认情况下,其值被设定为本地机器名;
#如果在此处将myhostname修改了,在/etc/sysconfig/network文件中也要相应的修改hostname值。

mydomain 参数指定您的域名,默认情况下,postfix将myhostname的第一部分删除而作为mydomain的值;
mynetworks 参数指定你所在的网络的网络地址,postfix系统根据其值来区别用户是远程的还是本地的,如果是本地网络用户则允许其访问;如果不是本地,则不允许中继
inet_interfaces 参数指定postfix系统监听的网络接口;

relay_domains:表示对哪些些目标主机开发中继功能。默认该值为$mydestinations

注意:
1、在postfix的配置文件中,参数行和注释行是不能处在同一行中的;
2、任何一个参数的值都不需要加引号,否则,引号将会被当作参数值的一部分来使用;
3、每修改参数及其值后执行 postfix reload 即可令其生效;但若修改了inet_interfaces,则需重新启动postfix;
4、如果一个参数的值有多个,可以将它们放在不同的行中,只需要在其后的每个行前多置一个空格即可;postfix会把第一个字符为空格或tab的文本行视为上一行的延续;

 

四、为postfix提供SysV服务脚本/etc/rc.d/init.d/postfix,内容如下(#END 之前):
#!/bin/bash
#
# postfix      Postfix Mail Transfer Agent
#
# chkconfig: 2345 80 30
# description: Postfix is a Mail Transport Agent, which is the program \
#              that moves mail from one machine to another.
# processname: master
# pidfile: /var/spool/postfix/pid/master.pid
# config: /etc/postfix/main.cf
# config: /etc/postfix/master.cf

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ $NETWORKING = "no" ] && exit 3

[ -x /usr/sbin/postfix ] || exit 4
[ -d /etc/postfix ] || exit 5
[ -d /var/spool/postfix ] || exit 6

RETVAL=0
prog="postfix"

start() {
 # Start daemons.
 echo -n $"Starting postfix: "
        /usr/bin/newaliases >/dev/null 2>&1
 /usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
 RETVAL=$?
 [ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix
        echo
 return $RETVAL
}

stop() {
  # Stop daemons.
 echo -n $"Shutting down postfix: "
 /usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure $"$prog stop"
 RETVAL=$?
 [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix
 echo
 return $RETVAL
}

reload() {
 echo -n $"Reloading postfix: "
 /usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure $"$prog reload"
 RETVAL=$?
 echo
 return $RETVAL
}

abort() {
 /usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prog abort"
 return $?
}

flush() {
 /usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog flush"
 return $?
}

check() {
 /usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog check"
 return $?
}

restart() {
 stop
 start
}

# See how we were called.
case "$1" in
  start)
 start
 ;;
  stop)
 stop
 ;;
  restart)
 stop
 start
 ;;
  reload)
 reload
 ;;
  abort)
 abort
 ;;
  flush)
 flush
 ;;
  check)
 check
 ;;
  status)
   status master
 ;;
  condrestart)
 [ -f /var/lock/subsys/postfix ] && restart || :
 ;;
  *)
 echo $"Usage: $0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"
 exit 1
esac

exit $?

# END

 

为此脚本赋予执行权限:
# chmod +x /etc/rc.d/init.d/postfix

将postfix服务添加至服务列表:
# chkconfig --add postfix

设置其开机自动启动:
# chkconfig postfix on

使用此脚本重新启动服务,以测试其能否正常执行:
# service postfix restart

此时可使用本地用户测试邮件收发了。

 

 

五、postfix生成的文件

/etc/postfix/main.cf是postfix的主配置文件

/etc/postfix/master.cf规定了postfix每个程序的运作参数

/etc/postfix/access设定对哪些源和目的主机开发中继功能

/etc/aliases:邮件别名文件

/usr/sbin/postconf:可以用来查看postfix的设定数据的相关信息

                            其中-d:显示主配置文件设定的默认参数

                                     -n:显示主配置文件修改过的参数信息

                                     -m:显示postfix支持的查找表类型

                                     -A:显示支持的SASL客户端插件类型

                                     -a:服务器端支持的SASL插件类型

                                     -e:PARMATER=VALUE,用来更改配置参数,且保存在main.cf文件中

/usr/sbin/postfix:postfix的二进制程序

                            check:用来检查postfix相关文件、权限是否正确

                            start:启动postfix

                            stop:关闭postfix

                            restart:重启postfix

                            reload:重新读取配置文件,即读取/etc/postfix/main.cf

/usr/sbin/postalias:设定数据库别名的指令,因为 MTA 读取数据库格式的档案效能较佳

/usr/sbin/postmap:这个指令的用法与 postalias 类似,不过他主要在转换 /etc/postfix/access 这个档案的数据库啦!

 

六、为postfix服务开启用户别名支持:

1、在配置文件开启基于hash的别名文件支持

在main.cf中,找到如下指令,而后启用它(即移除前面的#号):
#alias_maps = hash:/etc/aliases

2、在/etc/aliases文件中定义新的别名项,其格式通常为以冒号隔开的两个字段,前一个字段为初始目标邮件地址,后一个字段为实际发往的地址,如:
redhat: xsl

[email protected][email protected]

3、将/etc/aliases转换为hash格式:
# postalias  /etc/aliases

#第三步执行newaliases也行
4、让postfix重新载入配置文件,即可进行测试;

 

七、实现postfix基于客户端的访问控制

1、基于客户端的访问控制概览

postfix内置了多种反垃圾邮件的机制,其中就包括“客户端”发送邮件限制。客户端判别机制可以设定一系列客户信息的判别条件:
smtpd_client_restrictions    用来限制客户端来源的,允许哪些客户端发送邮件,哪些不能发送
smtpd_data_restrictions      用来限制data的数据内容
smtpd_helo_restrictions        用来限制helo阶段的内容
smtpd_recipient_restrictions    用来限制向rcpt  to阶段的目标地址发送邮件

smtpd_sender_restrictions        用来限制mail from阶段的来源主机发送邮件

    

上面的每一项参数分别用于检查SMTP会话过程中的特定阶段,即客户端提供相应信息的阶段,如当客户端发起连接请求时,postfix就可以根据配置文件中定义的smtpd_client_restrictions参数来判别此客户端IP的访问权限。相应地,smtpd_helo_restrictions则用于根据用户的helo信息判别客户端的访问能力等等。

如果DATA命令之前的所有内容都被接受,客户端接着就可以开始传送邮件内容了。邮件内容通常由两部分组成,前半部分是标题(header),其可以由header_check过滤,后半部分是邮件正文(body),其可以由check_body过滤。这两项实现的是邮件“内容检查”。

postfix的默认配置如下:
smtpd_client_restrictions =
smtpd_data_restrictions =
smtpd_end_of_data_restrictions =
smtpd_etrn_restrictions =
smtpd_helo_restrictions =
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
smtpd_sender_restrictions =

这限制了只有mynetworks参数中定义的本地网络中的客户端才能通过postfix转发邮件,其它客户端则不被允许,从而关闭了开放式中继(open relay)的功能。

Postfix有多个内置的限制条件,如上面的permit_mynetworks和reject_unauth_destination,但管理员也可以使用访问表(access map)来自定义限制条件。自定义访问表的条件通常使用check_client_access, check_helo_access, check_sender_access, check_recipient_access进行,它们后面通常跟上type:mapname格式的访问表类型和名称。其中,check_sender_access和check_recipient_access用来检查客户端提供的邮件地址,因此,其访问表中可以使用完整的邮件地址,如[email protected];也可以只使用域名,如xsl.com;还可以只有用户名的部分,如marion@。

访问表可以自行定义,默认的访问表为/etc/postfix/access

 

2、实现示例1

这里以禁止192.168.108.20这台主机通过工作在192.168.108.251上的postfix服务发送邮件为例演示说明其实现过程。访问表使用hash的格式。

(1)首先,编辑/etc/postfix/access文件,以之做为客户端检查的控制文件,在里面定义如下一行:
172.16.100.200  REJECT

(2)将此文件转换为hash格式
# postmap /etc/postfix/access

(3)配置postfix使用此文件对客户端进行检查
编辑/etc/postfix/main.cf文件,添加如下参数:
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access

(4)让postfix重新载入配置文件即可进行发信控制的效果测试了。

 

3、实现示例2

这里以禁止通过本服务器向microsoft.com域发送邮件为例演示其实现过程。访问表使用hash的格式。
(1)首先,建立/etc/postfix/denydstdomains文件(文件名任取),在里面定义如下一行:
microsoft.com  REJECT

(2)将此文件转换为hash格式
# postmap /etc/postfix/denydstdomains

(3)配置postfix使用此文件对客户端进行检查
编辑/etc/postfix/main.cf文件,添加如下参数:
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/denydstdomains, permit_mynetworks, reject_unauth_destination

(4)让postfix重新载入配置文件即可进行发信控制的效果测试了。

 

 

4、检查表格式的说明

hash类的检查表都使用类似如下的格式:
pattern   action

检查表文件中,空白行、仅包含空白字符的行和以#开头的行都会被忽略。以空白字符开头后跟其它非空白字符的行会被认为是前一行的延续,是一行的组成部分。

(1)关于pattern
其pattern通常有两类地址:邮件地址和主机名称/地址。

邮件地址的pattern格式如下:
user@domain  用于匹配指定邮件地址;
domain.tld   用于匹配以此域名作为邮件地址中的域名部分的所有邮件地址;
user@     用于匹配以此作为邮件地址中的用户名部分的所有邮件地址;

主机名称/地址的pattern格式如下:
domain.tld   用于匹配指定域及其子域内的所有主机;
.domain.tld   用于匹配指定域的子域内的所有主机;
net.work.addr.ess
net.work.addr
net.work
net        用于匹配特定的IP地址或网络内的所有主机;
network/mask  CIDR格式,匹配指定网络内的所有主机;

(2)关于action

接受类的动作:
OK   接受其pattern匹配的邮件地址或主机名称/地址;
全部由数字组成的action   隐式表示OK;

拒绝类的动作(部分):
4NN text
5NN text
    其中4NN类表示过一会儿重试;5NN类表示严重错误,将停止重试邮件发送;421和521对于postfix来说有特殊意义,尽量不要自定义这两个代码;
REJECT optional text...   拒绝;text为可选信息;
DEFER optional text...    拒绝;text为可选信息;

 

八、安装dovecot支持pop3、imap4协议来接受邮件

使用rpm  install  dovecot安装dovecot软件

安装完成后,其主配置文件是/etc/dovecot.conf

修改这个文件中的protocol  = pop3, imap4这一行,让其支持pop3和imap4协议

脚本文件是/etc/rc.d/init.d/dovecot

执行chkconfig --add  dovecot

        chkconfig  dovecot  on

        service dovecot  start

在命令行中收取邮件,需要使用如下命令:

telnet  mail.xsl.com  110

USER  hadoop

PASS hadoop

LIST    列出收取的邮件

RETR num  读取哪一封邮件

 

由于dovecot携带了SASL功能,因此可以使用SASL来对客户端进行认证

 


九、为postfix开启基于cyrus-sasl的认证功能

使用以下命令验正postfix是否支持cyrus风格的sasl认证,如果您的输出为以下结果,则是支持的:
# /usr/local/postfix/sbin/postconf  -a
cyrus
dovecot

 

sasl的主配置文件是/etc/sysconfig/saslauthd

脚本文件是/etc/rc.d/init.d/saslauthd

使用saslauthd -v:显示当前主机saslauthd服务所支持的认证机制,默认为pam,在这里我们可以修改一下为shadow认证,那么它就会去查找shadow文件来验证认证是否正确

 

启动sasl认证

#chkconfig --add sasl

#chkconfig  sasl  on

#service sasl start

 

#vim /etc/postfix/main.cf
添加以下内容:
############################CYRUS-SASL############################
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname

        表示哪些客户端不需要经过sasl认证
smtpd_sasl_security_options = noanonymous
smtpd_sasl_path = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!

        其中permit_sasl_authenticated表示允许通过了sasl认证的用户发送邮件

        说明:postfix默认转发一下邮件:

                    来自$mynetworks中地址发送的邮件

                    去往$relay_domains中的域或子域的邮件,默认值为$destinations

 

该文件主要是定义postfix是如何使用sasl进行认证的

# vim /usr/lib/sasl2/smtpd.conf
添加如下内容:
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

 

让postfix重新加载配置文件
#/usr/sbin/postfix reload

 

最后使用telnet  192.168.108.251 25进行测试时

出现如下两行表示要经过sasl认证

250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN

且要使用sasl认证功能需要输入如下命令

auth  login

这一行需要输入账号,且要是base64为编码的

使用echo -n  'hadoop' | openssl base64来生产,密钥也要是base64位编码的,方法类似

 

因此,一个完整的发送邮件功能是这样的:

# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 Welcome to our mail.magedu.com ESMTP,Warning: Version not Available!
ehlo mail.magedu.com
250-mail.magedu.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN               (请确保您的输出以类似两行)
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login

base64位账号

base64位密码

data

quit(退出)

 

 

本文出自 “linux学习之路” 博客,谢绝转载!

你可能感兴趣的:(编译postfix,sasl认证)