特殊:Badtitle/NS100:PostfixCompleteVirtualMailSystemHowto/zh:修订间差异
第222行: | 第222行: | ||
</nowiki></pre> | </nowiki></pre> | ||
切记要输入一个好的密码 '''rootpassword''' | 切记要输入一个好的密码 '''rootpassword''' | ||
=== | === 为焦急的用户设置MySQL === | ||
下列步骤是基于PostfixadminMySQL的,如果您非常焦急,可以直接使用下列步骤创建表。 | 下列步骤是基于PostfixadminMySQL的,如果您非常焦急,可以直接使用下列步骤创建表。 | ||
<pre><nowiki> | <pre><nowiki> | ||
第364行: | 第364行: | ||
#------------------------------------End copy------------------------------------- | #------------------------------------End copy------------------------------------- | ||
</nowiki></pre> | </nowiki></pre> | ||
=== Step by Step Database Setup === | === Step by Step Database Setup === | ||
The users who are wish to setup database step by step can use the following steps and understand what table is using what purpose. | The users who are wish to setup database step by step can use the following steps and understand what table is using what purpose. |
2008年7月7日 (一) 09:24的版本
摘要
在网上有许多帮助文档来描述如何创建邮件服务器,不同的人对MTAs有不同选择.有的人喜欢用Qmail有些人喜欢用Postfix和Exim.很长一段时间内我都喜欢用Qmail来做为我的MTA,它是一个极好的软件.但是Qmail是需要许可证的,没有方便用户在他们所习惯使用的平台上简单使用的编译好的可执行代码。虽然安装Qmail并不是那么困难,但是用户需要应用各种各样的补丁和技巧等完成完全安装。由于上述原因,并且它一旦安装完毕,运行情况还是令人满意的。所以Qmail成为了很多电脑怪杰的最爱。Qmail的缺点是升级困难,因为每次都需要编译源码并安装。综上所述,决定使用Postfix:一种像Qmail一样快速和安全的MTA,并且易与在任何Linux版本上安装和配置Basic System . Postfix 有许多附加功能并且支持Maildir 邮箱格式, PostgreSQL 后台MySQL很容易存储和管理虚拟域。这里将为希望使用Ubuntu Linux作为服务平台的ISPs,虚拟主机提供商,单个公司等安装一个完整的包含发病毒和垃圾邮件虚拟邮件域系统。
系统概述
开始安装之前,必须了解我们的系统是如何工作的。一个虚拟邮件系统必须能够控制许多域,这些域有很多用户并且用户使用不同接口。当你在同一个邮件系统中控制多个域的时候,虚拟邮件系统会提出一些管理问题。我们必须用我们的技术回答这些问题。例如,你有下面的问题需要回答。
- 如果有两个用户在不同的域中使用了同一个用户名,你怎么办?
- 如果你提供了IMAP访问和smtp认证,如何将不同的认证值守程序组合在同一个系统中呢?
- 如何保证构成系统的各个组件的安全性?
- 如果用户要求使用自己的垃圾邮件过滤策略,我们应该如何处理?
- 每一个域的管理员要求使用基于web接口来管理他们的邮件域。
- 如何为postfix建立一个基于web的管理系统。
- 每个用户要求基于web接口改变邮件帐户密码。
- 如何备份用户帐号数据库及灾难恢复。
- 利用ssl实现传输层安全。
- 控制任何一个域的邮件列表。
你如何一并处理以上提出的所有问题?不要担心,我会逐个回答这些问题。高高兴兴地继续读下去。
使用这个系统你会得到什么
- 基于web的系统管理
- 域的数量没有限制
- 与操作系统用户无关的虚拟邮件用户
- 特定域用户名
- 邮箱容量分配
- 通过web访问邮件帐号
- 基于web接口改变用户密码
- 支持IMAP,POP3
- 自动回复
- SMTP认证保证安全中转
- SSL保证传输层安全
- 强力垃圾邮件过滤
- 反病毒过滤
- 日志分析
必备软件包
我们系统必须使用下列程序包,大多数可以在APT中找到。在安装小节部分,你会学会如何安装和配置他们。
- Webmin
- Postfix
- MySQL
- Apache
- PHP
- Postfixadmin
- Courier-IMAP
- Courier-POP3
- Courier-authlib
- Cyrus-SASL
- Ispell
- Squirrelmail
- Awstats
- Amavisd-new
- Spamassassin
- MailZu
- Razor
- DCC
- Pyzor
- SQLgrey
- Sgwi
- Clamav
整体架构图
下面图示了我们建立的整体架构,如果你仔细观察这张图,你能从图上了解整个系统。
在我们的系统中:
- Postfix:负责通过MTA接收和发送emails。
- MySQL :数据库服务器保存postfix的控制信息。主要涉及用户信息,域信息,email转发及密码
- Courier :像postfix一样的独立的邮件服务,我们利用它的pop3/IMAP服务部件使用户访问邮箱。
- SASL:简单认证与安全层 。你的邮件服务仅信任内部地址,所以对使用外部网络地址的用户进行身份认证。通过SASL对SMTP认证使你的邮件服务信任他们。
Postfix 如何实现映射
理解Postfix 如何实现映射非常重要。我们系统的核心就是Postfix 映射,在这里我们主要讨论这个问题,不要跳过这个部分。
映射通常的字面意义是:在两个值之间建立关系。我们在Postfix中必须映射的是邮件用户帐号或邮件地址。例如Postfix使用的本地别名与本地系统用户映射文件:/etc/aliases
, 显示了映射结构:
postmaster: root
这一映射结构导致所有发往[email protected]
的信件都被重定向到 [email protected]
. 我们将上面的映射结构分成左手边LHS 和右手边RHS。RHS和LHS 是在映射关系中常用的缩略语。下表更清晰的说明了映射关系。
LHS | RHS |
postmaster: | root |
过去为了保证回溯能力使用冒号(:),现在Postfix中通常我们不在LHS里使用。本地别名文件它是一个用 newaliases 命令编译的而不是用通常的Postfix 映射命令postmap编译的特别文件。 |
Postfix基本默认安装中,我们为映射建立一个文本文件。我们把映射写入文本文件然后用postmap命令把此文本文件转换成一个 hash 文件。以便Postfix 能快速查到此条目。例如,假设我们在一个文件/etc/Postfix/virtual_mailboxes
中映射我们的虚拟邮箱。文件结构如下:
[email protected] sigiri [email protected] kala
你可能已经注意到在映射文件的左手边“左手边”我们没有使用冒号(:)。然后你需要运行:
postmap /etc/postfix/virtual_mailboxes
你可以通过在Postfix配置文件中加入下面这行命令来访问映射:
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailboxes
在我们的安装过程中,我们将会用MySQL表来替换这个映射文本文件。因为我们的目的是更灵活,更健壮,更易升级的控制数据。数据库表可以包含两列或更多的列。当然你需要告诉Postfix 数据库中哪一列是LHS,哪一列是RHS。我们可以建一个下列样子的配置文件来完成这一任务。
user = postfix password = YJiNLQtubgnOE hosts = 127.0.0.1 dbname = postfix table = mailbox select_field = maildir where_field = username #additional_conditions = and active = '1'
假设这个配置文件是/etc/postfix/mysql_virtual_mailbox_maps.cf
. 现在你可以在Postfix中通过在main.cf
文件中下列条目来使用这个映射。
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
配置文件中user 指出连接MySQL数据库的用户名,password 指出user的密码,dbname指出MySQL 数据库的名字,table指出 MySQL 数据库中表的名字。 hosts指出运行MySQL 数据库的服务器名。Postfix使用这个配置文件指出如何使用数据库表达到像上面提到的两列的映射文件一样的映射效果。映射的左手边称为where_field
映射的右手边称为 select_field
. 在这个例子中,我们映射 maildir
列到 username
列. 利用这个配置, Postfix 构造一个SQL查询语句 select maildir from postfix.mailbox where username='johndoe' 为一个给定的username查找 maildir . 下表突出了这个差别:
LHS | RHS |
where_field | select_field |
username | maildir |
Postfix虚拟域是如何工作的
理解虚拟域是如何工作的对理解我们虚拟邮件系统的建立工作是很重要的。在Postfix中有两种域类型。
- 本地域: 所有mydestination指出的域都被Postfix当作本地域。本地域的邮件被发送给在
/etc/passwd
文件中出现的用户而且这些邮件存放在/var/mail
目录中。 - 虚拟域: 除了本地域之外Postfix还可以为虚拟域发送信件。与本地域不同Postfix可以让我们以一种灵活的方式操作虚拟域。他的优点是我们不需要为每一个邮件帐户在
/etc/passwd
文件中建立系统帐户。从而为我们的邮件系统提供了一种简单的方法来控制数以千计的邮件帐户。我们用在前面讨论过的映射来控制邮件帐户信息。你可以使用 MySQL, PostgreSQL 或 LDAP进行邮件帐户管理。在我们安装的系统中,使用MySQL后台管理虚拟域的邮件帐户
Postfix使用两种不同的分类控制虚拟域,需要理解他们是如何工作的。
- 虚拟别名域: 他被用来从一个email地址向另一个email地址转发别名邮件。这种域能被用做接收邮箱并存储在你的硬盘上。在你构建的系统中虚拟别名域并不是必须的。我们可以使用虚拟别名映射表去替代虚拟别名域,甚至于那些在虚拟别名域没有出现的域。虚拟别名映射表是一张普通的重定向映射表。这张表的作用是(The virtual_alias_maps is a general-purpose redirection mapping that works for everything that passes your system including local domains.)
- 虚拟邮箱域:' Postfix使用这些域为域中的用户接收邮件并将邮件保存到硬盘的邮箱中。这是一个参数,参数告诉Postfix接收域中的邮件并存放在每个用户的邮箱中。Postfix用虚拟别名映射表的映射决定邮箱在你的硬盘上的位置。请记住,你仍然可以用虚拟别名映射表的映射转发一封邮件到另一个邮箱或外部的邮件地址。所以并不是每一个域用户都必须有一个实际的邮箱,可以仅仅是把把邮件转发到其他地方。
理解一个域必然是虚拟别名域,虚拟邮箱域 或 本地域之一是很重要的。如果你设定一个域是虚拟别名域你将不能够在你的服务器上为这个域接收邮件。相反的,你可以用虚拟别名映射表去forward?action=AttachFile&do=get&target=alias email for both types of domain. 所以虚拟邮箱域可以更灵活的使用。 |
一个域要么是虚拟的,要么是本地的。你不能让一个域同时具有两种特征。所以,如果你希望你的默认域是虚拟的,那么你必须在mydestination定义中将其删除。仅仅设置mydestination=localhost或什么也不写。像root@localhost这样的地址将被发送到本地 root用户。 |
Ubuntu 服务器系统安装
在这部分帮助中,我们假设你已经知道如何安装Ubuntu 服务器系统,我建议你不要使用GUI,如果你想了解更多安装细节参考here
DNS 安装
这个帮助文档假定您至少有一个可以在MX 记录中查到的域,创建BIND DNS server 可以参考here
软件包的安装与配置
你应该安装我在"必备软件包"部分中提到的所有软件包并进行配置。现在我们逐个进行解决。
Postfix 基本服务安装
现在我们安装 Postfix和Postfix和后台MySQL连接的软件包。
安装 Postfix
当安装Postfix时建议选择"Internet Site" 选项。你需要用postfix
程序包来安装Postfix。你可以从
postfix-doc
软件包中,得到Postfix文档。
安装 MySQL 映射支持Postfix
We 需要添加MySQL 映射支持Postfix. 希望您已经阅读了这个帮助文档中的 Postfix 如何实现映射 部分。
安装 postfix-mysql, 需要 postfix-mysql
软件包。
安装 MySQL client , 需要 mysql-client
软件包。
安装 MySQL server, 需要mysql-server
软件包。
安装用户访问和认证软件包
我们将向我们系统的用户提供IMAP/POP3访问。在安装过程中要用到下列软件包:
提供用户认证, 安装courier-authdaemon
软件包。
增加MySQL 支持courier-authdaemon,安装courier-authmysql
软件包。
在Ubuntu 7.10上, 安装 courier-authlib-mysql替代courier-authmysql 。
提供非加密 POP3 访问, 安装 courier-pop
软件包。
提供SSL加密POP3访问, 安装courier-pop-ssl
软件包。
提供非加密IMAP访问, 安装courier-imap
软件包。
提供SSL加密IMAP访问, 安装 courier-imap-ssl
软件包。
安装SMTP 认证包
我们的系统允许动态ip地址用户通过SMTP认证使用我们的邮件服务器发送邮件。它将会阻止非认证用户通过我们的邮件服务器中继转发邮件。我们的系统不但接收而且发送邮件也要求对用户进行认证。
提供加密 SMTP认证, 安装 postfix-tls
软件包。这个软件包可能在安装Postfix时已经安装了。如果已经安装,继续下一步。
安装Cyrus SASL library, 需要libsasl2
软件包。
为SASL library添加认证机制, 需要 libsasl2-modules
软件包。
添加 MySQL 支持SASL library认证机制, 需要libsasl2-modules-sql
软件包。
创建证书, 需要 openssl
软件包。
设置MySQL后台
现在我们需要为Postfix准备MySQL后台。在这部分帮助文档中我们将为Postfix配置MySQL数据库。
设置 MySQL root用户密码
注意MySQL root 帐户与Linux root 帐户不是一回事。MySQL root 帐户是MySQL数据库的管理员帐户。MySQL的root 帐户初始密码为空。现在我将告诉您如何设置密码的两种方法。 To set MySQL root in the command prompt: 以命令行的方式设置MySQL root 帐户
$ sudo mysqladmin -u root password rootpassword
或使用下列步骤设置MySQL root 帐户
$ mysql -u root
在MySQL命令行中输入:
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('rootpassword');
切记要输入一个好的密码 rootpassword
为焦急的用户设置MySQL
下列步骤是基于PostfixadminMySQL的,如果您非常焦急,可以直接使用下列步骤创建表。
$ editor postfixadmin-mysql.sql
把下列内容复制到postfixadmin-mysql.sql文件中,用你为Postfix用户设置的密码替换INSERT INTO user
这一行中的 postfixpassword 。另外还要替换postfixadmin 密码。创建一个数据库,并且在终端中输入下列命令:
$ mysql -u root -p < postfixadmin-mysql.sql
#------------------------------------Start copy------------------------------------- # # Postfix Admin # by Mischa Peters <mischa at high5 dot net> # Copyright (c) 2002 - 2005 High5! # License Info: http://www.postfixadmin.com/?file=LICENSE.TXT # # This is the complete MySQL database structure for Postfix Admin. # If you are installing from scratch you can use this file otherwise you # need to use the TABLE_CHANGES.TXT or TABLE_BACKUP_MX.TXT that comes with Postfix Admin. # # There are 2 entries for a database user in the file. # One you can use for Postfix and one for Postfix Admin. # # If you run this file twice (2x) you will get an error on the user creation in MySQL. # To go around this you can either comment the lines below "USE MySQL" until "USE postfix". # Or you can remove the users from the database and run it again. # # You can create the database from the shell with: # # mysql -u root [-p] < DATABASE_MYSQL.TXT # # Postfix / MySQL # CREATE DATABASE postfix; GRANT SELECT ON postfix.* TO postfix@localhost IDENTIFIED BY 'postfixpassword'; GRANT SELECT, INSERT, DELETE, UPDATE ON postfix.* TO postfixadmin@localhost IDENTIFIED BY 'postfixadmin'; USE postfix; # # Table structure for table admin # CREATE TABLE admin ( username varchar(255) NOT NULL default '', password varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (username), KEY username (username) ) COMMENT='Postfix Admin - Virtual Admins'; # # Table structure for table alias # CREATE TABLE alias ( address varchar(255) NOT NULL default '', goto text NOT NULL, domain varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (address), KEY address (address) ) COMMENT='Postfix Admin - Virtual Aliases'; # # Table structure for table domain # CREATE TABLE domain ( domain varchar(255) NOT NULL default '', description varchar(255) NOT NULL default '', aliases int(10) NOT NULL default '0', mailboxes int(10) NOT NULL default '0', maxquota int(10) NOT NULL default '0', transport varchar(255) default NULL, backupmx tinyint(1) NOT NULL default '0', created datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (domain), KEY domain (domain) ) COMMENT='Postfix Admin - Virtual Domains'; # # Table structure for table domain_admins # CREATE TABLE domain_admins ( username varchar(255) NOT NULL default '', domain varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', KEY username (username) ) COMMENT='Postfix Admin - Domain Admins'; # # Table structure for table log # CREATE TABLE log ( timestamp datetime NOT NULL default '0000-00-00 00:00:00', username varchar(255) NOT NULL default '', domain varchar(255) NOT NULL default '', action varchar(255) NOT NULL default '', data varchar(255) NOT NULL default '', KEY timestamp (timestamp) ) COMMENT='Postfix Admin - Log'; # # Table structure for table mailbox # CREATE TABLE mailbox ( username varchar(255) NOT NULL default '', password varchar(255) NOT NULL default '', name varchar(255) NOT NULL default '', maildir varchar(255) NOT NULL default '', quota int(10) NOT NULL default '0', domain varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (username), KEY username (username) ) COMMENT='Postfix Admin - Virtual Mailboxes'; # # Table structure for table vacation # CREATE TABLE vacation ( email varchar(255) NOT NULL default '', subject varchar(255) NOT NULL default '', body text NOT NULL, cache text NOT NULL, domain varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (email), KEY email (email) ) COMMENT='Postfix Admin - Virtual Vacation'; #------------------------------------End copy-------------------------------------
Step by Step Database Setup
The users who are wish to setup database step by step can use the following steps and understand what table is using what purpose.
Setting up Database, Users, and Privileges
Connect to MySQL database as root
$ mysql -u root -p
Then execute the following SQL commands. To create and use the database:
mysql> CREATE DATABASE postfix; mysql> USE postfix;
To create Postfix user & set password (replace postfixpassword with a password of your choosing):
mysql> GRANT SELECT ON postfix.* TO postfix@localhost IDENTIFIED BY 'postfixpassword';
To create Postfix Admin user & set password (replace postfixadmin with a password of your choosing):
mysql> GRANT SELECT, INSERT, DELETE, UPDATE ON postfix.* TO postfixadmin@localhost IDENTIFIED BY 'postfixadmin';
Create the Table Admin
This table is used create the administrators for our virtual mail system. The admin user will be able create, modify, and delete virtadomain administrators, mailboxes and other administrative tasks in the mail system. Postfix is not using this table. Copy and paste the sql statement to your mysql> prompt.
CREATE TABLE admin ( username varchar(255) NOT NULL default '', password varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (username), KEY username (username) ) COMMENT='Postfix Admin - Virtual Admins';
Create the Alias table
Postfix is using the "address" and "goto" column. Courier is not using this table.
This table can be used for virtual .forward files. This table is nothing more than /etc/aliases that you will find on any *nix OS. Multiple destination email addresses need to be separated by a "," (comma).
|
Following is the table structure for table alias. Copy and paste the sql statement to your mysql> prompt
CREATE TABLE alias ( address varchar(255) NOT NULL default '', goto text NOT NULL, domain varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (address), KEY address (address) ) COMMENT='Postfix Admin - Virtual Aliases';
Create the Domain table
Postfix is using the "domain" and "description" column. Courier is not using this table. Copy and paste the sql statement to your mysql> prompt
CREATE TABLE domain ( domain varchar(255) NOT NULL default '', description varchar(255) NOT NULL default '', aliases int(10) NOT NULL default '0', mailboxes int(10) NOT NULL default '0', maxquota int(10) NOT NULL default '0', transport varchar(255) default NULL, backupmx tinyint(1) NOT NULL default '0', created datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (domain), KEY domain (domain) ) COMMENT='Postfix Admin - Virtual Domains';
Create the Domain Admin Table
Table structure for table domain_admins. This table is used to create individual administrators for each virtual domain. Postfix or Courier is not using this table. Copy and paste the sql statement to your mysql> prompt.
CREATE TABLE domain_admins ( username varchar(255) NOT NULL default '', domain varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', KEY username (username) ) COMMENT='Postfix Admin - Domain Admins';
Create the Mailbox Table
Postfix is using the "username" and "maildir" column while Courier is using the "username", "password", "name" and "maildir" column. Copy and paste the sql statement to your mysql> prompt.
CREATE TABLE mailbox ( username varchar(255) NOT NULL default '', password varchar(255) NOT NULL default '', name varchar(255) NOT NULL default '', maildir varchar(255) NOT NULL default '', quota int(10) NOT NULL default '0', domain varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (username), KEY username (username) ) COMMENT='Postfix Admin - Virtual Mailboxes';
Create the Log Table
Postfix or Courier is not using this table. Instead this table is used to log the activities of domain administrators and mailbox users. Copy and paste the sql statement to your mysql> prompt.
CREATE TABLE log ( timestamp datetime NOT NULL default '0000-00-00 00:00:00', username varchar(255) NOT NULL default '', domain varchar(255) NOT NULL default '', action varchar(255) NOT NULL default '', data varchar(255) NOT NULL default '', KEY timestamp (timestamp) ) COMMENT='Postfix Admin - Log';
Create the Vacation Table
Virual Vacation is done with a local shell account that can receive email. The email is then handled by a Perl script which sends the Vacation message back to the sender. Copy and paste the sql statement to your mysql> prompt.
CREATE TABLE vacation ( email varchar(255) NOT NULL default '', subject varchar(255) NOT NULL default '', body text NOT NULL, cache text NOT NULL, domain varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (email), KEY email (email) ) COMMENT='Postfix Admin - Virtual Vacation';