Postfix虚拟网络域名(1)


近年来,用同一台主机来搭建多个网域,已经蔚然成风。举个实例来说,oreillynet.com和onlamp.com其实位于同一台主机,但是从外界的观点来看,它们似乎分别位于两台完全不同的主机上。一个系统通常有一个最具代表性的网络域名,称为正式网域,除此之外的其他网域,则被视为虚拟网域。每个虚拟网域都可以提供自己的网络与邮件服务,且外界看不出正式网域与虚拟网域的差别。

postfix如何投递虚拟网域的邮件,决定了你需要哪些技术。有两个重要因素影响你的postfix如何支持多个虚拟网域:

网域之间要有单独的命名空间吗?比方说,写给info@oreilly.com和info@ora.com这两个地址的邮件,是放在同一个邮箱还是各自单独的邮箱?对于使用相同邮箱的情况,我们称之为共享网域;而另一种情况则称为独立网域。

每位用户都需要系统账户吗?我们将区别“系统账户”与“虚拟账户”的不同。前者是真正的unix账户,可用来登录服务器系统;后者纯粹用于辨识邮箱,不能登录系统,在/etc/passwd里也没有对应记录。

我们将探讨postfix对于虚拟网域邮件的四种处理方式:

共享网域搭配系统账户

独立网域搭配系统账户

独立网域搭配虚拟账户

虚拟网域搭配非postfix控制管理的特殊格式邮箱

应该挑选哪一种技术,主要决定因素是你所使用的POP/IMAP server。如果你的POP/IMAP server不能辨别虚拟网域,那么,很可能所有邮件地址需要系统账户。某些POP/IMAP servers天生就是为了支持多重网域而设计,而且邮件是存放在本地文件系统的某个特定目录结构下,还有些POP/IMAP server使用自己专属的邮箱格式。对于posfix不支持的邮箱格式,postfix可使用LMTP将邮件交给POP/IMAP server。

不管采用哪一种技术,你的正式网域的DNS是怎么设定的,所有虚拟网域的DNS都必须“依样画葫芦”。

共享网域搭配系统账户

最简单的虚拟网域模式,是每位用户都可以收到每个网域的邮件。就用户的感受而言,就好像同一个邮箱有多个地址一样。这种模式的设定方法最简单,只要将所有虚拟网域名称都列在mydestination参数,并像平常一样为每一位用户都创建自己的系统账户,他们就可以收到写给任何网域的邮件。

这种模式使用LOCAL MDA来执行投递操作,因此,正式网域该有的功能,虚拟网域同样一应俱全,所有网域共享同一个别名文件,每位用户都可以创建自己的.forward文件。举例来说,假设我们希望oreillynet.com网域的邮件服务器兼任ora.com与oreilly.com这两个网域的邮件交换站。第一步是设定那两个虚拟网域的DNS,将它们的mx都指向此服务器;第二步是修改此服务器的mydestination参数,完成修改之后,记得要让postfix重新读取其配置文件,让你所做的改变生效;用户现在可以收到寄给mydestination所列的任一网域的邮件。外界写给info@ora.com或 info@oreilly.com的邮件,都会被投递到同一个系统账户的邮箱。

独立网域搭配系统账户

如果每个虚拟网域都要有自己的命名空间,设定方法就稍微复杂些。在独立网域模式下,写给info@ora.com的邮件不应该被放在 info@oreilly.com的邮箱中。在这种情况下,虚拟网域不应该被列在mydestination参数中,而应该被列在 virtual_alias_domains参数中;你必须为每一个邮件地址分别创建对应的系统账户。每一个系统账户的名称都必须独一无二,但是不要求一定要与邮件地址的人名部分相同,因为我们可以另外准备一个查询表来定义两者之间的对应关系。若要区别账户所属网域,同时又要避免账户名称重复,最简单的方法是将网域名称当成账户名称的一部分。一种可行的命名法则,是使用类似info.ora.com和info.oreilly.com这样的名称来创建系统账户。不过,某些系统平台的账户名称被限制在8个字符以下,如果你的平台不支持长名称,就不能使用这种命名法则。

在postfix知道它应该收下哪些网域的邮件,而你也为每一个地址都准备好对应的系统账户之后,下一步就是将virtual_ailas_maps指向虚拟别名表:

virtual_alias_maps = hash:/etc/postfix/virtual_alias

此查询表定义了每一个虚拟网域邮件地址所对应的实际邮件地址。

每当你修改虚拟别名表后,别忘了使用postmap将该文件转换成postfix可直接查询的格式:

postmap virtual_alias

如果helene和frank能够登录服务器系统,直接从服务器寄信出去,你可能还需要另外准备一个规范映射表,好让他们寄出去的邮件的寄件人地址被改写成正确的地址。例如:

canoniacl_maps = hash:/etc/postfix/canonical

再次提醒,规范映射表也必须经过postmap的转换

独立网域搭配虚拟账户

前两种模式最大的缺点,就是每一个邮件地址都必须在服务器上有对应的系统账户。虽然事前的设定过程不难,但是事后维护工作却很麻烦。尤其当虚拟网域的数量增加时,系统账户的维护工作更是苦不堪言。此外,从系统安全的角度来看,如果绝大部分用户都只是利用服务器来收信而已,实在没有必要赋予他们能够登录系统的能力。比较务实的做法,应该是要求postfix将邮件投递到本地系统上的一个虚拟邮箱目录,在此目录下,每一个虚拟邮件都有自己的邮箱文件,而用户可通过支持虚拟邮箱的POP/IMAP server来取信。虚拟邮箱与一般邮箱的差别之处,在于邮件文件与系统账户之间不要求存在一比一的对应关系。

使用虚拟邮箱模式时,你必须在virtual_mailbox_domains参数列出每一个虚拟网域的名称:

virtual_mailbox_domains = ora.com, oreilly.com

如果你有许多虚拟网域,不妨将它们列在一个文件,然后将virtual_mailbox_domains指向该文件:

virtual_mailbox_domains = /etc/postfix/virtual_domains

/etc/postfix/virtual_domains文件的每一行,各包含一个虚拟网域的名称。

每当postfix收到写给virtual_mailbox_domains所列的虚拟网域的邮件时,就交由virtual MDA执行投递操作。virtual的实质是local MDA的“小型版本”,它以一种安全而且高效率的程序来进行投递,其代价是牺牲了本地别名文件、forward文件、MLM饿支持。不过,这不是什么大缺点,因为我们仍可使用virtual_alias_maps参数来达到同样的效果。

设定虚拟邮箱时,你应该妥善安排邮件目录的结构,使其符合POP/IMAP server的预期要求。支持虚拟邮箱的POP/IMAP server,多半假设所有虚拟邮箱都位于某一个基础目录下,在此目录下,每一个虚拟网域都有一个与其网域名称同名的子目录。因此,如果有两个虚拟网域,则它们的虚拟邮箱应该分别被放在两个子目录下;

定义虚拟邮箱基础目录的参数是virtual_mailbox_base,你必须给出完整的目录路径;

virtual_mailbox_base = /var/vmail

virtual_mailbox_maps参数定义虚拟邮箱查询表的位置;此查询表描述每一位虚拟邮箱用户的邮件地址以及对应的邮箱文件的相对路径文件名。邮箱文件的格式可以是mbox或maildir。如果你选择maildir格式,邮箱文件名末端必须加一个“/"符合。

info@ora.com ora.com/info

info@oreilly.com oreilly.com/info

完成上述设定后,外界写到info@ora.com和info@oreilly.com的邮件,就不会存放在同一个邮箱了。


相关内容