虚拟域名和 qmail

作者:Mike Thomas

程序 qmailsendmail 的安全可靠的替代品;它由伊利诺伊大学芝加哥分校的 Dan Bernstein 编写。我被它吸引有几个原因,最重要的原因是它在 Linux 下运行。

qmail 比 sendmail 安全得多。该系统被划分为几个模块,最大限度地减少了以 root 身份运行的代码量。 /var/spool/mail 目录已消失;用户的传入邮件存储在用户的 home 目录中,消除了一个令人烦恼的安全漏洞。 qmail 让您可以控制接受哪些邮件。您可以选择性地允许其他主机将您的系统用作中继,阻止所有其他主机。

qmail 支持带有自动订阅的邮件列表,并且这些列表可以完全由用户配置和维护。创建新列表不需要系统管理员的干预。

qmail 的性能非常出色。 Dan Bernstein 以 Red Hat Software 为例。 Red Hat 在一台 48MB 奔腾处理器上运行 sendmail 8.7,发现他们每天 70,000 条消息的负载开始使系统不堪重负。他们在 16MB 486/66 上切换到 qmail,他们的邮件枢纽现在运行良好,即使在性能较低的硬件上也是如此。

我开始研究 qmail 作为 sendmail 替代方案的原因是 qmail 早在 sendmail 之前就正确地支持了虚拟域名的电子邮件。在单个 Linux 主机上运行多个虚拟域名的用户可以欢呼了。使用 qmail,您为虚拟域名选择的电子邮件名称来自每个虚拟域名的命名空间,而不是单个主机范围的命名空间。这意味着您可以同时拥有 webmaster@domain1.com 和 webmaster@domain2.com 等电子邮件名称。

缺点

我们使用 qmail 遇到的唯一问题是它的传出队列在其数据库中使用 inode 号;这意味着队列无法在一台机器上备份并在另一台机器上恢复。当我们发生磁盘故障时,我们必须重新创建一个空的 qmail 队列目录,而不是从备份恢复。

qmail 不是 sendmail 这一事实意味着在安装 majordomo 等附加电子邮件软件包时会出现一些复杂情况。一般来说,这些软件包有针对 qmail 的修补版本可用。

qmail 安装和配置

qmail 源代码可在 ftp://koobera.math.uic.edu/www/qmail.html 获取,许多有用的信息可在 http://www.qmail.org/ 获取。 qmail 的编译和安装非常简单。那些对 sendmail.cf 文件感到畏惧的人会对 qmail 的配置感到惊喜。一切都是人类可读且易于理解的。有些人声称 sendmail.cf 是人类可读的,但我会对此观点提出异议。

一旦您配置并运行了 qmail,您就可以开始添加虚拟域名。本文的其余部分讨论 qmail 下的虚拟域名。所有文件和路径名都假定为默认的 qmail 安装。

支持新虚拟域名的电子邮件

正常设置新的虚拟域名。你们中的许多人已经这样做了,以支持具有 Apache httpd 等其他服务的虚拟域名。确保 DNS 中有一个 MX 记录,将虚拟域名的邮件指向运行 qmail 的主机。

为新域名创建一个主用户 ID 和 home 目录。主用户 只是一个将控制您的虚拟域名所有邮件的用户。我通常为每个虚拟域名创建一个用户 ID,该域名的管理员可以使用该 ID 上传其网站的内容。 qmail 可以使用相同的用户 ID。

在 /var/qmail/control/virtualdomains 中为新域名添加一行,将该域名的邮件定向到上面创建的用户。如果域名是 abc.com,用户是 abc,则合适的行将是

abc.com:abc

将 abc.com 添加到 /var/qmail/rcpthosts 以告诉 qmail 您愿意接受寻址到 abc.com 的邮件。确保 abc.com 出现在 /var/qmail/control/locals/ 中。

一旦邮件被定向到用户,它将通过该用户 home 目录中的一系列 .qmail-xxx 文件进行控制。创建文件 ~abc/.qmail-default,以指示用户 abc 愿意接受定向到 abc.com 域名的所有邮件。

重启 qmail,现在 abc.com 的所有用户的电子邮件,即 john.smith@abc.com、webmaster@abc.com 等都将由本地用户 abc 接收。我怀疑这并非完全是您所期望的,请继续阅读。

转发虚拟域名用户的邮件

如果要将虚拟域名中新用户的邮件转发到现有的站点用户或站外用户,则无需为新用户创建帐户。您可以在虚拟域名主用户的 home 目录中创建一个 .qmail-xxx 文件来转发邮件。主用户是我们上面创建的用户,他目前正在接收虚拟域名的所有邮件。对于地址 john.smith@abc.com,您创建一个文件 ~abc/.qmail-john:smith,其中包含 John 的邮件要转发到的地址,如下所示

&smith.john@home.boston.ma.us

请注意,用户 Internet 名称中的任何句点都将替换为 .qmail-xxx 文件名中的冒号。存储在 .qmail-xxx 文件中的转发地址 会将句点替换为冒号。

虚拟域名用户的 POP3 邮件

如果虚拟域名的用户将使用 POP3 接收他的邮件,您必须为他创建一个帐户和一个传入邮件目录。 qmail 附带的 POP3 守护程序无法从普通的 mbox 格式文件中接收邮件。

# adduser jsmith
# chmod g-w ~jsmith
# chmod o-w ~jsmith
# cd ~jsmith
# maildirmake Maildir
# chown -R jsmith.users Maildir

上面脚本中的 chmod 命令确保除了 jsmith 本人之外,没有人可以写入 jsmith 的 home 目录。 qmail 将此要求作为安全措施强制执行,但可以使用编译时选项来放宽此要求——请参阅 conf-unusual.h 文件中的 ALIAS_PATERNALISM

请注意,在包含 adduser 命令的 Linux 发行版(如 Slackware)下,您可以在 /etc/skel 中执行 maildirmake,以便新用户将自动获得 Maildir。

与上一节相同,您需要在虚拟域名主用户的 home 目录中创建一个 .qmail-xxx 文件,以将邮件转发给每个单独的用户。要将 john.smith@abc.com 的邮件转发给本地用户 jsmith,我们将创建一个文件 ~abc/.qmail-john:smith,其中包含以下行

&jsmith

为了指示他的传入邮件应该存储在哪里,我们将在 jsmith 的 home 目录中创建一个 .qmail 文件,其中包含

/home/jsmith/Maildir/
此步骤是必需的,因为 qmail POP 服务器希望在专门构造的目录(默认名称为 Maildir)中找到用户的邮件,我们必须告诉 qmail 将其放在那里。

一旦您开始将传入邮件存储在非标准位置,您就必须告诉本地邮件程序在哪里找到它。标准的 Linux 邮件程序无法读取 Maildir 格式的邮件,因此 qmail 包含几个包装程序,用于将任何传入邮件移动到 mbox 格式(分别为 mail、pine 和 elm 的 qail、qine、qlm)。您可以重命名真实的邮件用户代理,并将这些包装程序链接到常用名称,这样您的用户甚至看不到任何差异。这些包装程序需要一些信息才能正确运行。为了处理这个问题,请将此类行添加到 /etc/profile 文件中

export MAILDIR=$HOME/Maildir
export MAIL=$HOME/Mailbox
export MAILTMP=$HOME/Mailbox.tmp

您必须做的最后一件事是安装 qmail 的 POP3 守护程序。它分为三个程序,其中一个程序处理用户名和密码。那些安装了影子密码的用户会欣赏这种模块化。一个密码检查程序 checkpassword,它可以与普通的 Linux /etc/passwd 文件一起工作,可以在与 qmail 发行版相同的 URL 找到。您的 /etc/inetd.conf 中的 POP3 行必须进行修改。如何在 qmail 随附的 FAQ 中详细介绍了如何执行此操作。

如果您觉得以上更改过于 disruptive,另一种选择是修补您现有的 POP3 守护程序,使其在用户 home 目录中的 mbox 格式文件中查找用户的传入邮件,而不是在 /var/spool/mail 中的类似文件中查找。 ftp://summersoft.fay.ar.us/pub/qmail/ 上提供了一个这样的软件包。通过使用修补的 POP 服务器而不是 qmail 发行的 POP 服务器,您唯一失去的是更可靠的 Maildir 邮件存储格式。

在没有主用户的情况下转发虚拟域名用户邮件

如果您想转发新虚拟域名的所有邮件,但您没有理由为该域名创建主用户 ID(例如,您不提供 Web 服务),您可以使用特殊的 别名用户 ID 来执行此操作。不要将行 abc.com:abc 添加到 /var/qmail/control/virtualdomains,而是添加行

abc.com:alias-abc

这会将别名用户指定为负责 abc.com 域名的所有邮件的一方。 qmail 的默认安装将别名用户的 home 目录设置为 /var/qmail/alias,因此对 abc.com 的所有电子邮件的控制都在此目录中完成。

您可以创建一个文件 ~alias/.qmail-abc-default 以将 abc.com 的所有邮件转发给特定用户。您还可以创建一系列文件,例如 ~alias/.qmail-abc-webmaster 和 ~alias/.qmail-abc-john:smith,以转发 abc.com 的特定人员的邮件。

请注意,别名用户(或任何其他用户)可以控制多个虚拟域名的邮件。要控制 abc.com 和 anotherdomain.org,请将以下行放在 /var/qmail/control/virtualdomains 文件中

abc.com:alias-abc
anotherdomain.org:alias-anotherdomain

您需要在 ~alias 目录中找到这些文件

~alias/.qmail-abc-john:smith
~alias/.qmail-abc-nancy:jones
~alias/.qmail-abc-webmaster
~alias/.qmail-anotherdomain-sam:adams
~alias/.qmail-anotherdomain-webmaster
请注意,与 sendmail 不同,您可以有两个具有相同 Internet 用户名的用户,只要它们位于不同的虚拟域名中即可。在上面的示例中,有 webmaster@abc.com 和 webmaster@anotherdomain.org。
处理具有类似 /etc/aliases 文件的虚拟域名

如果您的虚拟域名有数百个用户,您可以使用一个调用 qmail forward 命令的小脚本来避免数百个 .qmail-xxx 文件。

不要在虚拟域名主用户的 home 目录中创建单独的 .qmail-xxx 文件,而是创建一个包含以下行的单个 .qmail-default 文件

|/usr/local/bin/qmail_db_lookup /home/master/qmail_db

将 /home/master/qmail_db 修改为反映您的虚拟域名的 home 目录。然后,您可以创建(或从您现有的 /etc/aliases 中调整)文件 /home/master/qmail_db,该文件由包含虚拟域名用户、冒号和转发地址的行组成。特殊用户名“ - ”指示应将邮件转发到任何未明确列出的用户的位置。如果未提供“ - ”用户名,则将退回发送给不存在的用户的邮件。一个示例 qmail_db 文件可能如下所示

-:  postmaster@somewhere.com
john.smith:   john.smith@alo.com
carl.jones:   cjones@test.net
karen.quincy: kquincy
all:  john.smith@alo.com cjones@test.net kquincy
请注意,“ - ”用户的转发地址必须是实际地址;否则,发送到虚拟域名中不存在的地址的邮件将被接受,但不会传递给任何人。

列表 1

一个更重要的软件包,用于支持 /etc/aliases,qmsmac,随 qmail 提供。qmsmac 支持任意深层嵌套的别名和长别名,但与 sendmail 一样,每次 /etc/aliases 文件更改时,都需要重建别名数据库。

结论

qmail 似乎是 sendmail 的快速而强大的替代品。我们的 Linux Internet 服务器上已经运行 qmail 很多个月了,没有出现过一次故障。 qmail 提供的附加功能可能对那些从单个 Linux 计算机托管多个虚拟域名的用户有用,而更简单的配置是一个额外的优势。

Virtual Domains and qmail
Mike Thomas 是一名互联网应用程序开发人员,在加拿大萨斯喀彻温省的一家咨询公司工作。 Mike 住在马萨诸塞州,使用两台 Linux 系统远程通勤 2000 英里到他在 Regina 大学的工作和研究生院。可以通过电子邮件 thomas@javanet.com 与他联系。
加载 Disqus 评论