第十五章 Sendmail+IDA
15.1 Sendmail+IDA概述
有人曾说过只有编辑过一个sendmail.cf文件,你才是一个真正的Unix系统管理员。也有人说
如果你试图这样编辑两次,那你一定是疯了?
Sendmail是一个难以置信的功能强大的程序。对大多数人来说它也是不可思义的难学。具有
792页长的权威性参考资料(Sendmail,由O’Reilly and Associates出版)的任何程序不可
辩驳地会吓跑大多数人。
Sendmail+IDA则不同,它删除了对编辑总是隐晦的sendmail.cf文件的需要并且允许管理人员
通过相对简单易懂的称为tables的支持文件来定义与站点有关的路由选择和寻址配置。切换
到sendmail+IDA上,可以节约你的许多工作时间和精力。
与其它邮件传输代理相比,使用sendmail+IDA几乎没有什么不可以做的更快和更简单的了。
运行常规的UUCP或Internet站点所需的典型工作变得很容易完成。通常非常困难的配置也变
得简单,易于建立和维护。
在编写本书的这个时候,当前版本sendmail5.67b+IDA1.5可以通过匿名FTP从vixen.cso.uiu
c.edu取得。在Linux下,它的编译不需要任何补丁程序。
对于在Linux下的sendmail+IDA源程序编译、安装和运行所需的所有配置文件包括在newspak
-2.2.tar.gz中,该压缩文件可以通过匿名FTP从sunsite.unc.edu的/pub/Linux/system/Mai
l下载。
15.2 配置文件―概述
传统的sendmail是通过一个系统配置文件进行设置的(典型的是/etc/sendmail.cf或者是/u
sr/lib/sendmail.cf),这个文件不是与你所见过的任何程序语言相近的。编辑sendmail.c
f文件以提供定制的性能可能是一种卑下的经验技巧。
Sendmail+IDA通过将所有配置选项做成句法易于理解的表格驱动方式使得这种痛苦基本上成
过时的情况了。这些选项经由源代码提供的制作文件(Makefiles)通过在许多数据文件上运
行m4(一个宏处理程序)或者dbm(一个数据库处理程序)来配置的。
sendmail.cf文件仅仅定义了系统缺省的性能。事实上,所有特殊的定制操作是通过很多可选
的表格做到的,而不是直接编辑sendmail.cf文件来做的。图15.1中列出了sendmail所有的表
格。
mailertable 为远程主机或域定义特殊的性能。
uucpxtable 迫使UUCP邮件投递到具有DNS格式的主机。
pathtable 定义到远程主机或域的UUCP bang-paths。
uucprelays 短路路径别名路径到著名的远程主机。
genericfrom 将内部地址转换成外部世界可见的普通地址。
xaliases 将普通地址转换成有效的内部地址/或将内部地址转换成普通地址。
decnetxtable 将RFC-822地址转换成DECnet形式的地址。
图15.1: sendmail的支持文件。
15.3 sendmail.cf文件
用于sendmail+IDA的sendmail.cf文件不用直接编辑的,而是从一个本地系统管理员提供的m
4配置文件中生成的。下面,我们将称它为sendmail.m4。
这个文件含有几个定义和其它一些仅仅是指向进行真正工作表格的连接。一般地,仅需要指
明:
。在本地系统上所使用的路径名和文件名。
。用于e-mail目的的站点名称。
。哪个缺省邮件程序(也可以是灵敏主机)是所期望的。
有大量的参数可以被定义,用来设立本地站点的性能或覆盖编译进的配置项目。这些配置选
项是在源代码目录中的ida/cf/OPTIONS文件中确定的。
对于最小配置的sendmail.m4文件(具有所有非本地邮件被中继到直接连接的灵敏主机去的U
UCP或SMTP)如果不算注释行的话,能够短到只有10或15行。
15.3.1 一个sendmail.m4的例子文件
下面示出了在虚拟酿酒厂的vstout的sendmail.m4文件。vstout用SMTP与酿酒厂局域网上的所
有主机对话,而将所有其它目的地的所有邮件通过UUCP发送到它的Internet中继主机moria。
15.3.2 用于sendmail.m4的典型参数
sendmail.m4文件中有几项是一直需要的;其它的可以被省略如果你使用缺省值侥幸成功的话
。下面几节详细描述了sendmail.m4例子文件中的每个项。
定义路径的项(Items that Define Paths)
dnl #define(LIBDIR,/usr/local/lib/mail)dnl # where all support files go
LIBDIR定义了一个目录,在这个目录中,sendmail+IDA期望能找到各个配置文件、
dnl #------------------ SAMPLE SENDMAIL.M4 FILE ------------------
dnl # (the string ‘dnl’ is the m4 equivalent of commenting out a line)
dnl # you generally don’t want to override LIBDIR from the compiled in paths
dnl #define(LIBDIR,/usr/local/lib/mail)dnl # where all support files go
define(LOCAL_MAILER_DEF, mailers.linux)dnl # mailer for local delivery
define(POSTMASTERBOUNCE)dnl # postmaster gets bounces
define(PSEUDODOMAINS, BITNET UUCP)dnl # don’t try DNS on these
dnl #-------------------------------------------------------------
dnl #
define(PSEUDONYMS, vstout.vbrew.com vstout.UUCP vbrew.com)
dnl # names we’re known by
define(DEFAULT_HOST, vstout.vbrew.com) # our primary ‘name’ for mail
define(UUCPNAME, vstout)dnl # our uucp name
dnl #
dnl #-------------------------------------------------------------
define(UUCPNODES, |uuname|sort|uniq)dnl # our uucp neighbors
define(BANGIMPLIESUUCP)dnl # make certain that uucp
define(BANGONLYUUCP)dnl # make is treated correctly
define(RELAY_HOST, moria)dnl # our smart relay host
define(RELAY_MAILER, UUCP-A)dnl # we reach moria via uucp
dnl #
dnl #-------------------------------------------------------------------
dnl #
dnl # the various dbm lookup tables
dnl #
define(ALIASES, LIBDIR/aliases)dnl # system aliases
define(DOMAINTABLE, LIBDIR/domaintable)dnl # domainize hosts
define(PATHTABLE, LIBDIR/pathtable)dnl # paths database
define(GENERICFROM, LIBDIR/generics)dnl # generic from addresses
define(MAILERTABLE, LIBDIR/mailertable)dnl # mailers per host or domain
define(UUCPXTABLE, LIBDIR/uucpxtable)dnl # paths to hosts we feed
define(UUCPRELAYS, LIBDIR/uucprelays)dnl # short-circuit paths
dnl #
dnl #--------------------------------------------------------------------
dnl #
dnl # include the ‘real’ code that makes it all work
dnl # (provided with the source code)
dnl #
include(Sendmail.mc)dnl # REQUIRED ENTRY !!!
dnl #
dnl #------------- END OF SAMPLE SENDMAIL.M4 FILE -------
图15.2:用于vstout的sendmail.m4例子文件。
各种dbm表格和特殊的本地定义。在一个典型的执行程序发行版中,这被编译进了sendmail的
执行程序中,不需要在sendmail.m4文件中明确地设置。
上面的例子有一前导dnl,这表示该行基本上是一个作为信息的注释行。
为了将支持文件的位置改变到一个不同的地方去,从上面一行中去掉dnl注释,将路径设置到
期望的位置,并且重建和重安装sendmail.cf文件。
定义本地邮件程序(Defining the Local Mailer)
define(LOCAL_MAILER_DEF, mailers.linux)dnl # mailer for local delvery
许多操作系统提供了处理本地邮件投递的程序。对于许多主要的Unix变体来说,典型的程序
早已制作进sendmail执行程序中了。
在Linux中,就需要明确地定义合适的本地邮件程序,因为本地投递程序并无必要一定会包括
在你已经安装的发行版中。这是通过在sendmail.m4文件中指明LOCAL_MAILER_DEF来做到的。
例如,为了让通用的deliver程序[1]提供这个服务,你应该将LOCAL_MAILER_DEF设置成mail
ers.linux。
然后,下面的文件应该作为mailers.linux被安装在由LIBDIR指定的目录中。它明确地用适当
的参数在内部Mlocal邮件程序中定义了deliver程序,以使得sendmail能正确地投递目标面向
本地系统的邮件。除非你是一个sendmail专家,否则一般你不需要改变下面的例子。
# -- /usr/local/lib/mail/mailers.linux ?
# (local mailers for use on Linux )
Mlocal, P=/usr/bin/deliver, F=SlsmFDMP, S=10, R=25/10, A=deliver $u
Mprog, P=/bin/sh, F=lsDFMeuP, S=10, R=10, A=sh ?c $u
在包括在sendmail.cf文件中的Sendmail.mc文件里对于deliver也有一内建缺省值。为了指明
它,你不能使用mailers.linux文件,而是要在你的sendmail.m4文件中进行如下定义:
dnl --- (in sendmail.m4) ---
define(LOCAL_MAILER_DEF, DELIVER)dnl # mailer for local delivery
不幸的是,Sendmail.mc假定deliver被安装在/bin中,而对于Slackware1.1.1(它将其安装
在了/usr/bin中)并不是这种情况。在那种情况下,你就必须用链接伪装它或者从源代码中
重建deliver以使它驻留在/bin中。
处理反弹的邮件(Dealing with Bounced Mail)
define(POSTM