共计 26377 个字符,预计需要花费 66 分钟才能阅读完成。
本系列文章主要介绍 Linux 下主流的开源邮件系统 Postfix 的搭建过程,构建一个通过 Postfix 虚拟用户管理的完整的邮件系统,该系统包括以下组件:
邮件收发端 postfix,dovecot,
邮件管理端:extmail,extman
安全认证:cyrus-sasl
防病毒,防垃圾
本文主要介绍 postfix 邮件系统搭建之前的准备工作,包括:
1. 域名解析
2.linux 系统优化配置
3.LAMP 环境的搭建
4.sasl 安全认证软件安装
废话不多,直接进入正题
1. 域名解析
主要需要的配置是:A 记录和 MX 记录。
以下是我的阿里云解析记录,提供参考:
红框内的是我需要使用的记录,其他的是一般可供配置的解析,在此只是演示一下,大家具体根据实际情况进行配置即可。
Tips:
MX(Mail Exchanger)记录
邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。这样的服务器可以有多个,通过 MX 优先级确定接受转发的顺序,数字越小优先级越高。
例如,当 Internet 上的某用户要发一封信给 user@mydomain.com 时,该用户的邮件系统通过 DNS 查找 mydomain.com 这个域名的 MX 记录,如果 MX 记录存在,用户计算机就将邮件发送到 MX 记录所指定的邮件服务器上。
2.Linux 系统优化配置
2.1. 检查系统版本
本次安装采用 CentOS-6.8-x86_64 系统,其他 6.x 版本的服务器相同,7.x 的暂不适用
cat /etc/RedHat-release
uname -r
2.2. 创建并进入工作目录
mkdir -p /server/tools
cd /server/tools
2.3. 修改主机名,配置 hosts 解析,均配置为 mail.zuiyoujie.com
hostname mail.zuiyoujie.com
vim /etc/sysconfig/network
-->HOSTNAME=mailsrv.zuiyoujie.com
vim /etc/hosts
-->127.0.0.1 mail.zuiyoujie.com
2.4. 关闭防火墙,selinux
chkconfig iptables off
chkconfig ip6tables off
chkconfig --list ip6tables
chkconfig --list iptables
sed -i s#SELINUX=enforcing#SELINUX=disabled#g /etc/selinux/config
cat /etc/selinux/config |grep SELINUX=disabled
setenforce 0
getenforce
2.5. 设置时间同步
/usr/sbin/ntpdate ntp1.aliyun.com
echo "# made by tssc for sync time in $(date +%F)">> /var/spool/cron/root
echo '*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1' >>/var/spool/cron/root
crontab -l
2.6. 配置 CentOS6.0 下的 yum 源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.bak
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install net-tools wget vim lrzsz tree dos2unix -y
2.7. 安装开发库和开发工具(gcc-c++)
yum groupinstall 'Development Libraries' 'Development Tools' -y
3.LAMP 环境的搭建
3.1. 由于后续会安装 extmail 和 extman 的图形日志,需要安装一些基本的图形工具
yum install -y \
httpd mysql mysql-server mysql-devel php php-mysql openssl-devel \
gd gd-devel perl-GD libmcrypt libmcrypt-devel \
freetype freetype-devel glib zlib zlib-devel \
libjpeg libjpeg-devel libpng libpng-devel \
libart_lgpl libart_lgpl-devel libxml2 libxml2-devel \
libtool-ltdl libtool-ltdl-devel db4 db4-devel \
perl-DBD-MySQL perl-Unix-Syslog perl-CGI perl-File-Tail \
cairo cairo-devel expect tcl tcl-devel \
fontconfig pixman pango pango-devel rrdtool*
# 注意:
上面的安装包中可能没有 perl-Unix-Syslog 和 perl-GD 包,可以使用以下链接下载安装:
rpm -ivh ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Unix-Syslog-1.1-1.el6.rf.x86_64.rpm
rpm -ivh ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/extras/RPMS/perl-GD-2.45-1.el6.rfx.x86_64.rpm
3.2. 配置启动数据库
service mysqld start
chkconfig mysqld on
chkconfig --list mysqld
mysql --version
netstat -anptl
安装启动完成数据库,可以登录一下进行测试
4. 安装 cyrus-sasl 认证服务
4.1.cyrus-sasl(Simple Authentication Security Layer)简单认证安全层, SASL 主要是用于 SMTP 认证。saslauthd 是其守护进程。
yum -y install cyrus-sasl-*
# 安装完毕查看版本号
[root@mail ~]# /usr/sbin/saslauthd -v
saslauthd 2.1.23
authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap
4.2. 配置 cyrus-sasl,确认以下配置项,使用系统用户验证
vim /etc/sysconfig/saslauthd
# 修改并确认以下配置:
SOCKETDIR=/var/run/saslauthd
MECH=shadow
4.3. 启动 saslauthd 服务,进行测试
chkconfig saslauthd on
chkconfig --list saslauthd
service saslauthd start
# 创建系统用户验证 saslauthd 服务的有效性
useradd zhaoshuai && echo 123456 | passwd --stdin zhaoshuai
testsaslauthd -u zhaoshuai -p 123456
# 若出现以下内容表示成功
[root@mail ~]# testsaslauthd -u zhaoshuai -p 123456
0: OK "Success."
完成以上这些就可以进行 postfix 服务器的安装了,我将在下一篇进行详细叙述。
完毕。
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-10/147844p2.htm
本文接着上文的环境,进行 postfix 邮件发信端和 dovecot 邮件收信端的部署,之后部署基于浏览器的 extmail 图形管理端,使管理员可以通过网页对邮件虚拟用户进行管理,对邮件服务器进行管控
1.postfix 邮件发信端部署
1.1. 清理会引起冲突的软件 sendmail,如果是关闭相关软件设计操作过多,不推荐
rpm -qa postfix sendmail
rpm -e --nodeps postfix sendmail
# 清除之前的邮件账号信息
userdel postfix
groupdel postdrop
cat /etc/passwd|grep post*
cat /etc/gshadow|grep post*
1.2. 创建 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
cat /etc/passwd|grep post*
cat /etc/gshadow|grep post*
# 新建虚拟用户邮箱目录,并将其权限赋予 postfix 用户:
mkdir -p /var/mailbox
chown -R postfix /var/mailbox
1.3. 源码编译安装 postfix-3.2.3
cd /server/tools
wget ftp://ftp.cuhk.edu.hk/pub/packages/mail-server/postfix/official/postfix-3.2.3.tar.gz
tar -zxf postfix-3.2.3.tar.gz
cd postfix-3.2.3
# 配置参数
make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS -I/usr/include/openssl' 'AUXLIBS=-L/usr/lib64/mysql -lmysqlclient -lz -lm -L/usr/lib64/sasl2 -lsasl2 -lssl -lcrypto'
# 编译安装
make
make install
# 执行完之后会进入设置相关目录的交互界面,基本按照默认配置即可。
install_root: [/]
tempdir: [/server/tools/postfix-3.2.3]
config_directory: [/etc/postfix]
command_directory: [/usr/sbin]
daemon_directory: [/usr/libexec/postfix]
data_directory: [/var/lib/postfix]
html_directory: [no] /usr/local/postfix/html
mail_owner: [postfix]
mailq_path: [/usr/bin/mailq]
manpage_directory: [/usr/local/man]
newaliases_path: [/usr/bin/newaliases]
queue_directory: [/var/spool/postfix]
readme_directory: [no] /usr/local/postfix/readme
sendmail_path: [/usr/sbin/sendmail]
setgid_group: [postdrop]
shlib_directory: [no] /usr/local/postfix/share-library
meta_directory: [/etc/postfix]
1.4. 更新别名数据文件 /etc/aliases.db,这个步骤如果忽略,会造成 postfix 效率极低
/usr/bin/newaliases
ll /etc/aliases.db
# 注意:
1). 安装过程如果报错,需要删除目录重新安装
2). 本文采用 yum 安装 Mysql 和 sasl2,如果使用源码安装这两个软件,需要修改编译时 CCARGS 和 AUXLIBS 选项。
使用源码安装的 mysql 和 cyrus-sasl,使用以下编译参数:
make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/sasl2/include/sasl -DUSE_TLS -I/usr/include/openssl' 'AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lrt -lm -L/usr/local/sasl2/lib -lsasl2 -lssl -lcrypto'
3). 在执行 make install 的时有如下的提示:
/usr/libexec/ld-elf.so.1: Shared object “libmysqlclient.so.12” not found
是因为 mysql 的 lib 库没找到,需要告诉 postfix 应该到哪里去找 libmysqlclient.so.12。
使用 ldconfig 可以解决,例如:
echo /usr/local/mysql/lib/mysql >> /etc/ld.so.conf
ldconfig
4).make install 的交互配置最好使用默认,如果修改根目录则目录结构会乱掉
5). 如果 /etc/aliases 文件不存在,可以用如下命令创建:
echo postfix: root >> /etc/aliases
1.5. 修改相关目录的权限否则,postfix 无法正常运行(必须使用以下顺序授权)
cd /server/tools
chown -R postfix.postfix /var/lib/postfix/
chown -R postfix.postfix /var/spool/postfix/private
chown -R postfix.postfix /var/spool/postfix/public
chown -R root /var/spool/postfix/pid/
chgrp -R postdrop /var/spool/postfix/public
chgrp -R postdrop /var/spool/postfix/maildrop/
chown root /var/spool/postfix
# 查看修改完的结果:
ll /var/lib/postfix/ -d
ll /var/lib/postfix/
ll /var/spool/postfix/ -d
ll /var/spool/postfix/
# 查看 postfix 相关程序文件
ll /usr/sbin/post*
ll /usr/libexec/postfix/
ll /var/spool/postfix/
ll /var/spool/postfix/private/
ll /var/spool/postfix/incoming/
1.6. 修改配置文件,启动 postfix
vim /etc/postfix/main.cf
# 修改并确认以下配置,改成自己对应的就好
myhostname = mail.zuiyoujie.com
mydomain = zuiyoujie.com
myorigin = $mydomain
inet_interfaces = 127.0.0.1, (外网地址)(或着写 all)mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8
# 参数说明:
myhostname 指定运行 postfix 邮件系统的主机的主机名(用 FQDN 的方式来写),默认情况下,其值被设定为本地机器名;
mydomain 指定您的域名,默认情况下,postfix 将 myhostname 的第一部分删除而作为 mydomain 的值;
myorigin 指明发件人所在的域名;邮件标头上面的 mail from 的那个地址
inet_interfaces 指定系统监听的网络接口;
mydestination 指定接收邮件时收件人的域名,即您的 postfix 系统要接收到哪个域名的邮件;
mynetworks 指定你所在的网络的网络地址,postfix 系统根据其值来区别用户是远程的还是本地的,如果是本地网络用户则允许其访问;
# 注意:
1)在 postfix 的配置文件中,参数行和注释行是不能处在同一行中的;
2)任何一个参数的值都不需要加引号,否则,引号将会被当作参数值的一部分来使用;
3)每修改参数及其值后执行 postfix reload 即可令其生效;但若修改了 inet_interfaces,则需重新启动 postfix;
4)如果一个参数的值有多个,可以将它们放在不同的行中,只需要在其后的每个行前多置一个空格即可;postfix 会把第一个字符为空格或 tab 的文本行视为上一行的延续;
# 为 postfix 提供 SysV 服务管理脚本 /etc/rc.d/init.d/postfix
vim /etc/init.d/postfix
# 以下是管理脚本具体内容:
#!/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
# main-config: /etc/postfix/main.cf
# master-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 daemons.
start() {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 daemons.
stop() {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
}
restart() {
stop
start
}
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 $?
}
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 $?
# 添加为系统服务,并设置开机自启动
chmod 755 /etc/init.d/postfix
chkconfig --add postfix
chkconfig postfix on
chkconfig --list postfix
# postfix 启动管理脚本测试
service postfix start
service postfix stop
# postfix 常用的管理命令
/usr/sbin/postfix start
/usr/sbin/postfix reload
/usr/sbin/postfix check
1.7. 测试 postfix 是否可以正常发送邮件
yum install telnet -y
telnet 127.0.0.1 25
# 实例如下:
[root@mail tools]# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 Welcome to our mail.zuiyoujie.com ESMTP!
helo mail.zuiyoujie.com
250 mail.zuiyoujie.com
mail from:root@zuiyoujie.com
250 2.1.0 Ok
rcpt to:zhaoshuai@zuiyoujie.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
from: root testmail <root@zuiyoujie.com>
to:zhaoshuai@zuiyoujie.com
subject:first test mail
This is a test mail from root.
.
250 2.0.0 Ok: queued as 329F5180712
quit
221 2.0.0 Bye
Connection closed by foreign host.
[root@mail tools]# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
329F5180712* 433 Mon Oct 16 17:46:55 root@zuiyoujie.com
zhaoshuai@zuiyoujie.com
-- 0 Kbytes in 1 Request.
# 使用以下命令可以查看邮件内容
postcat -q [Queue ID]
# 实例如下:
[root@mail ~]# postcat -q 329F5180712
*** ENVELOPE RECORDS deferred/3/329F5180712 ***
message_size: 362 690 1 0 362 0
message_arrival_time: Mon Oct 16 18:39:02 2017
create_time: Mon Oct 16 18:39:22 2017
named_attribute: log_ident=329F5180712
named_attribute: rewrite_context=local
sender: root@zuiyoujie.com
named_attribute: log_client_name=localhost
named_attribute: log_client_address=127.0.0.1
named_attribute: log_client_port=35432
named_attribute: log_message_origin=localhost[127.0.0.1]
named_attribute: log_helo_name=mail.zuiyoujie.com
named_attribute: log_protocol_name=SMTP
named_attribute: client_name=localhost
named_attribute: reverse_client_name=localhost
named_attribute: client_address=127.0.0.1
named_attribute: client_port=35432
named_attribute: server_address=127.0.0.1
named_attribute: server_port=25
named_attribute: helo_name=mail.zuiyoujie.com
named_attribute: protocol_name=SMTP
named_attribute: client_address_type=2
named_attribute: dsn_orig_rcpt=rfc822;zhaoshuai@zuiyoujie.com
original_recipient: zhaoshuai@zuiyoujie.com
recipient: zhaoshuai@zuiyoujie.com
*** MESSAGE CONTENTS deferred/3/329F5180712 ***
Received: from mail.zuiyoujie.com (localhost [127.0.0.1])
by mail.zuiyoujie.com (Postfix) with SMTP id 329F5180712
for <zhaoshuai@zuiyoujie.com>; Mon, 16 Oct 2017 18:39:02 +0800 (CST)
from: root testmail <root@zuiyoujie.com>
to:zhaoshuai@zuiyoujie.com
Message-Id: <20171016103922.329F5180712@mail.zuiyoujie.com>
Date: Mon, 16 Oct 2017 18:39:02 +0800 (CST)
*** HEADER EXTRACTED deferred/3/329F5180712 ***
*** MESSAGE FILE END deferred/3/329F5180712 ***
# 可以看出邮件服务器已经可以发送邮件,不过由于接收邮件的服务没有配好邮件还收不到,如果想看收发效果,可以将收件人改为自己的 qq 邮箱等进行测试。
# 接下来进行配置,启用 smtp 用户认证,使用 courier-authlib 通过数据库对虚拟用户进行管理
2. 安装配置 Courier authentication library
# courier-authlib 是 Courier 组件中的认证库,它是 courier 组件中一个独立的子项目,用于为 Courier 的其它组件提供认证服务,是由一位美籍俄罗斯人的杰作。其认证功能通常包括验正登录时的帐号和密码、获取一个帐号相关的家目录或邮件目录等信息、改变帐号的密码等。而其认证的实现方式也包括基于 PAM 对 /etc/passwd 和 /etc/shadow 进行认证,基于 GDBM 或 DB 进行认证,基于 LDAP/MySQL/PostgreSQL 进行认证等。因此,courier-authlib 也常用来与 courier 之外的其它邮件组件 (如 postfix) 整合为其提供认证服务。
cd /server/tools
wget http://jaist.dl.sourceforge.net/project/courier/authlib/0.66.1/courier-authlib-0.66.1.tar.bz2
tar -xf courier-authlib-0.66.1.tar.bz2
cd courier-authlib-0.66.1
# 配置参数
./configure --prefix=/usr/local/courier-authlib --sysconfdir=/etc --with-RedHat --with-mailuser=postfix --with-mailgroup=postfix --with-authmysql=yes --with-authmysqlrc=/etc/authmysqlrc --with-authdaemonrc=/etc/authdaemonrc --with-mysql-libs=/usr/lib64/mysql --with-mysql-includes=/usr/include/mysql --without-authpam --without-authpgsql --without-authvchkpw --without-authshadow
# 编译安装
make
make install
# 创建认证配置文件
chmod 755 -R /usr/local/courier-authlib/var/spool/authdaemon
cp /etc/authmysqlrc.dist /etc/authmysqlrc
cp /etc/authdaemonrc.dist /etc/authdaemonrc
ll /etc/authmysqlrc
ll /etc/authdaemonrc
# 编辑 /etc/authdaemonrc 文件,确保使用 mysql 认证模块
vim /etc/authdaemonrc
# 修改并确认以下配置
authmodulelist="authpwd authmysql"
authmodulelistorig="authpwd authmysql"
daemons=10
# 编辑 /etc/authmysqlrc 文件,让 courier 能够正确的读取 MySQL 中的认证信息
vim /etc/authmysqlrc
# 修改并确认以下配置
MYSQL_SERVER localhost
MYSQL_USERNAME extmail # 数据库用户名
MYSQL_PASSWORD extmail # 数据库密码
MYSQL_SOCKET /var/lib/mysql/mysql.sock
MYSQL_PORT 3306 # mysql 监听的端口
MYSQL_DATABASE extmail
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password # 92 行,crypt 改为 password
DEFAULT_DOMAIN mail.zuiyoujie.com # 105 行,默认邮件域
MYSQL_UID_FIELD '2525'
MYSQL_GID_FIELD '2525'
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD concat('/var/mailbox/',homedir) # 133 行,home 修改
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD concat('/var/mailbox/',maildir) # 150 行,maildir 修改
# 将 courier-authlib 配置为系统服务
cp courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib
chmod 755 /etc/init.d/courier-authlib
chkconfig --add courier-authlib
chkconfig --list courier-authlib
# 将 courier-authlib 的库目录添加到库搜索文件中
echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf.d/courier-authlib.conf
ldconfig -v
# 启动 courier-authlib 服务
service courier-authlib start
# 由于是 socket 的方式,所以没有端口,可以验证进程是否启动
ps -ef | grep courier
pstree | grep authdaemond
ll /usr/local/courier-authlib/var/spool/authdaemon/socket
# 查看 postfix 是否支持 cyrus-sasl 认证功能
cd /server/tools/
/usr/sbin/postconf -a
# 出现以下内容表示可以使用 sasl 认证
[root@mail tools]# /usr/sbin/postconf -a
cyrus
dovecot
# 设置 postfix 使用的 sasl 配置文件 smtpd,让 sasl 知道该怎么从 MySQL 中读取认证信息,该文件需要手工创建,sasl 密码验证机制为 authdaemond
# 新建 smtp 认证文件,添加以下 4 行内容:
vim /etc/sasl2/smtpd.conf
pwcheck_method: authdaemond
log_level: 3
mech_list:PLAIN LOGIN
authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
# 关于 sasl2 的认证文件 smtpd.conf 的位置,可以有以下 3 个,需要注意
/etc/sasl2/smtpd.conf
/usr/lib64/sasl2/smtpd.conf
/etc/postfix/sasl2/smtpd.conf
# 配置 postfix 支持 sasl 邮箱安全认证
vim /etc/postfix/main.cf
# 添加以下内容
###### CYRUS-SASL ######
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_path = /etc/sasl2
smtpd_sasl_security_options = noanonymous
smtpd_banner = Welcome to our $myhostname ESMTP!
smtpd_sender_restrictions = permit_mynetworks,reject_sender_login_mismatch,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_invalid_hostname,reject_authenticated_sender_login_mismatch,reject_unauthenticated_sender_login_mismatch,check_sender_access hash:/etc/postfix/access
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_sender_domain,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination
smtpd_sender_login_maps = mysql:/etc/postfix/mysql_virtual_sender_maps.cf,mysql:/etc/postfix/mysql_virtual_alias_maps.cf
/usr/sbin/postfix check
/usr/sbin/postfix reload
3. 安装配置 dovecot
yum install dovecot dovecot-mysql
# 修改 dovecot 主配置文件
vim /etc/dovecot/dovecot.conf
protocols = imap pop3 lmtp # 启用
listen = *
# 修改 auth 认证配置文件
vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain login
!include auth-system.conf.ext
# 修改 10-mail.conf 配置文件
vim /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/mailbox/%d/%n/Maildir
# 配置数据库认证相关文件
cd /etc/dovecot/conf.d/
cp auth-sql.conf.ext auth-sql.conf
vim /etc/dovecot/conf.d/auth-sql.conf
# 第 9 行和第 21 行改为以下内容(去掉 passdb 和 userdb 的 ext 后缀)
args = /etc/dovecot/dovecot-sql.conf
# 手工创建 dovecot-sql.conf 文件
vim /etc/dovecot/dovecot-sql.conf
driver = mysql
connect = host=localhost dbname=extmail user=extmail password=extmail
default_pass_scheme = CRYPT
password_query = SELECT username AS user,password AS password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, uidnumber AS uid, gidnumber AS gid FROM mailbox WHERE username = '%u'
# 启动 dovecot 邮件接收端
chkconfig dovecot on
chkconfig --list dovecot
service dovecot start
4. 安装 extmail
cd /server/tools
tar -xf extmail-1.2.tar.gz
mkdir -p /var/www/extsuite
mv extmail-1.2 /var/www/extsuite/extmail
chown -R postfix.postfix /var/www/extsuite/extmail
ll /var/www/extsuite/extmail
# 修改配置文件
cd /var/www/extsuite/extmail/
cp webmail.cf.default webmail.cf
vim /var/www/extsuite/extmail/webmail.cf
SYS_USER_LANG = zh_CN # 77 行, 语言选项
SYS_MESSAGE_SIZE_LIMIT = 52428800 # 105 行, 用户可以发送的邮件大小默认 5M
SYS_MIN_PASS_LEN = 8 # 107 行, 最短密码长度
SYS_MAILDIR_BASE = /var/mailbox # 127 行, 前文所设置的用户邮件的存放目录
SYS_MYSQL_USER = extmail # 140 行, 连接数据库服务器所使用用户名
SYS_MYSQL_PASS = extmail # 141 行, 密码和邮件服务器用到的数据库
SYS_MYSQL_HOST = localhost # 143 行, 数据库服务器主机名
SYS_MYSQL_SOCKET = /var/lib/mysql/mysql.sock
SYS_MYSQL_TABLE = mailbox
# 147 行,以下配置用来指定验证用户登录所用到的表,以及用户名、域名和用户密码分别对应的表中列的名称,默认即可
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_DOMAIN = domain
SYS_MYSQL_ATTR_PASSWD = password
# 198 行,指定之前安装的 authdaemo socket 文件的位置
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket
# 创建 extmail 临时目录
mkdir -p /tmp/extmail/upload
chown -R postfix.postfix /tmp/extmail/
ll /tmp
ll /tmp/extmail/
5. 安装 extman
cd /server/tools/
tar -xf extman-1.1.tar.gz
mv extman-1.1 /var/www/extsuite/extman
chown -R postfix.postfix /var/www/extsuite/extman
ll /var/www/extsuite/extman
# 修改配置文件
cd /var/www/extsuite/extman/
cp webman.cf.default webman.cf
vim /var/www/extsuite/extman/webman.cf
SYS_MAILDIR_BASE = /var/mailbox # 12 行,设置的用户邮件的存放目录
SYS_SESS_DIR = /tmp/extman/
# 此两处后面设定的 ID 号需更改为前而创建的 postfix 用户和 postfix 组的 id 号,本文使用的
SYS_DEFAULT_UID = 2525 # 98 行
SYS_DEFAULT_GID = 2525 # 101 行
SYS_MYSQL_USER = extmail # 127 行
SYS_MYSQL_PASS = extmail # 128 行
SYS_MYSQL_SOCKET = /var/lib/mysql/mysql.sock # 132 行
# 132 行,指定验证管理员登录所用到的表,及相关参数,默认即可
SYS_MYSQL_TABLE = manager
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_PASSWD = password
# 创建 extman 临时目录, 用于 session 等数据文件
mkdir /tmp/extman
chown -R postfix.postfix /tmp/extman/
ll /tmp
# 修改 cgi 目录的属主,便于网页访问
chown -R postfix.postfix /var/www/extsuite/extmail/cgi/
chown -R postfix.postfix /var/www/extsuite/extman/cgi/
ll /var/www/extsuite/extmail/cgi/
ll /var/www/extsuite/extman/cgi/
# 复制 5 个虚拟用户数据库配置文件到 postfix 目录
cd /var/www/extsuite/extman/docs/
cp mysql_virtual_* /etc/postfix/
ll /etc/postfix/mysql_virtual_*
# 初始化 extmail 数据库(空密码)
mysql -u root -p < /var/www/extsuite/extman/docs/extmail.sql
mysql -u root -p < /var/www/extsuite/extman/docs/init.sql
# 据库授权
mysql -uroot -p
grant all privileges on extmail.* to extmail@localhost identified by 'extmail';
grant all privileges on extmail.* to extmail@127.0.0.1 identified by 'extmail';
flush privileges;
delete from mysql.user where user=' ';
delete from mysql.user where host='mail.zuiyoujie.com';
select user,host from mysql.user;
# 编辑 /etc/postfix/main.cf,让 postfix 支持虚拟域和虚拟用户
vim /etc/postfix/main.cf
####### Virtual Mailbox Settings #######
virtual_uid_maps = static:2525
virtual_gid_maps = static:2525
virtual_transport = virtual
message_size_limit = 60336000
virtual_mailbox_base = /var/mailbox
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_limit = mysql:/etc/postfix/mysql_virtual_limit_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_alias_domains =
smtpd_client_connection_count_limit = 50
smtpd_client_connection_rate_limit = 50
# 重新载入配置文件
/usr/sbin/postfix check
/usr/sbin/postfix reload
6. 配置 Mailgraph_ext,使用 Extman 的图形日志
# 配置启动图形工具
cp -r /var/www/extsuite/extman/addon/mailgraph_ext/ /usr/local/mailgraph_ext/
/usr/local/mailgraph_ext/mailgraph-init start
/var/www/extsuite/extman/daemon/cmdserver -daemon
# 配置开机自启动
echo "/usr/local/mailgraph_ext/mailgraph-init start" >> /etc/rc.d/rc.local
echo "/var/www/extsuite/extman/daemon/cmdserver -v -d" >> /etc/rc.d/rc.local
7. 配置 Apache,使用浏览器进行虚拟用户管理
vim /etc/httpd/conf/httpd.conf
# 修改并确认以下配置
LoadModule suexec_module modules/mod_suexec.so # 198 行,将 suexec 插件注释掉,否则配置比较麻烦
User postfix # 242 行,修改 http 运行用户 postfix
Group postfix # 243 行,修改 http 运行组为 postfix
ServerName mail.zuiyoujie.com # 276 行,修改监听域名
# DocumentRoot "/var/www/html" # 292 行,将之注释掉,启用虚拟主机
# 配置虚拟主机
vim /etc/httpd/conf.d/extmail.conf
<VirtualHost *:80>
ServerName mail.zuiyoujie.com
DocumentRoot /var/www/extsuite/extmail/html/
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi
Alias /extman /var/www/extsuite/extman/html
</VirtualHost>
# 启动 Apache
service httpd start
chkconfig httpd on
chkconfig --list httpd
# 接下来就可以登录 http://mail.zuiyoujie.com,选择管理即可登入 extman 进行后台管理了
# 默认的管理员用户密码
root@extmail.org
extmail*123*
至此 postfix 邮箱服务器的收发件,用户安全认证就已经配置完成,可以集中管理邮件虚拟用户
8. 常用邮件日志分析
# 动态跟踪日志变化
tail -f /var/log/maillog
# 取指定类型的日志
egrep '(reject|warning|error|fatal|panic):' /var/log/maillog
# 查看 postfix 成功接收到邮件:(交货到邮件目录)
cat /var/log/maillog |grep "delivered to maildir"
cat /var/log/maillog |grep "delivered to maildir" | egrep -o "(\w+)([@]{1}\w+[.]{1,})(\w+)"
# 取指定日期,指定类型日志:
cat /var/log/maillog | grep "^Oct\ 17" | egrep "reject|warning|error|fatal|panic" | less
# 取指定日期,指定类型日志:
cat /var/log/maillog | grep "^Oct\ 17" | egrep "reject|warning|error|fatal|panic" | less
9.postfix 中的命令行工具
mailq 对邮件队列文件进行列表。表中的每一个条目包含有以下信息:队列文件 ID、邮件的大小、到达的时间、发件人、收件人和投递延迟的原因(如果投递有延迟的话)。该命令主要是与 showq 后台程序通信来获取队列文件的相关信息。该命令无参数。
newaliases 该工具进行别名数据库的初始化。如果没有指定数据库的类型,则使用系统默认的数据库类型(在 linux 下为 hash)。该命令可以不带参数执行。
postcat 打印邮件队列文件的内容。后面接要显示的队列文件名,可以带一个 - v 的参数进行冗余显示。
postmap 建立 postfix 查询数据库。在 linux 下可以直接跟上原始文件而不带任何参数来建立该数据库。
postconf -d 打印配置参数的缺省值。
postconf -m 列出所有支持的查询表类型。
postconf -n 查看 postfix 生效的配置
本系列文章主要介绍 Linux 下主流的开源邮件系统 Postfix 的搭建过程,构建一个通过 Postfix 虚拟用户管理的完整的邮件系统,该系统包括以下组件:
邮件收发端 postfix,dovecot,
邮件管理端:extmail,extman
安全认证:cyrus-sasl
防病毒,防垃圾
本文主要介绍 postfix 邮件系统搭建之前的准备工作,包括:
1. 域名解析
2.linux 系统优化配置
3.LAMP 环境的搭建
4.sasl 安全认证软件安装
废话不多,直接进入正题
1. 域名解析
主要需要的配置是:A 记录和 MX 记录。
以下是我的阿里云解析记录,提供参考:
红框内的是我需要使用的记录,其他的是一般可供配置的解析,在此只是演示一下,大家具体根据实际情况进行配置即可。
Tips:
MX(Mail Exchanger)记录
邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。这样的服务器可以有多个,通过 MX 优先级确定接受转发的顺序,数字越小优先级越高。
例如,当 Internet 上的某用户要发一封信给 user@mydomain.com 时,该用户的邮件系统通过 DNS 查找 mydomain.com 这个域名的 MX 记录,如果 MX 记录存在,用户计算机就将邮件发送到 MX 记录所指定的邮件服务器上。
2.Linux 系统优化配置
2.1. 检查系统版本
本次安装采用 CentOS-6.8-x86_64 系统,其他 6.x 版本的服务器相同,7.x 的暂不适用
cat /etc/RedHat-release
uname -r
2.2. 创建并进入工作目录
mkdir -p /server/tools
cd /server/tools
2.3. 修改主机名,配置 hosts 解析,均配置为 mail.zuiyoujie.com
hostname mail.zuiyoujie.com
vim /etc/sysconfig/network
-->HOSTNAME=mailsrv.zuiyoujie.com
vim /etc/hosts
-->127.0.0.1 mail.zuiyoujie.com
2.4. 关闭防火墙,selinux
chkconfig iptables off
chkconfig ip6tables off
chkconfig --list ip6tables
chkconfig --list iptables
sed -i s#SELINUX=enforcing#SELINUX=disabled#g /etc/selinux/config
cat /etc/selinux/config |grep SELINUX=disabled
setenforce 0
getenforce
2.5. 设置时间同步
/usr/sbin/ntpdate ntp1.aliyun.com
echo "# made by tssc for sync time in $(date +%F)">> /var/spool/cron/root
echo '*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1' >>/var/spool/cron/root
crontab -l
2.6. 配置 CentOS6.0 下的 yum 源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.bak
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install net-tools wget vim lrzsz tree dos2unix -y
2.7. 安装开发库和开发工具(gcc-c++)
yum groupinstall 'Development Libraries' 'Development Tools' -y
3.LAMP 环境的搭建
3.1. 由于后续会安装 extmail 和 extman 的图形日志,需要安装一些基本的图形工具
yum install -y \
httpd mysql mysql-server mysql-devel php php-mysql openssl-devel \
gd gd-devel perl-GD libmcrypt libmcrypt-devel \
freetype freetype-devel glib zlib zlib-devel \
libjpeg libjpeg-devel libpng libpng-devel \
libart_lgpl libart_lgpl-devel libxml2 libxml2-devel \
libtool-ltdl libtool-ltdl-devel db4 db4-devel \
perl-DBD-MySQL perl-Unix-Syslog perl-CGI perl-File-Tail \
cairo cairo-devel expect tcl tcl-devel \
fontconfig pixman pango pango-devel rrdtool*
# 注意:
上面的安装包中可能没有 perl-Unix-Syslog 和 perl-GD 包,可以使用以下链接下载安装:
rpm -ivh ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Unix-Syslog-1.1-1.el6.rf.x86_64.rpm
rpm -ivh ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/extras/RPMS/perl-GD-2.45-1.el6.rfx.x86_64.rpm
3.2. 配置启动数据库
service mysqld start
chkconfig mysqld on
chkconfig --list mysqld
mysql --version
netstat -anptl
安装启动完成数据库,可以登录一下进行测试
4. 安装 cyrus-sasl 认证服务
4.1.cyrus-sasl(Simple Authentication Security Layer)简单认证安全层, SASL 主要是用于 SMTP 认证。saslauthd 是其守护进程。
yum -y install cyrus-sasl-*
# 安装完毕查看版本号
[root@mail ~]# /usr/sbin/saslauthd -v
saslauthd 2.1.23
authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap
4.2. 配置 cyrus-sasl,确认以下配置项,使用系统用户验证
vim /etc/sysconfig/saslauthd
# 修改并确认以下配置:
SOCKETDIR=/var/run/saslauthd
MECH=shadow
4.3. 启动 saslauthd 服务,进行测试
chkconfig saslauthd on
chkconfig --list saslauthd
service saslauthd start
# 创建系统用户验证 saslauthd 服务的有效性
useradd zhaoshuai && echo 123456 | passwd --stdin zhaoshuai
testsaslauthd -u zhaoshuai -p 123456
# 若出现以下内容表示成功
[root@mail ~]# testsaslauthd -u zhaoshuai -p 123456
0: OK "Success."
完成以上这些就可以进行 postfix 服务器的安装了,我将在下一篇进行详细叙述。
完毕。
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2017-10/147844p2.htm
Extmail 是一种 WebMail 程序,功能强大,本文介绍另一个功能更加人性化的 WebMail 程序 roundcube。
1. 下载安装 roundcube
cd /server/tools/
wget http://jaist.dl.sourceforge.net/project/roundcubemail/roundcubemail/1.1.4/roundcubemail-1.1.4-complete.tar.gz
tar -xf roundcubemail-1.1.4-complete.tar.gz
mv roundcubemail-1.1.4 /var/www/html/webmail/
chown -R postfix.postfix /var/www/html/webmail/
chgrp -R postfix /var/lib/php/session/
ll /var/www/html/webmail/
ll /var/lib/php/session/ -
2. 升级安装 php 相关模块
pear channel-update pear.php.net
pear install Auth_SASL Net_SMTP Net_IDNA2-0.1.1 Mail_Mime
修改一下 php.ini 中的时区配置
vim /etc/php.ini +889
date.timezone = Asia/Chongqing
3. 配置 webmail 的虚拟主机,需要配置下域名解析
vim /etc/httpd/conf.d/webmail.conf
<VirtualHost *:80>
ServerName webmail.zuiyoujie.com
DocumentRoot /var/www/html/webmail
</VirtualHost>
配置完成重启 apache
service httpd restart
4. 在网页端配置 roundcube webmail
4.1. 打开一下网页 http://webmail.zuiyoujie.com/installer/index.php
检查确认以下配置:
PHP 的版本,数据库的类型等
其他的配置项都需要是 OK 才行
4.2. 生成 webmail 的配置文件
# 在 General configuration 区域只需要配置项目名称
在 Logging & Debugging 日志区可以根据需求配置
在 Database setup 数据库配置区,配置之前的 extmail 数据库即可,db_prefix 配置接下来将生成的表的前缀
在 IMAP Settings 区域,需要配置好邮件服务器的地址,端口,域名等
在 SMTP Settings 区域,需要配置邮件服务器的地址,端口,账号密码暂时不需要配置
在 Display settings & user prefs 区域,需要配置好支持的语言
在 Plugins 区域,暂时不需要配置
以上都配置好以后拉到最下面,点击”create config“按钮生成 webmail 的配置文件
配置生成完成后并不会跳转到下个页面,而是会回到页面顶端,出现与上图相同的结果表示正确生成了配置文件,点击”continue“按钮,进入下个页面进行最后的测试
点击图中的按钮对数据库进行初始化,出现以下结果即可
测试发送邮件,出现以下结果表示可以正常发送邮件
检查邮件客户端的登陆情况
至此,邮件 webmail 端的配置就完成了,不过还有最重要的一点:
对于熟悉 roundcube 系统的人来说这个初始化生成配置文件的目录是很清晰的,所以为了防止其他人恶意或者错误的重新的生成配置文件,导致安全问题,需要对文件目录进行调整
同样开发人员也想到了有在页面最下面醒目的提醒
所以 …
cd /var/www/html/webmail/
mv installer/ installer.ori
当然你也可以将该目录删除,彻底的阻断该问题的产生
上面生成的配置文件是:
如果配置出错或者想重新配置
删掉该配置文件,还原 installer 目录,重启 Apache 服务,重新打开网页进行配置即可
回归正题
5. 登录使用 WebMail
http://webmail.zuiyoujie.com
输入之前配置好的邮箱用户,登录
于是,邮箱的具体功能你就可以自己探索了,前文网页配置的选线也可以在浏览器端进行修改
完毕。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147844.htm