• 欢迎访问Ppabc博客网站,专注于Linux、CentOS、Apache、Nginx、MySQL、PHP等开源工具安装优化的技术博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入Ppabc博客
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏Ppabc博客吧

FreeBSD下使用Postfix+vm-pop3d+SASL2+OpenWebmail搭建带虚拟域的邮件服务器解决方案

baidu空间 admin 11年前 (2008-03-05) 185次浏览

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

本解决方案中采用的各个软件都是开源的邮件服务器中比较流行的项目,各个软件都有自己很特色的地方。本文参考了《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

]]>


Selinux 中国 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:FreeBSD 下使用 Postfix+vm-pop3d+SASL2+OpenWebmail 搭建带虚拟域的邮件服务器解决方案
喜欢 (0)