编译安装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学习之路” 博客,谢绝转载!