本文最终采取的是一种简单又实用的方式来搭建邮件服务器,利用本文的方法搭建邮件服务器过程其实是比较简单的,不过由于本文包含了作者的一些感悟与理解,所以比较长,呵呵。如果您希望不求甚解快速解决问题,可以直接看执行命令部分:)
本解决方案中采用的各个软件都是开源的邮件服务器中比较流行的项目,各个软件都有自己很特色的地方。本文参考了《FreeBSD架设功能完整的邮件服务器(POSTFIX)》、《在FreeBSD 上组建ISP级的邮件系统》、《使用Postfix构建基于FreeBSD的邮件系统》、《簡易 Mail Server 架設 — Postfix 設定》、Postfix网站的英文文档《How Postfix uses SASL authentication information》以及其它一些文章中的配置、bug解决方法等。您可以在http://www.wangzhongyuan.com/archives/219.html阅读本文全文,并给作者仲子留言、讨论。
本解决方案在FreeBSD6.1下测试通过,本文所使用的各个软件的版本:apache-2.2.4、cyrus-sasl-2.1.22、openssl-0.9.8e、openwebmail-2.52_3、postfix-2.4.1,1、vm-pop3d-1.1.6_2。
(1)进行CVSUP
养成一个好习惯(不过不一定是效果好的习惯,呵呵),安装软件前更新freebsd ports,以获取最新的软件,这样许多原有的bug也许就能自动解决。当然,开源软件(实际上商业软件也是如此)的各种例子一次次说明:并不一定最新的软件就是最好的软件。
# cvsup -gL 2 -h cvsup.freebsdchina.org /usr/share/examples/cvsup/ports-supfile
注:#号为提示符,在输入命令的时候是不要输入的。如果您没有安装cvsup,恐怕您得先google或者百度一下相关的文章。
我这次更新ports的时候就出现了一个问题:postfix最新版为2.4.5,可是不知道为何在/usr/ports/mail/postfix/work下却提示找不到postfix-2.4.5的文件夹,而只有postfix-2.4.1的文件夹。上网查也没有查出什么原因,于是我将/usr/ports/mail/postfix/下的Makefile中的PORTVERSION从2.4.5改为2.4.1,问题解决。
(2)在搭建邮件服务器前,您可能需要在服务器先安装apache+openssl。关于这方面的详细资料,您可以查阅其它文章,以下是一个简要的安装步骤:
# cd /usr/ports/security/openssl
# make install
# make clean
# cd /usr/ports/www/apache2
# make install
# make clean
# vi /etc/rc.conf
添加 apache2_enable=”YES”
(3)安装 vm-pop3d
# cd /usr/ports/mail/vm-pop3d
# make install clean
能够完成pop3功能的软件还有Courier-IMAP,但是感觉配置有些复杂(当然,也可能是因为我先装了vm-pop3的缘故吧,先入为主了~~),而且Courier-IMAP的ports安装又会去安装courier_authdaemond(这个是另一种利用sasl2进行smtp验证的方式,感觉配置很复杂,尤其又需要MYSQL的支持,而且关联软件又是一大堆),这种方式能够启动courier_authdaemond验证服务,专门负责SMTP的SASL2验证,同时还提供POP3和IMAP,但是需要和Mysql打交道,有需要很多配置文件,感觉有些得不偿失。而vm-pop3d只需在安装好之后设置启动就行:
# cd /usr/local/etc/rc.d
# mv vm-pop3d.sh.sample vm-pop3d.sh
(4)进行最重要的步骤了,安装使用SASL2进行Login验证的Postfix。
Postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。之所以不用sendmail,而用Postfix完成邮件服务器功能,是因为Postfix更快、更容易管理、更安全,同时还与sendmail保持足够的兼容性。Postfix在性能上大约比sendmail快三倍。一部运行postfix的台式PC每天可以收发上百万封邮件。
而配置好Postfix之后为什么需要配置SMTP的验证功能呢?这是因为如果不加验证,而直接open-relay,会有有许多垃圾邮件的发送者可能利用你的邮件服务器进行中转,发送大量的垃圾邮件,从而导致你的域名被加入其它大邮箱加入黑名单,此后你发送的邮件都会被当作垃圾邮件进行处理,当然,你也可能会收到网络服务提供商ISP的警告。
那为什么我们使用Login验证呢?这是因为我不想为了一个简单的验证功能,就大动干戈,去连接数据库,然后又要考虑在数据库中的存储是明文,又跑去下载什么SASL2的patch,太麻烦啦。而且,使用hash验证显然要不数据库验证效率要高得多。考虑SASL2如下的几种验证方式:
PLAIN – sasl_checkpass(),以及明文口令
auxprop – 根据auxiliary property插件提供的userPassword属性验证用户,数据库通常保存在/etc/sasldb2(freebsd下是在/usr/local/etc/sasldb2.db),可以自己添加能够通过验证的邮箱名以及验证密码(本文所采用的方法);
saslauthd – 通过saslauthd验证用户,-a选项指示saslauthd的具体机制,-n指示saslauthd的线程数(个人认为不好,麻烦,而且似乎支持虚拟邮件域也有些问题);
Courier-IMAP – 通过Courier-IMAP的authdaemond检查口令,类似于saslauthd(个人认为不好,麻烦);
pwcheck – 使用独立的系统的用户数据库来验证(freebsd下使用ports安装时,似乎没有发现这个程序,按理说应该在/usr/local/sbin/pwcheck);
本文最后参照Postfix官方网站SASL验证的所给出的方法,采用了auxprop的验证方法。具体方法如下:
首先安装Postfix:
# cd /usr/ports/mail/postfix/
# make install clean
正常情况下安装Postfix的时候,就会自动安装SASL2了,如果没有安装的话,可以自己到/usr/ports/security/cyrus-sasl2下安装。注意,安装Postfix的时候,选上PCRE、SASL2、TLS、VDA;安装SASL2的时候,选上LOGIN、PLAIN、CRAM、DIGEST、OTP、NTLM(如果想要使用authdaemon方式进行验证的话,也可以将AUTHDAEMOND勾上)。
下面我们就需要配置Postfix了:
# vim /usr/local/etc/postfix/main.cf
在最后添加:
virtual_alias_maps=hash:/usr/local/etc/postfix/virtual
alias_maps=hash:/usr/local/etc/postfix/aliases
default_privs=nobody
allow_mail_to_commands = alias,forward,include
allow_mail_to_files = alias,forward,include
smtpd_client_restrictions = permit_sasl_authenticated
smtpd_sasl_auth_enable= yes
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes
smtpd_sasl_path = smtpd
smtpd_sasl_security_options = noanonymous
其中,smtpd_client_restrictions之前的是Postfix的基本设置以及配置虚拟域,之后是添加SASL2验证的一些配置。以上配置文件内容针对Postfix2.3版以后有效,如果你要针对Postfix2.3版以前的版本进行配置,可以参照Postfix官方网站SASL验证。以下是对上面配置的一些简要说明:
smtpd_sasl_auth_enable= yes: 打开SASL验证;
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination: 为了允许远程正常SMTP邮件客户端能够通过邮件服务器传送邮件,需要进行验证的设置
smtpd_sasl_authenticated_header = yes: 查看消息头中的登录名
broken_sasl_auth_clients = yes: 为了兼容旧版本Outlook所进行的设置(Postfix2.3版以后有效)
smtpd_sasl_path = smtpd: 使用Cyrus SASL对Postfix进行验证,默认情况下,设置此项后,进行验证时,Cyrus SASL会自动去搜索配置文件/usr/local/lib/sasl2/smtp.conf。
然后去配置SASL2,我们使用Login登录验证,这样不需要像authdaemond那样设置开机启动SASL的验证程序。配置文件如下:
# vim /usr/local/lib/sasl2/smtpd.conf
添加如下内容:
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5
这样我们就可以使用Cyrus SASL自己的存储邮箱用户名和密码的文件来进行验证。当然,刚开始的时候,SASL的这个password file(默认为/usr/local/etc/sasldb2.db)中是没有数据的,我们可以通过如下命令来添加能够通过验证的邮箱名和密码。由于我们使用虚拟域进行配置,所以我们在添加能通过验证的用户时,需要指定完整的邮箱名:
# saslpasswd2 -c -u wangzhongyuan.com test
它就会提示你输入验证密码,这样test (at) wangzhongyuan.com这条数据就添加到了SASL2的验证数据库文件中了。我们可以通过如下命令查看这个验证数据库文件中已经有哪些用户了:
# sasldblistusers2
下面我们为这个邮件服务器中添加虚拟域了,使用虚拟域就可以在一台服务器上为多个域名配置邮件服务功能,类似Apache中的虚拟主机一样。例如我们需要添加xxxxxxx1.com和xxxxxxx2.com这两个虚拟域(这边的xxxxxxx1.com就可以是上面添加到SASL2验证数据库中的邮箱域wangzhongyuan.com,只是为了收到垃圾邮件,下面我使用xxxxxxx1.com代指wangzhongyuan.com进行配置说明):
# cd /usr/local/etc/postfix/
# vim virtual
在最后面添加:
xxxxxxx1.com anything
test@xxxxxxxn1.com test.xxxxxxx1.com
xxxxxxx2.com anything
test@xxxxxxxn2.com test.xxxxxxx2.com
然后保存退出,执行如下命令生成virtual.db虚拟域数据库:
# postmap virtual
# vim aliases
在最后面添加:
test.xxxxxxx1.com:/var/spool/virtual/xxxxxxx1.com/test
test.xxxxxxx2.com:/var/spool/virtual/xxxxxxx2.com/test
然后保存退出,执行如下命令生成aliases.db别名数据库:
# postalias aliases
注:同理可以添加其它域,需要注意的是,编辑/usr/local/etc/postfix/virtual以及/usr/local/etc/postfix/aliases后需要重新调用上面的postmap和postalias命令生成对应的数据库.db文件。
至此,利用SASL2支持登录验证的Postfix配置就已完成。我想,相对于其它那些需要Mysql支持的验证方式而言,这种验证方式是简单高效的,也是Postfix官方推荐的验证方式。
(5)安装配置Web邮件系统Open Webmail
# cd /usr/ports/mail/openwebmail/
# make WITH_QUOTA=yes install clean
下面配置openwebmail支持wangzhongyuan.com,创建下面的文件:
# vim /usr/local/www/cgi-bin/openwebmail/etc/sites.conf/wangzhongyuan.com
添加如下内容:
auth_module auth_vdomain.pl
auth_withdomain yes
mailspooldir /var/spool/virtual/wangzhongyuan.com
use_syshomedir no
use_homedirspools no
enable_autoreply no
enable_setforward no
enable_vdomain yes
vdomain_admlist test
vdomain_maxuser 500
vdomain_vmpop3_pwdpath /usr/local/etc/virtual
vdomain_vmpop3_pwdname passwd
vdomain_vmpop3_mailpath /var/spool/virtual
vdomain_postfix_aliases /usr/local/etc/postfix/aliases
vdomain_postfix_virtual /usr/local/etc/postfix/virtual
vdomain_postfix_postalias /usr/local/sbin/postalias
vdomain_postfix_postmap /usr/local/sbin/postmap
# quota
quota_module quota_du.pl
quota_limit 104800 //set the size of mail box
quota_threshold 85
delmail_ifquotahit no
delfile_ifquotahit no
注:其中的vdomain_admlist test定义了这个邮箱域的第一个用户test@xxxxxxx1.com,他也是管理员用户,他登录Open Webmail后,可以在个人模板中添加新的邮箱用户(添加用户按钮在个人设置那个页面上排按钮中);quota_limit 104800部分设置了邮箱大小,104800的单位是K,这样这个邮箱的容量就是100多M。
然后进行Open Webmail最后的设置:
# mkdir -p /var/spool/virtual/wangzhongyuan.com
# chown nobody /var/spool/virtual/wangzhongyuan.com
# chgrp mail /var/spool/virtual/wangzhongyuan.com
# mkdir -p /usr/local/etc/virtual/wangzhongyuan.com
# touch /usr/local/etc/virtual/wangzhongyuan.com/passwd
# chmod 644 /usr/local/etc/virtual/wangzhongyuan.com/passwd
# htpasswd /usr/local/etc/virtual/wangzhongyuan.com/passwd test
# chmod 755 /usr/local/www/cgi-bin/openwebmail/etc/users
# sync
# reboot
注:htpasswd那行命令是为test这个邮箱用户设置密码。
重启服务器之后,现在的邮件服务器设置方面应该都是已经可以正常使用的。不过如果要想通过Web登陆你的邮箱,还需要配置一下apache以及域名DNS。你需要将xxxxxxx1.com的ip指向这台邮件服务器上,这样test@xxxxxxx1.com的邮件才会发送到这台邮件服务器上。然后也可以配置一个子域名(当然,也可以直接使用xxxxxxx1.com的域名)作为Web登录邮箱的网址。
而且由于Web服务器上的apche使用的是VirtualHost虚拟主机,因此需要配置一个新的虚拟主机。需要注意的是,使用Ports方式安装的Open Webmail会分布在两个文件夹中,让人很是不爽,一个文件夹在/usr/local/www/cgi-bin/openwebmail,另一个文件夹在/usr/local/www/data/openwebmail。同时,由于openwebmail中绝对路径是从/cgi-bin开始的,这样我们只能配置/usr/local/www作为此虚拟主机的DocumentRoot。配置如下:
ServerName email.xxxxxxx1.com
DocumentRoot “/usr/local/www”
DirectoryIndex /cgi-bin/openwebmail/openwebmail.pl
Alias /openwebmail “/usr/local/www/data/openwebmail”
AllowOverride All
Options ExecCGI
Order allow,deny
Allow from all
重启apache之后,你就可以通过email.xxxxxxx1.com来访问、登录你的邮箱,并进行邮件收发了。其中“DirectoryIndex /cgi-bin/openwebmail/openwebmail.pl”使得你可以使用email.xxxxxxx1.com代替email.xxxxxxx1.com/cgi-bin/openwebmail/openwebmail.pl 来登录Open Webmail。Alias /openwebmail “/usr/local/www/data/openwebmail”是因为有一些Openwebmail的根路径(例如图片的路径)是从/openwebmail开始,而实际却是在/usr/local/www/data/openwebmail下。
同时,你在配置apache的httpd.conf的时候,可能还需要注释掉如下语句:ScriptAlias /cgi-bin/ “/usr/local/www/apache22/cgi-bin/”。并且将httpd.conf中的“#AddHandler cgi-script .cgi”改为“AddHandler cgi-script .cgi .pl”;这样apache才会去执行pl文件,而不是打开它。注意,改完httpd.conf之后记得重启apche噢!
到此为止,一个功能强大的邮件服务器就终于搭建完成。我要感谢小静在我这几天研究邮件服务器过程中给予我的支持以及细心劝导:)
本文可以自由转载,转载时请保留全文并注明出处。作者:仲子
原文链接:http://www.wangzhongyuan.com/archives/219.html