-- hd [2004-08-09 21:39:55]

1. Freebsd Postfix安装Howto

一直以来使用qmail来充当邮件服务器。最终还是决定使用postfix来试一下,记录下来,希望能对大家有所帮助。 在安装时使用的软件版本:

  • Freebsd 4.10 stable
  • Perl 5.8.5
  • Mysql 4.0.20
  • pam_mysql-0.5_1
  • cyrus-sasl-2.1.19
  • cyrus-sasl-saslauthd-2.1.19

1.1. 安装所需要的基础软件

1.1.1. Perl 5

在我们使用有的软件中有不少需要perl的支持,而且需要较新的版本,上述配置推荐使用perl 5.8.x:

cd /usr/ports/lang/perl5.8
make install
make clean
use.perl port

最后一个命令是让操作系统使用的为port中提供的perl,而不是操作系统自带的。在 FreeBSD 5.x 中,由于系统已经不再包含 perl,可能需要手工建立一个到 perl5.8.5 执行文件的符号连接才能够使用use.perl脚本。

1.1.2. Mysql 4

用户最终将存储在Mysql的数据库中,所以需要装一个mysql的服务器,现在stable的版本为4.0,所以就安装这个版本了:

cd /usr/ports/databases/mysql40-server
make install
make clean

1.1.3. pam-mysql

我们需要使用mysql的pam模块来使系统到mysql中进行用户的验证。所以需要安装pam-mysql:

cd /usr/ports/security/pam-mysql
make install
make clean

由于4 stable不在/usr/local/lib中寻找pam的so,所以你需要把它复制过去:

cp /usr/local/lib/pam_mysql.so /usr/lib/pam_mysql.so

1.1.4. cyrus-sasl2

我们使用cyrus-sasl来进行具体的认证和安全处理的工作:

cd /usr/ports/security/cyrus-sasl2
make install
make clean

1.1.5. cyrus-sasl2-saslauthd

为了让认证更快和稳定,我们使用cyrus-sasl2-saslauthd来建立一个Daemon进行验证:

cd /usr/ports/security/cyrus-sasl2-saslauthd
make install
make clean

为了让saslauthd正常启动,你需要在/etc/rc.conf中加入这么一行:

saslauthd_enable="YES"

1.1.6. cyrus-imapd 2.2

为了支持邮件的相关协议,我们使用cyrus-imapd包:

cd /usr/ports/mail/cyrus-imapd22
make install
make clean

注意在进行编译时需要选中以下条目:

  • BDB_3
  • IDLE_POLL
  • LISTEXT
  • MURDER

为了让imapd能启动,你需要在/etc/rc.conf中加入这么一行:

cyrus_imapd_enable="YES"

1.2. 数据库准备

1.2.1. 启动数据库

刚装完mysql的情况下,需要用这两步启动mysql,如果你重启动了机器,它们应都自动启动了:

/usr/local/etc/rc.d/000.mysql-client.sh start
/usr/local/etc/rc.d/mysql-server.sh start 

使用ps看看mysql是否正常运行。

1.2.2. 创建数据库结构

建一个名为maildb.sql的文件,内容如下:

CREATE DATABASE maildb;
GRANT ALL ON maildb.* TO mail@localhost IDENTIFIED BY "password";
FLUSH PRIVILEGES;

USE maildb;

CREATE TABLE USER (
ID int(10) unsigned NOT NULL auto_increment,
USERNAME varchar(128) NOT NULL default '',
PASSWORD varchar(40) NOT NULL default '',
FORWARD varchar(128) NOT NULL default '',
DOMAIN varchar(64) NOT NULL default '',
MAIL varchar(64) NOT NULL default '',
FILTER varchar(64) NOT NULL default 'OK',
PARTITION varchar(32) NOT NULL default 'default',
QUOTA int(11) NOT NULL default '10485760',
STATUS tinyint(4) NOT NULL default '1',
PRIMARY KEY (ID),
UNIQUE KEY USERNAME (USERNAME),
UNIQUE KEY MAIL (MAIL)
) TYPE=MyISAM;


INSERT INTO USER (USERNAME,PASSWORD,FORWARD,DOMAIN,MAIL) 
VALUES ('hd','$1$randstr$SHFmBb4tKDRXO1bgdFcLr1','hd','huangdong.com','[email protected]'),
('[email protected]','$1$randstr$SHFmBb4tKDRXO1bgdFcLr1','[email protected]','iyaya.net','[email protected]');

我们对表中的相关列进行说明:

  • USERNAME 用户名和邮箱的查询主健
    • 对于非虚拟域使用用户名就可
    • 对于虚拟域需要用@将用户名和域名写全,也就是你的邮箱的全部
  • PASSWORD 经过MD5加密的密码
  • FORWARD 投递邮箱的地址
    • 如果该地址为外部地址,哪么它会转发到外部邮箱
    • 其它情况下写与用户名相同的地址即可
  • DOMAIN 用来快速找出域中的邮箱,仅为管理使用
  • MAIL 邮件地址全称,为了管理使用,还用于全局过滤控制FILTER的查找条件
    • 非虚拟域邮箱中它包含了本地部分外的域名部分
    • 虚拟域邮箱中它和USERNAME字段一样
  • FILTER 用于控制该邮箱是否接受服务器的全局邮件过滤。该值设置为“OK”或为空表示对该邮箱不进行过滤;设置为“DUNNO”表示对该邮箱进行Postfix中定于的全局过滤。该值可以是任何合法的Postfix的access过滤规则
  • PARTITION 用于指明邮箱存储的Cyrus-IMAP邮件分区。可以建立多个不同的邮件分区。仅为了管理方便使用
  • QUOTA 指定邮箱的磁盘限额。仅为了管理方便使用
  • STATUS字段用来指示该用户是否有效,可以通过修改该值为0来临时禁止某个用户

md5的密码可以通过向系统中加一个用户再从passwd文件中复制出来,也可以使用下面这个perl的命令行取得:

perl -e 'print crypt("passwd","\$1\$randstr\$"),"\n"' 

用你的密码替换其中的passwd,用一段随机字符替代randstr,这样也可以得到md5后的字符串。

回头再看看sql语句中,我们建议了两个用户一个用户hd是非虚拟域的用户(非虚拟域名为huangdong.com),以及一个[email protected]这个虚拟域用户。它们的密码为"passwd"(就是使用上面这句perl命令产生的密码)。

用以下命令,执行这个sql文件:

mysql < maildb.sql

1.3. 认证准备

1.3.1. pam-mysql配置

我们需要将下面的配置加入到/etc/pam.conf中:

imap auth required pam_mysql.so user=mail passwd=password db=maildb table=USER usercolumn=USERNAME passwordcolumn=PASSWORD crypt=1
imap account sufficient pam_mysql.so user=mail passwd=password db=maildb table=USER usercolumn=USERNAME passwordcolumn=PASSWORD crypt=1
pop3 auth required pam_mysql.so user=mail passwd=password db=maildb table=USER usercolumn=USERNAME passwordcolumn=PASSWORD crypt=1
pop3 account sufficient pam_mysql.so user=mail passwd=password db=maildb table=USER usercolumn=USERNAME passwordcolumn=PASSWORD crypt=1
smtp auth required pam_mysql.so user=mail passwd=password db=maildb table=USER usercolumn=USERNAME passwordcolumn=PASSWORD crypt=1
smtp account sufficient pam_mysql.so user=mail passwd=password db=maildb table=USER usercolumn=USERNAME passwordcolumn=PASSWORD crypt=1

同时还需要将原有的两行认证注释:

# imap auth required pam_unix.so try_first_pass
# pop3 auth required pam_unix.so try_first_pass

1.3.2. Cyrus-IMAP认证配置

编辑/usr/local/etc/imapd.conf,确认以下设置的正确:

configdirectory: /var/imap
partition-default: /var/spool/imap
unixhierarchysep: yes
altnamespace: yes
##是否允许匿名登入;认证后才登入是个好主意,请把它设为 no
allowanonymouslogin: no
##限定的信箱容量达多少百分比 (%) 时,系统发出警告
quotawarn: 90
##设置 cyrus server 的管理员为 hd
admins: hd
##设为 no 才不会把不是 8-bit 的 characters 给 reject 掉
reject8bit: no
sievedir: /var/imap/sieve
sasl_pwcheck_method: saslauthd
##此选项列出允许的 mechanisms/authentication methods
sasl_mech_list: plain login cram-md5 digest-md5

设置完成后,执行cyrus imap的工具程序建立它所需要的目录结构:

/usr/local/cyrus/bin/mkimap