为 Sendmail 建立虚拟邮件域

2006-12-3来源:Qmail人气:9364

介绍

如今,个人计算机拥有强大的功能,单独的一台可以轻易地完成几台服务器的任务,随着internet和邮件系统的成功,我们不得不管理越来越多的邮件域,这里有一个在同一机器上管理几个独立邮件域的方法。


1 基本原理

虚拟邮件域是一种在同一个服务器上管理 独立的用户列表的方法,每个虚拟域有它自己的密码文件,自己的缓冲目录和用户化名文件 ,对每个虚拟邮件域,linuxconf 将建立:
◆ /etc /vmail /passwd.virtual_domain
◆ /etc /vmail /shadow.virtual_domain
◆ /etc /vmail /aliases.virtual_domain
◆ /var /spool /vmail / virtual_domain
◆ /vhome /virtual_domain /
这里,virtual_domain是一个域名,比如foo.com

2 定义虚拟域对话框

要建立一个新的虚拟邮件域,你必须填写一个对话 框,有关DNS和 ip alias 将在这个帮助文件的其他部分描述,在这里,我们将叙述对话框.

2.1 一个名字
你必须为域取名字,你所要做的也仅是如此.

2.2 Fall back destination
这是一个可选的域,一般来说,当一个邮件信息被发送给一个虚拟邮件域的帐户,将会进行以下过程:
◆检查那个名字的化名,如果有一个,将信息发送给化名列表中的每一个成员,化名可以指向其他化名。
◆如果没有发现化名,则将检查虚拟域的用户列表,邮件被附加到符合条件的用户文件夹中。
◆如果既没有化名也没有,用户适合,这个信息会被拒绝,发送者也将收到一个出错信息。
如果定义了fall back 域,则邮件改为发往退回地址,退回地址可以为:
(1)空
这是默认的情况,信息被拒绝。

(2)another_user@another_domain
信息被发往另一个域中的一个特定用户。

(3)@another_domain
信息发往在另一个域中的同一个帐户,例如,发往: unknown@this_domain将转寄给unknown@another_domain

(4)account
信息被发往同一个域中的另一个帐户,这个帐户可以是一个化名。

2.3化名文件
每个虚拟域都绝对有一个化名文件叫做/etc/vmail/alias.domain,这里domain是域名,你可以定义两个或更多,他们会被vdeliver PRogram使用,vdeliver 绝对的拥有最高的优先权,它先在第一个里面查找,然后第二个,直到找到匹配的为止。
注意:和一般的sendmail的化名(/etc/alias)过程一样,化名定义也可以指向另一个化名,邮件列表也可以如此定义。化名文件和普通的sendmail化名文件由同一个对话框维护,这样,提供了相同的功能。

2.4 域名化名
规定几个域指向同一个用户群是可能的,只要需要,你可以加入很多,例如:你可以定义一个虚拟域为foo.ca,然后通过域化名注册为foo.com,两个域将是等效的。

3 开始前的注意事项

虚拟邮件域是你邮件服务器的普通邮件功能的补充,普通邮件域仍然在正确地管理,邮件存储在/var/spool/mail中。因此,如果你的机器现在接受foo.com域的邮件,你又希望分开接受foo1.com和foo2.com域的邮件,你必须定义这两个域为虚拟邮件域,foo.com域的配置没有影响。

4 怎样设置虚拟邮件域

下面是Step By Step的介绍:

4.1怎样配置POP客户端
POP的用户端不用作任何特殊的设置(这是件好事!)我们希望把几个邮件服务器并入同一个box中,We don\'t want to tell everyone about it :-)

4.2怎样安装服务器
阅读邮件的技巧和访问虚拟www是一样的,你需要IP地址。这里有主要的设置,假设我们想建立三个虚拟邮件域:va.foo.com, vb.foo.com,vc.foo.com,你可以用相同的方法去安装这三个独立的服务器,每个服务器为一个单独的邮件域。从此处直至文末我们将给出这三个服务器怎样被合并到一个单独的机器上。

4.2.1 DNS的设置
从DNS来看,每个域有一个邮件服务器,因此每个域的MX是:
◇ va.foo.com→mailhost.va.foo.com
◇ vb.foo.com→mailhost.vb.foo.com
◇ vc.foo.com→mailhost.vc.foo.com
这是DNS所告诉世界的,也是所告诉用户的,一般来说,va.foo.com 域的用户从mailhost.va.foo.com接收邮件,vb.foo.com 域的用户从mailhost.va.foo.com接收邮件,等等.
到目前为止,每个邮件域已经拥有了一个服务器。

4.2.2 安装服务器
继续下面的设置(真实的或虚拟的),至DNS中去为每个服务器分配IP地址,这里我使用私人IP做为例子. 大家会看到我从同一个网络中分配IP.
◇mailhost.va.foo.com→172.16.01
◇mailhost.vb.foo.com→172.16.02
◇mailhost.vc.foo.com→172.16.03
然后我们可以继续,根据那些IP安装3个linux服务器,tell sendmail on each one to accept one of the three domains.

4.2.3 Telling virtual
代替3个linux服务器,我们只安装单独的一个,对每个虚拟邮件域,我们必须:
◇用linuxconf 来定义,这里只包括为域命名
◇定义IP alias (仍然用linuxconf), 这样机器也会回应对这个IP的查询,这在linuxconf 的菜单“networking/IP aliases for virtual hosts”中完成。
◇在/etc/inetd.conf 中安装/usr/lib/linuxlonf/lib/vpop3d代替/usr/sbin/in/pop3d. 即使你没有使用虚拟域,用vpop3d代替pop3d 也是一个drop.
IP alias 是主要的,pop协议只有通过目标的IP才能识别出请求的目标. 这就是为什么pop客户端必须使用不同的名字(实际上是不同的IP)从不同的邮件域阅读信息. 从他们的观点来看,This is expected anyway。
4.2.3.1 怎样安装vpop3d
在你所使用的发行版本是用vpop3d 代替标准的pop daemon 的吗?也许不是,不同的发行版本带有不同的pop3d, 支持NIS, PAM和其他证实了的特性,简易地支持所有这些的一个最好的方法是让pop3 daemon 控主邮件域:vpop3d 仅仅管理虚拟域.To get the result, simply pass as an argument to vpop3d the path of the native pop3 daemon. 当产生一个对主域 的pop请求时,vpop3d 将把控制权交给它,下面是如何设置/etc/inetd.conf 的例子:

pop-3 stream tcp nowait root /usr/sbin/tcpd /usr/lib/linuxconf/lib/vpop3d /usr/sbin/ipop3d

不要取代pop3d 命令,只要简单地插入/usr/lib/linuxconf/lib/vpop3d 即可. 这一行依发行版本的不同而有所差别.

5 如何检查一个配置

设置虚拟域时的大多数错误和DNS有关,下面有一些测试让你检验你的设置是否正确.
一个建议:使用pop客户端不是一个强有力的测试这种配置的方法,那些程序根本不会给出任何信息,它们或是能工作或不能。

5.1检查DNS
对每个虚拟域,你必须作一些DNS设置,我们将用va.foo.com域作例子来说明,下面是具体的步骤:

5.1.1 The MX
命令:
nslookup -q=mx va.foo.com

应该列出一些有用的信息,至少应能得到邮件服务器的名字和它的IP地址,这或是mailhost.va.foo.com或是服务器的正式名字,得到的名字不需要在va.foo.com域中,然而,它必须指向正确的物理服务器。

5.1.2虚拟邮件服务器
在DNS中必须定义mailhost.va.foo.com,这里我用mailhost.它可以是pop.va.foo.com或是其它任何名字,下面的命令:
nslookup mailhost.va.foo.com

应该列出IP地址,接下来的命令:
nslookup the_IP_number_you_got

应该显示mailhost.va.foo.com,如果你没能得到这个,那么你的虚拟POP服务器根本不会工作,事实上,最后,你需要对这个IP地址进行正确的反向查询,如果在同一个DNS中,特定的反向查询域被定义成虚拟域的话,linuxconf会神奇地完成它。
如你成功地完成上两个查询,你已完成了最艰难的部分。

5.1.3 有没有服务器在监听
使用下面的命令:
telnet mailhost.va.foo.com
将连接到物理服务器,这证明IP alias已正确地设置了。

5.1.4 有没有虚拟POP服务器在监听
用下面的命令来看vpop3d有没有正确地安装
telnet mailhost.va.foo.com pop-3
你应得到:
+OK Virtual va.foo.com POP3 Server(Version 1.004) ready
这里“va.foo.com”是关键,如果没有显示这个,说明虚拟域并没有定义,或者/etc/inetd.conf中并没有安装vpop3d。

5.1.5快速检测的工具
脚本:/usr/lib/linuxconf/lib/checkvdomain可用来检查虚拟域的vpop3d的安装情况,不带参数运行它可得到更多有关它的信息。
脚本:/usr/lib/linuxconf/lib/testalldomain读取/etc/named.boot中定义的所以域,然后在每个域中运行脚本checkvdomain(假设每个虚拟域都有一个虚拟邮件主机)。它将报告域的配置是否正确,这对管理员管理很多虚拟域很有帮助。

6 Once 操作

6.1 如何增加POP用户
一旦一个虚拟邮件域开始正常工作,仍然需要在其中增加POP用户,在user accounts菜单中有一项叫Virtual POP account(mail only)的选项可以进行设置,它允许你在里面选择一个虚拟域然后增加用户或进行修改。

6.2 Co_administrator
对每个虚拟邮件域,linuxconf都加入了一个新的特权,你可以将此特权交给任何普通用户,他将被允许管理这个虚拟域中的用户列表(仅仅是POP用户),这也是完全html界面的操作方式。

6.3 用户怎样改变他的密码
pop only 用户 (ppp用户也是)的一个问题是他们没有权限使用任何帐户外壳程序来简单地修改他们的密码。linuxconf对这个问题提供了一个巧妙的解决办法,这仅仅在html界面下有效。它完全支持虚拟邮件域,如果用你的浏览器访问如下URL:
http://your-server:98/htmlmod:userpass:
你将访问一个简单的屏幕,它允许任何人改变他自己的密码。“your-server”可以是虚拟pop服务器中的任何人或是你的服务器的一般名字。Linuxconf 将会通过IP地址正确的管理密码文件。
将这个URL隐藏在你服务器的信息页面中是个好主意。

7 一些问题

7.1 所有从虚拟域发出的邮件都是masquerared
这个问题是由错误的DNS配置导致的。主要是所有邮件离开服务器前和来自虚拟域的邮件都被重写过了,所以它看起来来自服务器的主域。
这个问题源自sendmail的一个特性,sendmail起动时会扫描所有的网络界面(和IP aliases),重新得到名字和它们IP地址的联系,它假设从现在起,那些名字和服务器的主域是等效的,任何从那个名字来的邮件均被伪装成来自主域。
DNS的问题仅仅是你将一个IP的双向映射指向了一个域名而不是域中的一个主机,linuxconf 不会让你犯这个错误,因为它从不会将反向映射指向一个域名,然而 手工设置DNS不会阻止它的发生。
所以,你要确信,所有和IP aliases 联系的IP都指向域中的一台主机,而不是域自己,重起你的DNS,那么你的sendmail将会正常工作。

8. 结论

正确地设置了IP aliases 后,pop用户无法判断有三个服务器还是一个。这会成为一个主要方面。如果你的服务器负担太重了,你可以将一些虚拟邮件域移到其他服务器上,对每个人(用户,DNS),这是完全透明的。