Sendmail + UUCP HOWTO
作者: Jamal Hadi Salim (jamal@glcom.com 或 hadi@cyberus.ca)
历史
初始版本 96年7月:仅适用于 sendmail 的非 bind 版本
96年10月01日:适用于 Redhat 提供的二进制文件
96年10月07日:添加/修改了关于如何编译非 bind sendmail 的提示
96年10月25日:添加/修改了关于如何通过虚拟 /etc/hosts 条目使 sendmail getHostbyAddr() 正常工作的提示
97年3月15日:我对收到的回应/反馈感到惊讶,因此我决定进一步改进它。修复了一些小错误;添加了图表 + 参考。
97年10月25日:Htmlise+ 添加了关于支持 DNS 的机器的简短说明
在最终安定下来并正确阅读 TFM(更准确地说是 Bat Book)后,我解开了 Caramilk 的秘密!以下步骤已使用 RedHat 提供的二进制文件进行了测试。也许我应该将这个提示也发送给 Sendmail FAQ 的维护者,因为那里绝对没有提到 UUCP 与 sendmail 的互操作。
本文档试图向您展示
如何设置一台单机(在示例中称为 me.com),它没有直接访问互联网的权限,但可以通过 sendmail 和 UUCP 将您的邮件路由到“更智能的主机”,例如您的 ISP。
可选地,您可以将这台机器配置为向其他机器提供服务,即您是它们的“智能”主机或网关。本文档未告诉您
我收到了大量关于超出本 HOWTO 范围的主题的问题。本文档的目的不是描述它们,因此请尽量不要向我发送关于以下任何问题的提问
a) 如何设置 UUCP。
请参考许多关于此的出色参考资料,包括UUCP HOWTO (Vince Skahan, )
Using and managing UUCP (Ed Ravin 等人 -- 出版社 O'reilly),我认为这是关于 UUCP 最权威的指南
Linux Network Administrator Guide (Olaf Kirch)
b) 如何设置 DNS。
请参考许多关于此的出色参考资料,包括Caching named mini howto (Nicolai Langfeldt)
The bat book (Sendmail;Costalles, Allman, Rickert;出版社 O'reilly)
DNS and BIND (出版社 O'reilly)
TCP/IP Network Administration (Hunt, Craig;出版社 O'reilly)
Linux Network Administrator Guide (Olaf Kirch)
sendmail Theory and Practice (Avolio and Vixie; 出版社 Digital press)
c) 如何设置数据库(mailertable 除外)以与 sendmail 一起工作。
请参考许多关于此的出色参考资料,包括The bat book (Sendmail;Costalles, Allman, Rickert -- 出版社 O'reilly)
TCP/IP administration (出版社 O'reilly)
Sendmail Theory and Practice (Avolio and Vixie; 出版社 Digital press)
sendmail 捆绑的文档 d) 如何编写或修改规则集或邮件程序。
以上 c) 中的所有参考资料
您还可以在以下新闻组中找到帮助
comp.mail.sendmail
comp.mail.uucp
comp.os.linux.networking
IRC 频道
#linux, #unix
设置
这是针对一个系统,假设名为 me.com,其邮件仅通过 UUCP 发送。mysmarthost 是 ISP 的主机名,在 uucp sys 文件中设置,me.com 是我们在互联网上的 MX 记录中使用的或已知的主机名。
mysmarthost 连接到互联网。我们真的不在乎它是如何做到的,我们只知道它知道如何到达那里。
me.com,我们在示例中描述其设置,为站点 down.com 和 system1.org 及其子节点提供服务。me.com 通过 TCP/IP 连接到 down.com,并通过原始 UUCP 使用电话线连接到 system1.org。
设置描述如下所示
------------------------
| |
| Internet |
| |
-----------------------
|
| PPP/dedicated line running TCP-IP
|
-------------
| |
|mysmarthost | Authoritative name server for
| | *.me.com, *.down.com, *.system1.org
| |
--------------
|
| UUCP via a phone line receive for
| system1.org, *.system1.org,*.down.com, down.com
| as well as me.com and *.me.com
------------
| * ***** * |
------------ | * me.com * | ------
| * * | |
| | * ***** * | |
| ------------ |
|UUCP via phone line | uucp via TCP/IP
| |
----------- -----------
| | | |
|system1.org| | down.com |-------
| | | | |
---------- ------------ |
| |
| |
| | LAN: smtp to nodes
| UUCP phone line
| |
----------- -------------
| | | |
|system1's| | down's |
|subnodes | | LAN |
| | ------------
----------
先决条件
1) 如果您已经运行 DNS 或有指向 DNS 服务器的指针(在您的 /etc/resolv.conf 中)并且处于与网络的实时连接状态,则跳过此部分。您是安全的。您不必做任何“智能”的事情,请跳至 2)
如果您的机器使用 uucp 发送邮件,那么您真的不需要将 bind/resolv 编译到 sendmail 中;如何在没有 DNS 的独立机器上应对名称规范化
第一部分
如果您获得了预编译的包含 BIND 的 sendmail,您仍然可以使用它(Redhat 提供的 sendmail 就是这种情况)。a) 参考我基于所描述的 m4 文件(我的最爱)的解决方案。除非您真的坚持下面的 b) 或 c),否则请尝试使用此选项,或者
b) 如果您与我联系,我可以为您提供一个非 BIND 编译的版本 (8.8.5)。也许 RedHat 应该考虑提供两个 sendmail 二进制文件(像 slakware 那样),一个带有 BIND,另一个没有 BIND。或者
c) 获取不带 bind 的 sendmail 的最快解决方案是编辑 src/conf.h 中的以下行,使其读作我所展示的那样
# ifndef NAMED_BIND conf.h:# define NAMED_BIND 0 /* 使用 Berkeley Internet Domain Server */
第二部分:
但是,Sendmail 通常会坚持进行名称查找,以使用 gethostbyaddr() 解析它发送的每封电子邮件的主机部分(即使您告诉它不要规范化名称)。
a) 使用 RFC1597 IP 地址 (10.0.0.0-10.255.255.255, 172.16.0.0-172.31.255.255, 192.168.0.0-192.168.255.255)
编辑 /etc/hosts 并添加以下内容作为主机 myhost 的示例
10.0.0.1 myhost.me.com myhost 或者
b) 如果您使用 NIS(并且 NIS 已编译到 sendmail 中,Redhat 的情况似乎就是这样),请确保 /etc/nsswitch.conf 文件包含
hosts: files dns 并在 /etc/hosts 中添加以下内容作为主机 myhost 的示例 [再次使用 RFC1597 IP 寻址方案]
10.0.0.1 myhost.me.com myhost
注意:---- 在上面的 a) 和 b) 中,至关重要的是您在使用的 /etc/hosts 文件中列出完整的(完全限定的)名称。即该行应读作 10.0.0.1 myhost.me.com myhost 而不是 10.0.0.1 myhost,您还需要定义 sendmail $w 宏来保存 myhost.me.com
在生成后将以下行添加到您的 /etc/sendmail.cf 中 Djmyhost.me.com (或者您可以使用 .mc 中的 MASQUAREADE_AS(myhost.me.com))
注意!!!!! myhost 作为域名只是一个示例;您不必完全照搬。如果您还没有主机名,请选择您自己的主机名。
2) 确保您拥有 makemap 并且它能够支持 hash 和或更常见的 dbm 格式,甚至 btree 格式(Redhat 版本不支持 dbm)。Makemap 通常与 sendmail 一起分发。
设置(mc 文件)
I) 使用您喜欢的编辑器创建您的 .mc 文件;我将此文件称为 my.mca) 无 DNS -- 独立
include(`../m4/cf.m4')
VERSIONID(`me.com's setup with uucp created by xxxx --no dns ')
dnl OSTYPE(linux)
FEATURE(nodns)dnl
FEATURE(nocanonify)dnl
FEATURE(always_add_domain)dnl
FEATURE(mailertable, hash /etc/mailertable)dnl
MAILER(local)dnl
MAILER(smtp)dnl
MAILER(uucp)
define(`SMART_HOST', uucp-dom:mysmarthost)
让我们剖析一下
include(`../m4/cf.m4') 请求包含 ../m4/cf.m4 中找到的 m4 宏以解决一些问题
VERSIONID(`me.com's setup with uucp created by xxxx')dnl 这用于区分您最终可能创建的不同版本的 .cf 文件。
OSTYPE(linux) 这用于定义/重新定义 linux 特有的东西。在这里使用它是安全的。
FEATURE(nodns)dnl 这表示我们没有 DNS 服务器(因此实际上我们仅将 uucp 用于邮件。Sendmail 必须编译为不使用 bind)这现在已过时。我将让它留在这里,以防您使用旧版本的 sendmail。
FEATURE(nocanonify)dnl 这表示不要将地址传递给 $[ ... $] 以进行规范化。通常,如果您已在 sendmail 中编译了 BIND,则 sendmail 会尝试使用 DNS 将别名/IP 地址扩展为规范名称。如果您所有的 feed 都通过 UUCP 连接到您,即您是独立的,则您不想这样做。
FEATURE(always_add_domain)dnl 这会在本地传递的邮件上添加本地域名主机名。不是必需的,我只是喜欢它;这可能不是一个安全的功能,因为垃圾邮件发送者在适当的设置条件下可能会滥用您。
me.com 未通过 tcp/ip 连接到网络,因此它是安全的
FEATURE(mailertable, hash /etc/mailertable)dnl 文件 /etc/mailertable 将是一个 hash 数据库,我们在其中存储某些站点的路由信息。如果您没有向您提供 uucp 的任何人,则不需要此功能。稍后详细介绍。如果您想使用 dbm 格式,您将拥有 FEATURE(mailertable, dbm /etc/mailertable)dnl。如果您想使用 btree 格式,您将拥有 FEATURE(mailertable, btree /etc/mailertable)dnl
MAILER(local)dnl MAILER(smtp)dnl MAILER(uucp) 这些是我们使用的邮件程序。
define(`SMART_HOST', uucp-dom:mysmarthost) 我们的智能主机是我们的 ISP,它在 uucp sys 文件中定义为 system mysmarthost。任何我们无法处理的消息(即针对我们不理解的域或邮件程序的消息)都将传递给我们的智能主机/ISP 来处理。请注意,我们使用 uucp-dom 作为 uucp 邮件程序。此特定邮件程序使用 smtp 重写规则。
b) DNS 开启
include(`../m4/cf.m4')
VERSIONID(`me.com's setup with uucp created by xxxx --dns enabled')dnl
OSTYPE(linux)
FEATURE(always_add_domain)dnl
FEATURE(mailertable, hash /etc/mailertable)dnl
MAILER(local)dnl
MAILER(smtp)dnl
MAILER(uucp)
define(`SMART_HOST', uucp-dom:mysmarthost)
II) 创建您的 sendmail.cf 文件
a) 备份您旧的 /etc/sendmail.cf 文件
b) 使用新文件覆盖 sendmail.cf:m4 my.mc > /etc/sendmail.cf
c) 验证 sendmail.cf 文件是否根据您的规范正确创建。
我遇到的一些问题是:- 缺少 uucp-dom 邮件程序 这是因为我没有 smtp 邮件程序条目。实际上,我理解在 uucp 之前定义它很重要
III) 创建您的 /etc/mailertable
如果您没有 uucp 站点向您提供服务,请跳过此步骤a) 创建/编辑文件 /etc/mailertable
示例 /etc/mailertable
system1.org uucp-dom:system1
.system1.org uucp-dom:system1
down.com uucp-dom:down
up.down.com error: Host is unknown at me.com
.down.com uucp-dom:down
.me.com error: Host unknown at me.com
这表示任何寻址到 system1.org 或 *.system1.org 的、我们收到的邮件都将使用 uucp-dom 邮件程序发送,并传递到 system1(在 uucp sys 文件中定义),换句话说,我们正在为 *.system1.org 进行邮件路由;类似于 down.com 及其子节点,但有额外的过滤;我们使用 sendmail 的内置 error 邮件程序和消息 "Host is unknown at me.com" 退回任何发往 down 的子节点 up.down.com 的邮件;这是因为 down.com 的管理员要求我们这样做。为了将未知的子域名退回给我们,我们使用了 mailertable 中的最后一行(这是所有未知节点默认使用的)。
b) 使用 makemap 创建数据库
如果您使用 hash
makemap hash /etc/mailertable < /etc/mailertable
如果您使用 dbm:
makemap dbm /etc/mailertable </etc/mailertable
如果您使用 btree:
makemap btree /etc/mailertable </etc/mailertable
每次更改文件时都执行此操作。
IV) 重新启动 sendmail
V) 测试 sendmail
i) sendmail -bv user@destination
ii) 使用 sendmail -bt 并使用 3,0 输入各种地址
规则集以查看它们最终的位置以及所采用的各种规则集和 cf 遍历。您已设置完成!
待办事项
1) 添加关于设置系统 down.com 的信息(以便展示如何
处理那些 smtp 节点)
2) 添加关于如何设置通过 UUCP 传递新闻的信息
(最好是 INN)。这可能需要更改文档的标题。