2007-10-14

FreeBSD下使用Apache+Postfix+vm-pop3d+SASL2(Login验证,使用sasldb2.db)+Open Webmail搭建带虚拟域的邮件服务器解决方案

Posted in Apache, 网络安全, FreeBSD/Unix服务器 at 22:58 Author:仲远

标签:

历经多天的痛苦研究,上网查了各种搭建邮件服务器的解决方案,最后下定决心仔细查看了英文的帮助手册,终于实现了一个比较完美的在FreeBSD下搭建邮件服务器的解决方案。这个解决方案可以提供Web邮件收发、客户端POP3收邮件以及带验证的SMTP邮件发送功能。同时不同于许多其它的解决方案,这个方案中可以提供多个虚拟域,也就是可以在一台服务器上可以为多个域名配置邮件服务器。

本文最终采取的是一种简单又实用的方式来搭建邮件服务器,利用本文的方法搭建邮件服务器过程其实是比较简单的,不过由于本文包含了作者的一些感悟与理解,所以比较长,呵呵。如果您希望不求甚解快速解决问题,可以直接看执行命令部分:)

本解决方案中采用的各个软件都是开源的邮件服务器中比较流行的项目,各个软件都有自己很特色的地方。本文参考了《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也许就能自动解决。当然,开源软件(实际上商业软件也是如此)的各种例子一次次说明:并不一定最新的软件就是最好的软件。

  1. # 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。关于这方面的详细资料,您可以查阅其它文章,以下是一个简要的安装步骤:

  1. # cd /usr/ports/security/openssl
  2. # make install
  3. # make clean
  4. # cd /usr/ports/www/apache2
  5. # make install
  6. # make clean
  7. # vi /etc/rc.conf
  8. 添加 apache2_enable="YES"

(3)安装 vm-pop3d

  1. # cd /usr/ports/mail/vm-pop3d
  2. # 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只需在安装好之后设置启动就行:

  1. # cd /usr/local/etc/rc.d
  2. # 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:

  1. # cd /usr/ports/mail/postfix/
  2. # make install clean

正常情况下安装Postfix的时候,就会自动安装SASL2了,如果没有安装的话,可以自己到/usr/ports/security/cyrus-sasl2下安装。注意,安装Postfix的时候,选上PCRE、SASL2、TLS、VDA;安装SASL2的时候,选上LOGIN、PLAIN、CRAM、DIGEST、OTP、NTLM(如果想要使用authdaemon方式进行验证的话,也可以将AUTHDAEMOND勾上)。

使用ports安装postfix,默认情况下,只能够通过web页面发信,而不允许使用foxmail、outlook等邮件客户端发信。所以我们需要修改postfix的配置文件,以让其支持客户端SMTP发信。下面我们就介绍如何配置Postfix(包括基本配置与高级配置):

  1. # vim /usr/local/etc/postfix/main.cf
  2. 在最后添加:
  3. virtual_alias_maps=hash:/usr/local/etc/postfix/virtual
  4. alias_maps=hash:/usr/local/etc/postfix/aliases
  5. default_privs=nobody
  6. allow_mail_to_commands = alias,forward,include
  7. allow_mail_to_files = alias,forward,include
  8. smtpd_client_restrictions = permit_sasl_authenticated
  9. smtpd_sasl_auth_enable= yes
  10. smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
  11. smtpd_sasl_authenticated_header = yes
  12. broken_sasl_auth_clients = yes
  13. smtpd_sasl_path = smtpd
  14. 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的验证程序。配置文件如下:

  1. # vim /usr/local/lib/sasl2/smtpd.conf
  2. 添加如下内容:
  3. pwcheck_method: auxprop
  4. auxprop_plugin: sasldb
  5. mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5

这样我们就可以使用Cyrus SASL自己的存储邮箱用户名和密码的文件来进行验证。当然,刚开始的时候,SASL的这个password file(默认为/usr/local/etc/sasldb2.db)中是没有数据的,我们可以通过如下命令来添加能够通过验证的邮箱名和密码。由于我们使用虚拟域进行配置,所以我们在添加能通过验证的用户时,需要指定完整的邮箱名:

  1. # saslpasswd2 -c -u wangzhongyuan.com test

它就会提示你输入验证密码,这样test (at) wangzhongyuan.com这条数据就添加到了SASL2的验证数据库文件中了。我们可以通过如下命令查看这个验证数据库文件中已经有哪些用户了:

  1. # sasldblistusers2

下面我们为这个邮件服务器中添加虚拟域了,使用虚拟域就可以在一台服务器上为多个域名配置邮件服务功能,类似Apache中的虚拟主机一样。例如我们需要添加xxxxxxx1.com和xxxxxxx2.com这两个虚拟域(这边的xxxxxxx1.com就可以是上面添加到SASL2验证数据库中的邮箱域wangzhongyuan.com,只是为了收到垃圾邮件,下面我使用xxxxxxx1.com代指wangzhongyuan.com进行配置说明):

  1. # cd /usr/local/etc/postfix/
  2. # vim virtual
  3. 在最后面添加:
  4. xxxxxxx1.com  anything
  5. test@xxxxxxxn1.com  test.xxxxxxx1.com
  6. xxxxxxx2.com  anything
  7. test@xxxxxxxn2.com  test.xxxxxxx2.com
  8. 然后保存退出,执行如下命令生成virtual.db虚拟域数据库:
  9. # postmap virtual
  10.  
  11. # vim aliases
  12. 在最后面添加:
  13. test.xxxxxxx1.com:/var/spool/virtual/xxxxxxx1.com/test
  14. test.xxxxxxx2.com:/var/spool/virtual/xxxxxxx2.com/test
  15. 然后保存退出,执行如下命令生成aliases.db别名数据库:
  16. # postalias aliases

注:同理可以添加其它域,需要注意的是,编辑/usr/local/etc/postfix/virtual以及/usr/local/etc/postfix/aliases后需要重新调用上面的postmap和postalias命令生成对应的数据库.db文件。

至此,利用SASL2支持登录验证的Postfix配置就已完成。我想,相对于其它那些需要Mysql支持的验证方式而言,这种验证方式是简单高效的,也是Postfix官方推荐的验证方式。

(5)安装配置Web邮件系统Open Webmail

  1. # cd /usr/ports/mail/openwebmail/
  2. # make WITH_QUOTA=yes install clean

下面配置openwebmail支持wangzhongyuan.com,创建下面的文件:

  1. # vim /usr/local/www/cgi-bin/openwebmail/etc/sites.conf/wangzhongyuan.com
  2. 添加如下内容:
  3. auth_module auth_vdomain.pl
  4. auth_withdomain yes
  5. mailspooldir /var/spool/virtual/wangzhongyuan.com
  6. use_syshomedir no
  7. use_homedirspools no
  8. enable_autoreply no
  9. enable_setforward no
  10. enable_vdomain yes
  11. vdomain_admlist test
  12. vdomain_maxuser 500
  13. vdomain_vmpop3_pwdpath /usr/local/etc/virtual
  14. vdomain_vmpop3_pwdname passwd
  15. vdomain_vmpop3_mailpath /var/spool/virtual
  16. vdomain_postfix_aliases /usr/local/etc/postfix/aliases
  17. vdomain_postfix_virtual /usr/local/etc/postfix/virtual
  18. vdomain_postfix_postalias /usr/local/sbin/postalias
  19. vdomain_postfix_postmap /usr/local/sbin/postmap
  20. # quota
  21. quota_module quota_du.pl
  22. quota_limit 104800 //set the size of mail box
  23. quota_threshold 85
  24. delmail_ifquotahit no
  25. delfile_ifquotahit no

注:其中的vdomain_admlist test定义了这个邮箱域的第一个用户test@xxxxxxx1.com,他也是管理员用户,他登录Open Webmail后,可以在个人模板中添加新的邮箱用户(添加用户按钮在个人设置那个页面上排按钮中);quota_limit 104800部分设置了邮箱大小,104800的单位是K,这样这个邮箱的容量就是100多M。

然后进行Open Webmail最后的设置:

  1. # mkdir -p /var/spool/virtual/wangzhongyuan.com
  2. # chown nobody /var/spool/virtual/wangzhongyuan.com
  3. # chgrp mail /var/spool/virtual/wangzhongyuan.com
  4.  
  5. # mkdir -p /usr/local/etc/virtual/wangzhongyuan.com
  6. # touch /usr/local/etc/virtual/wangzhongyuan.com/passwd
  7. # chmod 644 /usr/local/etc/virtual/wangzhongyuan.com/passwd
  8. # htpasswd /usr/local/etc/virtual/wangzhongyuan.com/passwd test
  9.  
  10. # chmod 755 /usr/local/www/cgi-bin/openwebmail/etc/users
  11. # sync
  12. # 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。配置如下:

  1. <VirtualHost *:80>
  2. ServerName email.xxxxxxx1.com
  3. DocumentRoot "/usr/local/www"
  4. DirectoryIndex /cgi-bin/openwebmail/openwebmail.pl
  5. Alias /openwebmail "/usr/local/www/data/openwebmail"
  6. </VirtualHost>
  7.  
  8. <Directory "/usr/local/www/">
  9. AllowOverride All
  10. Options ExecCGI
  11. Order allow,deny
  12. Allow from all
  13. </Directory>

重启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

本文可以自由转载,转载时请保留全文并注明出处:
转载自仲子说 [ http://www.wangzhongyuan.com/ ]
原文链接:

8 Comments »

  1. 王继玉 said,

    2007年October18日 at 9:32

    哦,无意中看到你的网站,不过都看不懂,呵呵~~~现在还在北京么?呵呵,加我QQ吧119387974

    呜呜,上面的居然要填那么多。

  2. 仲远 said,

    2007年October19日 at 2:15

    呵呵,第一次需要填的信息比较多,如果你是在同一台机器上进行评论的话,第二次就不用填啦:)

  3. tecer said,

    2007年October20日 at 0:26

    看了一下,简单实用,多谢校友提供这么好的东东,以后相关方面还望多指教。

  4. 仲远 said,

    2007年October20日 at 22:33

    呵呵,不敢当~~
    虽然文章比较长,其中啰唆的部分以及自己理解的部分写得比较多一些~~~
    如果从要安装的软件以及要配置的部分来看,应该是比使用Mysql方式进行验证要简单得许多许多~~

  5. 阿布 said,

    2007年October30日 at 11:13

    仲远先生,再接再厉,把杀毒、防垃圾邮件功能也搞上来。

    非常期待。

  6. cai said,

    2008年July27日 at 13:03

    朋友 谢谢你的文章
    有个问题想请教 如何在命令行中添加用户 而不用每次跑到WEB上面去添加
    (WEB上面添加会有提示错误 不过用户到是添加了)

    另外用户邮箱管理在命令行中常用操作有哪些? 谢谢 希望有空能回下:
    caidanfeng@hotmail.com

  7. hhesong said,

    2008年August9日 at 10:44

    为什么我本地发给本地的邮件,webmail提示发出去了,可是本地却接收不到.

  8. 快速祛痘印 said,

    2010年December30日 at 1:55

    哦,原来是这么回事啊,学习了

Leave a Comment

*
To prove you're a person (not a spam script), type the security text shown in the picture. Click here to regenerate some new text.
Click to hear an audio file of the anti-spam word