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.comsystem1.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.cfDjmyhost.me.com (或者您可以使用 .mc 中的 MASQUAREADE_AS(myhost.me.com)

    注意!!!!! myhost 作为域名只是一个示例;您不必完全照搬。如果您还没有主机名,请选择您自己的主机名。


    2) 确保您拥有 makemap 并且它能够支持 hash 和或更常见的 dbm 格式,甚至 btree 格式(Redhat 版本不支持 dbm)。Makemap 通常与 sendmail 一起分发。
     
     

    设置(mc 文件)

    I) 使用您喜欢的编辑器创建您的 .mc 文件;我将此文件称为 my.mc

    a) 无 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)。这可能需要更改文档的标题。