[原]Postfix邮件服务器配置详解

  公司需要搭建一台邮件服务器,经过n次的系统重装、反反复复试验之后,折腾了将近一个月,终于将它搞定。回头看看,安装配置也不是那么复杂,只要搞清楚了原理,应该会进行得比较顺利的。安装过程中参考了很多教程,多且杂,这边这样说那边那样说,甚是烦躁,而且多数教程已过期,参考价值不大。于是乎我决定写一篇教程,作为多且杂中的一篇,希望对需要配置邮件服务器的朋友有所帮助。

  关于邮件服务器的基础知识我在这里就不赘述了,如果你还不是非常了解,建议你先去鸟哥的Linux私房菜(繁体中文)补习一下。qmail、Sendmail、Postfix三种MTA的比较请参考http://www.hzqbbc.com/blog/arch/2005/06/qmail_sendmail.html。关于MTA的选择,由于一年前配置qmail对我留下了阴影,我决定弃用qmail而选择Postfix。实际上,Postfix是个不错的选择。

大规模应用例子

国内若干个大型email ISP(如163.net/tom.com/163.com及sohu等)过去都使用qmail,后来全部更换成postfix。

新浪使用qmail,yahoo使用qmail。但这些已经不是普通的qmail了。

  本文中Linux发行版为CentOS5.5(http://www.centos.org/),采用Dovecot作为IMAP和POP3服务器,Cyrus SASL对SMTP进行认证,pam_mysql模块来实现Cyrus SASL对数据库的读取,使用ExtMail作为WebMail、ExtMan进行管理。当前软件均为最新版本:postfix-2.7.1、 dovecot-2.0.6、cyrus-sasl-2.1.22、pam_mysql-0.6.2、extmail-1.2、extman-1.1。

一、安装相关软件

  Sendmail与Postfix可能会产生冲突,最好先卸载Sendmail:

service sendmail stop  # 如果Sendmail正在运行
yum remove sendmail  # 或 rpm -e sendmail

  需要预先安装以下包:cyrus-sasl-lib、cyrus-sasl、cyrus-sasl-devel、cyrus-sasl-md5、cyrus-sasl-plain、pam-devel、xorg-x11-fonts-Type1、ruby、libdbi、libdbi-devel、perl-DBI、db4-devel、openssl-devel、lua、rrdtool、perl-File-Tail、perl-rrdtool、 perl-Unix-Syslog,其中openssl-devel及前面的包是系统自带的,可以使用YUM安装(推荐)或RPM安装;lua及后面的包是需要下载的,下载RPM包并安装。RPM包搜索下载不错的去处DAGRpmfind

  根据你的系统情况可能有些包已经安装,有些包不列在其中。当然你也可以下载源码自己编译安装,这样的话后面的配置中做相应的修改就可以适应了。如果后续安装出现错误,查看错误提示或日志,判断是否为某些软件缺失导致。

二、添加系统组和用户

groupadd postfix -g 501
useradd postfix -u 501 -g 501 -s /sbin/nologin
groupadd postdrop -g 502
groupadd dovenull -g 503
useradd dovenull -u 503 -g 503 -s /sbin/nologin
groupadd dovecot -g 504
useradd dovecot -u 504 -g 504 -s /sbin/nologin
groupadd vmail -g 505
useradd vmail -u 505 -g 505 -s /sbin/nologin

  postfix和postdrop用户/组为Postfix相关程序运行时使用,dovenull和dovecot用户/组为Dovecot程序运行时使用,vmail用户/组为虚拟用户使用。其中501~505的uid或gid为手动指定,注意不能与现有的重复。你也可以不指定由系统自动分配。uid和gid分配可查看/etc/passwd和/etc/group文件。这些uid和gid后面配置中会使用到。

三、认证相关配置

  MySQL作为存储虚拟域和虚拟用户的数据库,避免了使用系统帐户带来的安全性问题,同时也便于管理。MySQL的安装这里就省略了,你可以参考[原]LAMP环境配置 中MySQL安装部分。将MySQL的路径加入到配置文件中:

echo “/usr/local/mysql/lib/mysql”>>/etc/ld.so.conf
ldconfig
echo “export PATH=$PATH:/usr/local/mysql/bin”>>/etc/profile
export PATH=$PATH:/usr/local/mysql/bin

  以上假定MySQL编译安装在/usr/local/mysql目录下。如果你是使用YUM或RPM安装的MySQL,可能不需要以上操作。

  pam_mysql模块实现了Cyrus SASL的SMTP身份验证的数据库读取。由于新版Dovecot内置了读取MySQL数据库的功能,因此IMAP和POP3不需要使用pam_mysql模块。下载pam_mysql(http://pam-mysql.sourceforge.net/)并编译安装:

./configure –with-cyrus-sasl2 –with-mysql=/usr/local/mysql
make
make install

  如果Cyrus SASL为编译安装,使用编译配置–with-cyrus-sasl2=/path/to/cyrus-sasl,如果MySQL为YUM或RPM安装,使用编译配置–with-mysql就可以了。编译安装完成后将会生成/lib/security/pam_mysql.so文件。

  新建/etc/pam.d/smtp文件,该文件配置SMTP以何种方式进行认证(这里是pam_mysql模块),写入如下内容:

account required pam_mysql.so user=extmail passwd=extmail888 host=localhost db=extmail table=mailbox usercolumn=uid passwdcolumn=password crypt=1
auth sufficient pam_mysql.so user=extmail passwd=extmail888 host=localhost db=extmail table=mailbox usercolumn=uid passwdcolumn=password crypt=1

  其中user 数据库用户名、passwd 数据库密码、host 数据库主机、db 数据库名、table 数据库表、usercolumn 用户字段、passwdcolumn 用户密码字段、crypt 加密方式(MySQL的crypt函数加密方式)。数据库的建立在后面内容中介绍。

  新建/etc/sasl2/smtpd.conf文件,配置Cyrus SASL使用saslauthd服务来进行验证,写入如下内容:

pwcheck_method: saslauthd
mech_list: plain login

四、编译安装Dovecot

  Dovecot为IMAP和POP3服务器,目前已支持直接对MySQL数据库的读取,因此不需要借助pam_mysql模块。下载Dovecot(http://www.dovecot.org/)并编译安装:

./configure –prefix=/usr/local/dovecot –with-mysql –with-ssl
make
make install
ln -s /usr/local/dovecot/sbin/dovecot /usr/sbin/dovecot

  使用编译配置–with-mysql增加对MySQL数据库直接读取的支持。如果需要增加安全连接SSL/TLS支持,配置参数加上–with-ssl选项,这个功能需要OpenSSL支持(第一部分已安装)。

  修改Dovecot配置文件/usr/local/dovecot/etc/dovecot/dovecot.conf,如下:

listen = *
base_dir = /var/run/dovecot/
login_greeting = Dovecot ready.
mail_uid = 505
mail_gid = 505
log_path = /var/log/dovecot.log
ssl = required
ssl_cert = </etc/pki/tls/certs/mail.cert
ssl_key = </etc/pki/tls/private/mail.key
mail_location = maildir:/home/domains/%d/%n/Maildir
passdb {
   driver = sql
   args = /usr/local/dovecot/etc/dovecot/dovecot-mysql.conf
}
userdb {
   driver = sql
   args = /usr/local/dovecot/etc/dovecot/dovecot-mysql.conf
}

  其中mail_uid和mail_gid为第二部分中设置的vmail用户的uid和vmail组的gid。ssl、ssl_cert、 ssl_key为安全连接SSL/TLS的选项(需OpenSSL支持,第一部分已安装),如不需要可删除。mail_location选项为虚拟域和虚拟用户的用户目录。passdb和userdb部分设置密码和用户数据读取方式(直接MySQL读取)。

  新建Dovecot的MySQL读取配置文件/usr/local/dovecot/etc/dovecot/dovecot-mysql.conf(或与dovecot.conf中保持一致的路径),如下:

driver = mysql
connect = host=/tmp/mysql.sock dbname=extmail user=extmail password=extmail888
default_pass_scheme = MD5
password_query = SELECT uid AS username,domain,password FROM mailbox WHERE username=’%u’ AND active=’1′
user_query = SELECT homedir,505 AS uid,505 AS gid FROM mailbox WHERE username=’%u’ AND active=’1′

  connect参数设置MySQL的Socket路径、数据库名、数据库用户、数据库密码等。password_query设置读取SQL,505为第二部分中设置的vmail用户的uid和vmail组的gid。数据库的建立在后面内容中介绍。

五、安装ExtMail/ExtMan

  ExtMail/ExtMan是应用比较广泛的WebMail和管理界面,采用Perl编写。下载perl-DBD-mysql(http://search.cpan.org/dist/DBD-mysql/)和perl-GD(http://search.cpan.org/dist/GD/),解压进入源码目录同样的命令编译安装:

perl Makefile.PL
make
make install

  下载ExtMail和ExtMan(http://www.extmail.org/),解压到Web根目录下extsuite目录(本文中Web根目录为/var/www/),设定相关目录及属性:

chown -R vmail.vmail /var/www/extsuite
mkdir /tmp/extman
chown -R vmail.vmail /tmp/extman/
mkdir /home/domains
chmod 700 /home/domains
chown -R vmail.vmail /home/domains
cp -r /var/www/extsuite/extman/addon/mailgraph_ext/ /usr/local/mailgraph_ext/

  将/var/www/extsuite/extmail/webmail.cf.default重命名为/var/www/extsuite/extmail/webmail.cf,修改以下MySQL设置部分:

SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail888
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = localhost
SYS_MYSQL_SOCKET = /tmp/mysql.sock

  将/var/www/extsuite/extman/webman.cf.default重命名为/var/www/extsuite/extman/webman.cf,修改以下MySQL设置部分:

SYS_MYSQL_USER = webman
SYS_MYSQL_PASS = webman888
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = localhost
SYS_MYSQL_SOCKET = /tmp/mysql.sock

  其中/tmp/mysql.sock为MySQL的Socket路径。SYS_MYSQL_USER设置的extmail和webman为ExtMail和ExtMan使用的数据库用户名。

  修改初始化SQL脚本,并在MySQL中执行:

GRANT USAGE ON extmail.* TO ‘extmail’@’localhost’ IDENTIFIED BY ‘extmail888’;
GRANT USAGE ON extmail.* TO ‘webman’@’localhost’ IDENTIFIED BY ‘webman888’;
GRANT SELECT, UPDATE ON extmail.* TO ‘extmail’@’localhost’;
GRANT SELECT, INSERT, DELETE, UPDATE ON extmail.* TO ‘webman’@’localhost’;
FLUSH PRIVILEGES;
CREATE DATABASE extmail;
USE extmail;
CREATE TABLE manager (
   username varchar(255) NOT NULL default ”,
   password varchar(255) NOT NULL default ”,
   type varchar(64) NOT NULL default ‘postmaster’,
   uid varchar(255) NOT NULL default ”,
   name varchar(255) NOT NULL default ”,
   question text NOT NULL default ”,
   answer text NOT NULL default ”,
   disablepwdchange smallint(1),
   createdate datetime NOT NULL default ‘0000-00-00 00:00:00’,
   expiredate DATE NOT NULL default ‘0000-00-00’,
   active tinyint(1) NOT NULL default ‘1’,
   PRIMARY KEY  (username)
) ENGINE=MyISAM COMMENT=’Ext/Webman – Admin Accounts’;
CREATE TABLE alias (
   address varchar(255) NOT NULL default ”,
   goto text NOT NULL,
   domain varchar(255) NOT NULL default ”,
   createdate datetime NOT NULL default ‘0000-00-00 00:00:00’,
   active tinyint(1) NOT NULL default ‘1’,
   PRIMARY KEY  (address)
) ENGINE=MyISAM COMMENT=’ExtMail – Virtual Aliases’;
CREATE TABLE domain (
   domain varchar(255) NOT NULL default ”,
   description varchar(255) NOT NULL default ”,
   hashdirpath varchar(255) NOT NULL default ”,
   maxalias int(10) NOT NULL default ‘0’,
   maxusers int(10) NOT NULL default ‘0’,
   maxquota varchar(16) NOT NULL default ‘0’,
   maxnetdiskquota varchar(16) NOT NULL default ‘0’,
   transport varchar(255) default NULL,
   can_signup tinyint(1) NOT NULL default ‘0’,
   default_quota varchar(255) default NULL,
   default_netdiskquota varchar(255) default NULL,
   default_expire varchar(12) default NULL,
   disablesmtpd smallint(1),
   disablesmtp smallint(1),
   disablewebmail smallint(1),
   disablenetdisk smallint(1),
   disableimap smallint(1),
   disablepop3 smallint(1),
   createdate datetime NOT NULL default ‘0000-00-00 00:00:00’,
   expiredate DATE NOT NULL default ‘0000-00-00’,
   active tinyint(1) NOT NULL default ‘1’,
   PRIMARY KEY  (domain)
) ENGINE=MyISAM COMMENT=’ExtMail – Virtual Domains’;
CREATE TABLE domain_manager (
   username varchar(255) NOT NULL default ”,
   domain varchar(255) NOT NULL default ”,
   createdate datetime NOT NULL default ‘0000-00-00 00:00:00’,
   active tinyint(1) NOT NULL default ‘1’,
   KEY username (username)
) ENGINE=MyISAM COMMENT=’Ext/Webman – Domain Admins’;
CREATE TABLE mailbox (
   username varchar(255) NOT NULL default ”,
   uid varchar(255) NOT NULL default ”,
   password varchar(255) NOT NULL default ”,
   clearpwd varchar(128) NOT NULL default ”,
   name varchar(255) NOT NULL default ”,
   mailhost varchar(255) NOT NULL default ”,
   maildir varchar(255) NOT NULL default ”,
   homedir varchar(255) NOT NULL default ”,
   quota varchar(16) NOT NULL default ‘0’,
   netdiskquota varchar(16) NOT NULL default ‘0’,
   domain varchar(255) NOT NULL default ”,
   uidnumber int(6) NOT NULL default ‘1000’,
   gidnumber int(6) NOT NULL default ‘1000’,
   createdate datetime NOT NULL default ‘0000-00-00 00:00:00’,
   expiredate DATE NOT NULL default ‘0000-00-00’,
   active smallint(1) NOT NULL default ‘1’,
   disablepwdchange smallint(1),
   disablesmtpd smallint(1),
   disablesmtp smallint(1),
   disablewebmail smallint(1),
   disablenetdisk smallint(1),
   disableimap smallint(1),
   disablepop3 smallint(1),
   question text NOT NULL default ”,
   answer text NOT NULL default ”,
   PRIMARY KEY  (username)
) ENGINE=MyISAM COMMENT=’ExtMail – Virtual Mailboxes’;
INSERT INTO `manager` VALUES (‘admin’,’$1$F0egu4LX$yG0wetjGPUnIJlqMhQwlo1′,’admin’,’root’,’Administrator’,’How are you?’,’Fine, thanks!’,’0′,’2010-10-22 11:47:04′,’0000-00-00′,1);

  初始化管理员用户名为admin,密码为admin888。

  执行ExtMail程序需要Apache支持suEXEC,关于suEXEC,请参考(http://oss.org.cn/ossdocs/apache/httpd/2.0-cn/suexec.html),可能需要重新编译Apache,在编译配置时加入–enable-suexec –with-suexec-caller=daemon –with-suexec-uidmin=500 –with-suexec-gidmin=500 –with-suexec-docroot=/var/www参数。

  Apache虚拟主机配置,修改/usr/local/apache2/conf/httpd.conf(或/etc/httpd.conf),添加以下行:

NameVirtualHost *
<VirtualHost *>
   ServerName mail.domain.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
   SuexecUserGroup vmail vmail
</VirtualHost>

  访问http://mail.domain.com即可进入WebMail,访问http://mail.domain.com/extman进行管理。

六、安装Postfix

  主角上场,下载Postfix(http://www.postfix.org/)并编译安装:

make -f Makefile.init makefiles ‘CCARGS=-DUSE_TLS -DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl’ ‘AUXLIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto’
make install

  其中/usr/local/mysql/include/mysql为MySQL包含文件目录,/usr/include/sasl为SASL 包含文件目录,/local/mysql/lib/mysql为MySQL库文件目录,/usr/lib/sasl2为SASL库文件目录。安装时会有交互操作,一般情况下全部按默认设置一路Enter下去就可以了。

  配置Postfix配置文件/etc/postfix/main.cf,修改如下:

# 一般设置
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 550
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/local/man
sample_directory = /etc/postfix
readme_directory = no
# 每个邮箱和每封邮件最大尺寸限制(单位为字节,Byte)
mailbox_size_limit = 107374182400
message_size_limit = 53687091200
virtual_mailbox_limit = 107374182400
# SSL/TLS安全连接设置,安全连接支持后面内容中介绍,如不需要可省略
smtpd_tls_key_file = /etc/pki/tls/private/mail.key
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.cert
smtpd_tls_loglevel = 1
smtpd_tls_auth_only = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
# SASL验证相关设置
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
# 域名、主机等设置
myhostname = mail.domain.com
mydomain = domain.com
myorigin = $mydomain
mynetworks = 127.0.0.0/8
inet_interfaces = all
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_limit_maps.cf
virtual_mailbox_base = /home/domains
virtual_uid_maps = static:505
virtual_gid_maps = static:505
local_transport = virtual
local_recipient_maps = $virtual_mailbox_maps

  默认配置文件中有相应的解释,有很大的参考价值。其中virtual_uid_maps = static:505和virtual_gid_maps = static:505为第二部分中设置的vmail用户的uid和vmail组的gid。

  配置Postfix配置文件/etc/postfix/master.cf,查找到相应行修改如下:

# SMTP设置
smtp      inet  n       –       n       –       –       smtpd
# 如需要SSL/TLS支持则加入此行
smtps      inet  n       –       n       –       –       smtpd
-o smtpd_tls_wrappermode=yes

  配置MySQL虚拟别名配置文件/etc/postfix/mysql_virtual_alias_maps.cf,修改如下:

user = extmail
password = extmail
hosts = localhost
dbname = extmail
table = alias
select_field = goto
where_field = address
additional_conditions = AND active = ‘1’

  其中user为数据库用户名,password为数据库密码,hosts为数据库主机,dbname为数据库名。下面几个配置文件类似,省略。

  配置MySQL虚拟域配置文件/etc/postfix/mysql_virtual_domains_maps.cf,修改如下:

user = extmail
password = extmail
hosts = localhost
dbname = extmail
table = domain
select_field = domain
where_field = domain
additional_conditions = AND active = ‘1’

  配置MySQL虚拟用户配置文件/etc/postfix/mysql_virtual_mailbox_maps.cf,修改如下:

user = extmail
password = extmail
hosts = localhost
dbname = extmail
table = mailbox
select_field = maildir
where_field = username
additional_conditions = AND active = ‘1’

  配置MySQL虚拟磁盘配额配置文件/etc/postfix/mysql_virtual_limit_maps.cf,修改如下:

user = extmail
password = extmail
hosts = localhost
dbname = extmail
table = mailbox
select_field = quota
where_field = username
additional_conditions = AND active = ‘1’

七、添加SSL/TLS支持

  SSL/TLS的原理,请参考http://www.infosecurity.org.cn/article/secprotocol/ssl/8349.html。YUM或RPM安装crypto-utils,并用crypto-utils生成证书和私钥:

yum install crypto-utils
genkey –days 365 mail.domain.com
mv /etc/pki/tls/certs/mail.domain.com.cert /etc/pki/tls/certs/mail.cert
mv /etc/pki/tls/private/mail.domain.com.key /etc/pki/tls/private/mail.key

  使用genkey工具时会有相应的设置,成功完成后生成证书文件*.cert和私钥文件*.key文件。关于SSL/TLS的其它设置以上步骤中均已提到。

八、添加到系统自启动,并启动Postfix系统

  修改/etc/rc.local,加入以下行:

/var/www/extsuite/extman/daemon/cmdserver -v -d
/usr/local/mailgraph_ext/mailgraph-init start
dovecot
postfix start

  添加saslauthd服务自启动,执行:

chkconfig –add saslauthd

  防火墙开启邮件服务器的相应端口,主要的为25(SMTP)、110(POP3)、143(IMAP)、465(SSL/TLS SMTPs)、995(SSL/TLS POP3s)、993(SSL/TLS IMAPs)。

  启动Postfix:

newaliases
/var/www/extsuite/extman/daemon/cmdserver -v -d
/usr/local/mailgraph_ext/mailgraph-init start
service saslauthd start
dovecot
postfix start

九、完

  至此,一个相对完整的邮件服务器就配置成功了。后续根据需要还可以加入杀毒、反垃圾邮件功能。

  尊重作者劳动,转载请注明出处,来自阿东的代码人生(http://www.code-life.com)。如有需要帮助的欢迎留言,我会尽量帮忙解答。提问也需要智慧,请阅读How To Ask Questions The Smart Way (提问的智慧)

原创文章,转载请注明出处:代码人生https://www.code-life.com/
本文链接地址:https://www.code-life.com/?p=362

发表评论

您的电子邮箱地址不会被公开。