Linux网络管理员手册(15) 第十五章 Sendmail+IDA
Linux网络管理员手册(15) 第十五章 Sendmail+IDA Linux网络管理员手册(15)
gohigh@shtdu.edu.cn
第十五章 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.uiuc.edu取得。在Linux下,它的编译不需要任何补丁程序。
对于在Linux下的sendmail+IDA源程序编译、安装和运行所需的所有配置文件包括在newspak-2.2.tar.gz中,该压缩文件可以通过匿名FTP从sunsite.unc.edu的/pub/Linux/system/Mail下载。
15.2 配置文件—概述
传统的sendmail是通过一个系统配置文件进行设置的(典型的是/etc/sendmail.cf或者是/usr/lib/sendmail.cf),这个文件不是与你所见过的任何程序语言相近的。编辑sendmail.cf文件以提供定制的性能可能是一种卑下的经验技巧。
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文件不用直接编辑的,而是从一个本地系统管理员提供的m4配置文件中生成的。下面,我们将称它为sendmail.m4。
这个文件含有几个定义和其它一些仅仅是指向进行真正工作表格的连接。一般地,仅需要指明:
。在本地系统上所使用的路径名和文件名。
。用于e-mail目的的站点名称。
。哪个缺省邮件程序(也可以是灵敏主机)是所期望的。
有大量的参数可以被定义,用来设立本地站点的性能或覆盖编译进的配置项目。这些配置选项是在源代码目录中的ida/cf/OPTIONS文件中确定的。
对于最小配置的sendmail.m4文件(具有所有非本地邮件被中继到直接连接的灵敏主机去的UUCP或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设置成mailers.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(POSTMASTERBOUNCE)dnl # postmaster gets bounces
许多站点发现,确信邮件是以接近100%成功率发送和接收是很重要的。正如检查syslogd(8)日志是很有帮助的一样,本地邮件管理者通常需要观察反弹回来的邮件的标题信息,以确定邮件的不能投递是否是因为用户错误还是相关系统之一的配置问题。
定义POSTMASTERBOUNCE会导致对每个反弹回来的消息作一份拷贝,并被送到作为系统邮件管理者(Postmaster)的人那里。
不幸的是,设置这个参数也将导致消息的文本内容被送到了邮件管理者Postmaster,这潜在地会涉及到系统上使用邮件者的隐私问题。
一般地,站点邮件管理者应该尽力严格律己(或者通过使用shell脚本的技术方式来删除他们所收到的反弹回来的消息的内容),不阅读不是自己邮件的内容。
与域名服务相关的项(Domain Name Service Related Items)
define(PSEUDODOMAINS, BITNET UUCP)dnl # don’t try DNS on these
由于历史原因有些著名的网络通常在邮件地址中参考引用,但它们对于DNS来说却是无效的。定义PSEUDODOMAINS是用于防止不必要的且总是失败的DNS查询企图。
定义本地系统公开的名称(Defining Names the Local System is Known by)
define(PSEUDONYMS, vstout.vbrew.com vstout.UUCP vbrew.com)dnl
# names we’re known by
define(DEFAULT_HOST, vstout.vbrew.com)dnl # our primary ‘name’ for mail
常常,系统希望隐藏它们的真实身份、作为邮件网关的服务、或者是接收和处理寻址到曾经已知的‘老’名字的邮件。
PSEUDONYMS指定了本地系统将接收其邮件的所有主机的列表。
DEFAULT_HOST指定了本地主机产生的将出现在消息标题上的主机名。将这个参数设置为一个有效的值是很重要的,否则的话所有返回邮件都将不能被投递。
与UUCP相关的项(UUCP-Related Items)
define(UUCPNAME, vstout)dnl # our uucp name
define(UUCPNODES, |uuname|sort|uniq)dnl # our uucp neighbors
define(BANGIMPLIESUUCP)dnl # make certain that uucp
define(BANGONLYUUCP)dnl # mail is trated correctly
常常,对于用于DNS时系统使用一个名字,而用于UUCP时系统则使用另外一个名字。UUCPNAME准许你定义出现在出站UUCP邮件标题中的不同的主机名。
UUCPNODES定义了为系统返回主机名列表的命令,而该系统是我们通过UUCP连接直接连接的。
BANGIMPLIESUUCP和BANGONLYUUCP确保用UUCP‘bang’句法寻址的邮件依照UUCP的性能来对待,而不是以现今用于Internet上最近的域名服务来对待。
中继系统和邮件程序(Relay Systems and Mailers)
define(RELAY_HOST, moria)dnl # our smart relay host
define(RELAY_MAILER, UUCP-A)dnl # we reach moria via UUCP
许多系统管理员不想为确保他们的系统能够到达世界范围内所有的网络(因而还有系统)而需做的工作所捆扰。他们宁愿将所有的出站邮件中继到另一台已知确实“灵敏”的系统去,而不愿那样做。
RELAY_HOST定义了这样一个灵敏的邻接系统的UUCP主机名。
RELAY_MAILER定义了用于将消息中继到那里去的邮件程序。
请注意,设置这些参数将导致你的出站邮件都将被转发到这个远程系统去,这将影响他们系统的负荷,这点很重要。在配置你的系统使用另一个系统作为一般用途的中继主机之前,一定要从远程邮件管理者(Postmaster)那里取得明确协定。
各种配置表格(The Various Configuration Tables)
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
使用这些宏,你可以改变sendmail+IDA查找各种dbm表格的位置,这些表格定义了系统的“真正”性能。通常,将它们留在LIBDIR中是明智的。
主要的Sendmail.mc文件(The Master Sendmail.mc File)
include(Sendmail.mc)dnl # REQUIRED ENTRY !!!
sendmail+IDA的作者提供了Sendmail.mc文件,它含有成为sendmail.cf文件的真正的“内脏”。周期性地,新的版本会发行出来以修正错误或增加新功能,但并不需要有一个完整的版本和从源代码中对sendmail进行重新编译。
请不要编辑这个文件,这点是很重要的。
那么那些条目是真正必须的呢?
当不使用任何可选的dbm表格时,sendmail+IDA通过定义在sendmail.m4文件中的DEFAULT_MAILER(还可能有RELAY_HOST和RELAY_MAILER)来投递邮件。sendmail.m4是用于生成sendmail.cf文件的。通过domaintable或uucpxtable中的条目可以很容易的覆盖这个特性。
在Internet上使用域名服务的一般站点,或者一个仅是UUCP的并且使用UUCP通过一个灵敏RELAY_HOST转发所有邮件的站点,很可能完全不需要任何特定的表格。
事实上,所有系统都应设置DEFAULT_HOST和PSEUDONYMS宏(这定义了公众已知的规范站点的名字和别名),以及DEFAULT_MAILER宏。如果所有的只是一个中继主机和中继邮件程序,那么你就不需要设置这些缺省值,因为它是自动工作的。
UUCP主机很可能也会需要将UUCPNAME设置成他们官方的(正式的)UUCP名字。他们可能也要设置RELAY_MAILER和RELAY_HOST,这通过一个邮件中继启用了灵敏-主机路由选择。所使用的邮件传输器是定义在RELAY_MAILER中并且对于UUCP站点来讲,通常应该是UUCP-A。
如果你的站点仅是SMTP的并且用‘域名服务’交谈,那么你应该将DEFAULT_MAILER改变成TCP-A并且还可以删除RELAY_MAILER和RELAY_HOST行。
15.4 Sendmail+IDA表格通览
Sendmail+IDA提供了几个表格,这些表格允许你覆盖sendmail(在sendmail.m4中指明)的缺省设置并且针对独特(单一)情况、远程系统、以及网络定义特定的行为,这些表格使用随发行版提供的Makefile利用dbm后处理的。[?]
绝大多数站点如果需要用到这些表的话,也将只需要很少几个。如果你的站点不需要这些表的话,那么最简单的方法很可能是让它们成为长度为零的文件(使用touch命令)并且使用在LIBDIR中的缺省Makefile而不是去编辑Makefile本身。
15.4.1 mailertable
mailertable根据远程主机或网络名称,对特定的主机定义特殊的处理。它常常用于在Internet的站点上选择一个中间的邮件中继主机或通往远程网络的网关,并且指定所用的特定协议(UUCP或SMTP)。UUCP站点通常不需要使用这个文件。
次序是很重要的。Sendmail从上至下读取文件并依照它所匹配的第一条规则来处理消息。所以通常是将非常明确的规则放在文件的开头部分,而一般的规则则放在文件的后面。
假设你想通过UUCP将Groucho Marx大学计算机系的所有邮件转发到一个中继主机ada。为了这样做,你需要有个看上去象下面这样的mailertable:
# (in mailertable)
#
# forward all mail for the domain .cs.groucho.edu via UUCP to ada
UUCP-A,ada .cs.groucho.edu
假设想要将更大的groucho.edu域中所有邮件送到一个不同的中继主机bighub中用以进行地址解析和邮件投递。那么扩展后的mailertable条目看上去很象下面的样子。
# (in mailertable)
#
# forward all mail for the domain cs.groucho.edu via UUCP to ada
UUCP-A,ada .cs.groucho.edu
#
# forward all mail for the domain groucho.edu via UUCP to bighub
UUCP-A,bighub .groucho.edu
正如上面所提到的,顺序是很重要的。将上面的规则顺序反一下的话将导致所有邮递到.cs.groucho.edu的邮件穿过更一般的bighub路径而不是真正期望的确定的ada路径。
# (in mailertable)
#
# forward all mail for the domain .groucho.edu via UUCP to bighub
UUCP-A,bighub .groucho.edu
#
# (it is impossible to reach the next line because
# the rule above will be matched first)
UUCP-A,ada .cs.groucho.edu
#
在上面的mailertable例子中,UUCP-A邮件程序使得sendmail用指定的标题通过UUCP进行投递。
在邮件程序(mailer)和远程系统之间的逗号通知它将消息转发到ada以进行地址解析和投递。
Mailertable中的条目具有如下格式:
mailer delimiter relayhost host_or_domain
有一些可用的mailer。它们之间的不同之处通常在于处理地址的方式。典型的mailer是TCP-A(TCP/IP和Internet形式的地址)、TCP-U(TCP/IP和UUCP形式的地址)、UUCP-A(UUCP和Internet形式的地址)。
在mailertable的一行上面将mailer从左边主机部分分割开来的字符定义了mailertable是如何修改地址的。要认识到的重要事情是这仅仅重写了信封(以使得邮件到远程系统中去)。要重写除信封以外的任何部分是不赞成的,因为这及有可能破坏邮件的配置。
! 一个感叹号使得在转发到mailer之前剥离接收者的主机名。当你想要迫使邮件进入一个配置错误的远程站点时,就可以使用这个符号。
, 逗号对地址不作任何改变。消息仅通过指定的mailer转发到指定的中继主机去。
: 仅在你与目的地之间有中间主机的情况下,冒号用于删除接收者的主机名。因此,对于foo!bar!joe,foo会被删除掉,而xyzzy!janet则将保持不变。
15.4.2 uucpxtable
通常,到具有全资域名主机的邮件是通过使用域名服务(DNS)的Internet形式(SMTP)邮递方式进行投递的,或通过中继主机进行投递。而uucpxtable则通过将有域的名字转换成UUCP形式的非域的远程主机名迫使使用UUCP路由选择来投递。
当你是一个站点的或一个域的邮件转发器时,或者当你希望通过直接的和可靠的UUCP链接来发送邮件而不想通过可能是多跳数的经过缺省mailer以及任何中间系统和网络来发送邮件时,这个表是经常使用的。
与使用有域邮件标题的UUCP邻居对话的UUCP站点将使用这个文件来迫使邮件的投递通过两系统之间直接的UUCP点对点链接,而不是使用间接的路由通过RELAY_MAILER和RELAY_HOST或者通过DEFAULT_MAILER来进行邮件的投递。
不使用UUCP对话的Internet站点通常不会用到这个uucpxtable。
假设你为一个在DNS中称为sesame.com而在UUCP映射中称为sesame的系统提供邮件转发服务。那么你会需要下面的条目以迫使它们主机的邮件通过你的直接UUCP连接来投递。
#============== /usr/local/lib/mail/uucpxtable ============
# Mail sent to joe@sesame.com is rewritten to sesame!joe and
# therefore delivered via UUCP
#
sesame sesame.com
#
#----------------------------------------------------------
15.4.3 pathtable
pathtable用于定义到远程主机或网络的明确的路由选择。pathtable文件应该使用路径别名形式的句法,并以字母顺序排过序。每一行上的两个字段必须用实际的制表符TAB来分隔,否则的话dbm可能会有问题。
大多数系统都不需要任何pathtable条目。
#=============== /usr/local/lib/mail/pathtable ================
#
# this is a pathalias-style paths file to let you kick mail to
# UUCP neighbors to the direct UUCP path so you don’t have to
# go the long way through your smart host that takes other traffic
#
# you want real tabs on each line or m4 might complain
#
# route mail through one or more intermediate sites to a remote
# system using UUCP-style addressing.
#
sesame!ernie!%s ernie
#
# forwarding to a system that is a UUCP neighbor of a reachable
# internet site.
#
swim!%s@gcc.groucho.edu swim
#
# The following sends all mail for two networks through different
# gateways (see the leading ‘.’ ?).
# In this example, “uugate” and “byte” are specific systems that serve
# as mail gateways to the .UUCP and .BITNET pseudo-domains respectively
#
%s@uugate.groucho.edu .UUCP
bye!%s@mail.shift.com .BITNET
#
#=================== end of pathtable ========================
15.4.4 domaintable
domaintable一般地用于在一个DNS查询发生后迫使进行一定的操作。它允许管理员通过自动地将简写名替换为合适的名字来为经常引用的系统或域建立一个简写名称。它也可以用于将不正确的主机或域名替换成“正确的”信息。
大多数站点不会需要任何domaintable条目。
# ============= /usr/local/lib/mail/domaintable =================
#
#
brokenhost.correct.domain brokenhost.wrong.domain
#
#
#================== end of domaintable =========================
15.4.5 aliases
aliases允许很多事情发生:
。它们为邮件寻址提供了一个简写名或一个众所周知的名称以便发送给一个或多个人。
。它们调用一个程序并将邮件消息作为这个程序的输入。
。它们将邮件发送到一个文件。
所有的系统要求Postmaster和MAILER-DAEMON的别名是RFC兼容的。
当定义能够调用程序或能向程序进行写操作的别名时,要特别注意安全问题,因为sendmail通常是以setuid-root运行的。
对aliases文件所作的改变不会立即起作用的,只有在执行了命令
# /usr/lib/sendmail –bi
以建立要求的dbm表后它才起作用。这也可以通过执行newaliases命令来做到。通常是从cron中调用这个命令的。
有关邮件别名的详细信息可以从aliases(5)手册页中找到。
#--------------------- /usr/local/lib/mail/aliases -------------------
#
# demonstrate commonly seen types of aliases
#
usenet: janet # alias for a person
admin: joe,janet # alias for several people
newspak-users: :include:/usr/lib/lists/newspak
# read recipients from a file
changefeed: | /usr/local/lib/gup # alias that invokes a program
complaints: /var/log/complaints # alias that writes mail to a file
#
# The following two aliases must be present to be RFC-compliant.
# It is important to have them resolve to ‘a person’ who reads mail routinely.
#
postmaster: root # required entry
MAILER-DAEMON: postmaster # required entry
#
#----------------------------------------------------------------
15.4.6 很少使用的表
还有以下一些表,但是很少使用。有关的详细信息请查阅随同sendmail+IDA源代码一起的文档。
uucprelays uucprelays文件是用于“短路”UUCP到著名站点的路径,而不是使用多跳数的或不可靠的由使用pathalias处理UUCP映射生成的路径。
Genericfrom and xaliases
genericfrom文件通过自动地将本地用户名转换成与内部用户名不匹配的一般发送者地址,来对外部世界隐藏用户名和地址。
相关的xalparse工具会自动地生成genericfrom和aliases文件,这样入站和出站用户名的转换从一个主xaliases文件中发生。
decnetxtable decnetxtable将有域地址重写为decnet形式的地址,这非常象domaintable可用于将非域的地址重写为SMTP形式的地址。
15.5 安装sendmail
在本节中,我们将观察如何安装一个典型的sendmail+IDA执行程序,并且讨论使它专用化和正常运行需要做些什么。
Linux的sendmail+IDA的最新的执行程序版可以从sunsite.unc.edu下的/pub/Linux/system/Mail中得到。即使你已有一个sendmail的早期版本,我强烈希望你使用sendmail5.67b+IDA1.5版本,因为所有Linux要求的补丁程序现在已经在vanilla的代码中并且几个重大的安全漏洞也已被补上,这些漏洞存在于约1993年12月1日以前的版本中。
如果你是从源代码来建立senmail,你应该按照包括在源代码发行版中的README指示来操作。最新的sendmail+IDA源代码在vixen.cso.uiuc.edu上有。要在Linux上建立(编译)sendmail+IDA,你也需要newspak-2.2.tar.gz中的Linux专用配置文件,在sunsite.unc.edu上的/pub/Linux/system/Mail目录中有这个文件。
如果你以前已经安装过smail或其它的邮件投递代理,那么出于安全的考虑,你可能需要从smail中删除(或改名)所有的文件。
15.5.1 提取执行程序发行版
首先你必须在某个安全的地方打开存档(archive)文件:
# gunzip –c sendmail5.65b+IDA1.5+mailx5.3b.tgz | tar xvf –
如果你有一个“最新的”(“modern”)tar(例如从最近的Slackware发行版中取得的),那么你还可以只运行tar –zxvf filename.tgz就能得到相同的结果。
打开这个存档文件会创建一个名为sendmail5.65b+IDA1.5+mailx5.3b的目录。在这个目录中,你可以找到sendmail+IDA完整的安装程序和mailx用户代理的执行程序。在这个目录下的所有文件路径都对应着文件应该被安装的位置,所以逐步使用tar命令将它们移过去是安全的:
# cd sendmail5.65b+IDA1.5+mailx5.3b
# tar cf - . | (cd /; tar xvvpoof -)
15.5.2 创建sendmail.cf
为给的站点创建一个定制的sendmail.cf文件,你必须写一个sendmail.m4文件,并且用m4对它进行处理。在/usr/local/lib/mail/CF中,可以找到一个称为sample.m4的样本文件。将它拷贝为yourhostname.m4,并对它进行编辑以反映你的站点的情况。
这个样本文件是为只使用UUCP的站点设置的。并需要这个站点具有有域标题(domainized headers)并与一个灵敏主机对话的。象这样的站点只需要改动很少的项。
在本节中,我将只对你必须改变的宏,给出一简略的概述。对于它们的功能的完整描述,请参阅前面对sendmail.m4的讨论。
LOCAL_MAILER_DEF
定义了详细说明本地邮件投递mailer(邮件程序)的文件。起功能参见上面小节“定义本地邮件程序”。
PSEUDONYMS
定义你的本地主机为人所知的所有名称。
DEFAULT_HOST
放入你的全资域名。这个名字将作为你的主机名出现在所有出站邮件中。
UUCPNAME
放入你的无限定(绝对的)主机名。
RELAY_HOST和RELAY_MAILER
如果你用UUCP与一个灵敏主机对话,将RELAY_HOST设置成你的‘灵敏中继’uucp邻居的名字。如果你想有有域的标题,那么就使用UUCP-A邮件程序。
DEFAULT_MAILER
如果你在Internet上并且使用DNS,你应该将它设置成TCP-A。这将通知sendmail使用TCP-A邮件程序,该邮件程序通过SMTP在信封上使用正规的RFC形式的寻址来投递邮件。Internet站点一般不需要定义RELAY_HOST或RELAY_MAILER。
要创建sendmail.cf文件,执行命令
# make yourhostname.cf
这将对yourhostname.m4文件进行处理并从中创建出yourhostname.cf。
下一步,应该测试你所创建的配置文件是否如你期望的去工作。这将在下两节中作出解释。
一旦你对它的性能感到满意,使用下面命令将它拷贝到/etc下。
# cp yourhostname.cf /etc/sendmail.cf
此时,你的sendmail系统已经为运行准备好了。将下面一行放入适当的启动文件中(一般是/etc/rc.inet2中)。你现在也可以手工执行它让程序现在就启动。
# /usr/lib/sendmail –bd –q1h
15.5.3 测试sendmail.cf文件
使用-bt标志调用sendmail将它置入‘测试’模式。安装在系统上的缺省配置文件是sendmail.cf文件。你可以使用-Cfilename选项来测试一个备用的文件。
在下面的例子中,我们对vstout.cf进行测试,这个配置文件是从图15.2中示出的vstout.m4文件生成的。
# /usr/lib/sendmail –bt –Cvstout.cf
ADDRESS TEST MODE
Enter
[Note: No initial ruleset 3 call]
>
下面的测试确保sendmail能够将所有邮件投递给你的系统上的用户。在所有的情况下测试的结果都应该是一样的并且LOCAL mailer指向本地系统名。
首先测试一个到本地用户的邮件是如何被投递的。
# /usr/lib/sendmail –bt –Cvstout.cf
ADDRESS TEST MODE
Enter
[Note: No initial ruleset 3 call]
> 3,0 me
rewrite: ruleset 3 input: me
rewrite: ruleset 7 input: me
rewrite: ruleset 9 input: me
rewrite: ruleset 9 returns: < me >
rewrite: ruleset 7 returns: < > , me
rewrite: ruleset 3 returns: < > , me
rewrite: ruleset 0 input: < > , me
rewrite: ruleset 8 input: < > , me
rewrite: ruleset 20 input: < > , me
rewrite: ruleset 20 returns: < > , @ vstout . vbrew . com , me
rewrite: ruleset 8 returns: < > , @ vstout . vbrew . com , me
rewrite: ruleset 26 input: < > , @ vstout . vbrew . com , me
rewrite: ruleset 26 returns: @# LOCAL $@ vstout . vbrew . com $: me
rewrite: ruleset 0 returns: @# LOCAL $@ vstout . vbrew . com $: me
输出结果显示出sendmail内部是如何处理地址的。地址被传给各种规则集(rulesets)并由这些规则集来分析它、轮流调用其它规则集并且将它分裂成为它的各个组件。
在我们的例子中,我们将地址me传给规则集3和0(这就是在地址前输入的3,0的意思)。最后一行显示出由规则集0返回的被分析过的地址,包含有用于投递消息的mailer、以及给予mailer的主机名和用户名。
接下来,使用UUCP句法测试将邮件投递到你系统上的一个用户。
# /usr/lib/sendmail –bt –Cvstout.cf
ADDRESS TEST MODE
Enter
[Note: No initial ruleset 3 call]
> 3,0 vstout!me
rewrite: ruleset 3 input: vstout ! me
[...]
rewrite: ruleset 0 returns: $# LOCAL $@ vstout . vbrew . com $: me
>
下一步,使用Internet句法用你的全资主机名测试邮递到你的系统上一个用户。
# /usr/lib/sendmail –bt –Cvstout.cf
ADDRESS TEST MODE
Enter
[Note: No initial ruleset 3 call]
> 3,0 me@vstout.vbrew.com
rewrite: ruleset 3 input: me @ vstout . vbrw . com
[...]
rewrite: ruleset 0 returns: $# LOCAL $@ vstout . vbrew . com $: me
>
你应该使用在sendmail.m4文件中PSEUDONYMS和DEFAULT_NAME参数上指定的每个名字,重复进行上面两个测试。
最后,测试你是否可以邮递到你的中继主机上。
# /usr/lib/sendmail –bt –Cvstout.cf
ADDRESS TEST MODE
Enter
[Note: No initial ruleset 3 call]
> 3,0 fred@moria.com
rewrite: ruleset 3 input: fred @ moria . com
rewrite: ruleset 7 input: fred @ moria . com
rewrite: ruleset 9 input: fred @ moria . com
rewrite: ruleset 9 returns: < fred > @ moria . com
rewrite: ruleset 7 returns: < @ moria . com > , fred
rewrite: ruleset 3 returns: < @ moria . com > , fred
rewrite: ruleset 0 input: < @ moria . com > , fred
rewrite: ruleset 8 input: < @ moria . com > , fred
rewrite: ruleset 8 returns: < @ moria . com > , fred
rewrite: ruleset 29 input: < @ moria . com > , fred
rewrite: ruleset 29 returns: < @ moria . com > , fred
rewrite: ruleset 26 input: < @ moria . com > , fred
rewrite: ruleset 25 input: < @ moria . com > , fred
rewrite: ruleset 25 returns: < @ moria . com > , fred
rewrite: ruleset 4 input: < @ moria . com > , fred
rewrite: ruleset 4 returns: fred @ moria . com
rewrite: ruleset 26 returns: < @ moria . com > , fred
rewrite: ruleset 0 returns: $# UUCP-A $@ moria $: < @ moria . com > , fred
>
15.5.4 综合 – 集中测试sendmail.cf和各个表
到现在为止,你已经检验过了邮件系统已有了期望的默认性能,并且你将能够收发具有有效地址的邮件。为了完成安装,还需要创建适当的dbm表以取得期望的最终结果。
在创建了你的站点所需的各个表之后,你必须在包含表的目录中运行make通过dbm来对这些表进行处理.
如果你是仅使用UUCP的,那么你就不需要创建在README.linux文件中所提到的任何表了。你只需要touch这些文件以使得Makefile能顺利工作。
如果你是仅使用UUCP的并且你除了与你的灵敏主机对话以外还与其它站点有来往,那么你就需要为每个站点增加uucpxtable条目(否则的话邮个它们的邮件也将通过灵敏主机传递了)并且针对修改过的uucpxtable运行dbm。
首先你必须确定经过你的RELAY_HOST的邮件是通过RELAY_MAILER发送给它们的。
# /usr/lib/sendmail –bt –Cvstout.cf
ADDRESS TEST MODE
Enter
[Note: No initial ruleset 3 call]
> 3,0 fred@sesame.com
rewrite: ruleset 3 input: fred @ sesame . com
rewrite: ruleset 7 input: fred @ sesame . com
rewrite: ruleset 9 input: fred @ sesame . com
rewrite: ruleset 9 returns: < fred > @ sesame . com
rewrite: ruleset 7 returns: < @ sesame . com > , fred
rewrite: ruleset 3 returns: < @ sesame . com > , fred
rewrite: ruleset 0 input: < @ sesame . com > , fred
rewrite: ruleset 8 input: < @ sesame . com > , fred
rewrite: ruleset 8 returns: < @ sesame . com > , fred
rewrite: ruleset 29 input: < @ sesame . com > , fred
rewrite: ruleset 29 returns: < @ sesame . com > , fred
rewrite: ruleset 26 input: < @ sesame . com > , fred
rewrite: ruleset 25 input: < @ sesame . com > , fred
rewrite: ruleset 25 returns: < @ sesame . com > , fred
rewrite: ruleset 4 input: < @ sesame . com > , fred
rewrite: ruleset 4 returns: fred @ sesame .com
rewrite: ruleset 26 returns: < @ sesame .com > , fred
rewrite: ruleset 0 returns: $# UUCP-A $@ moria $: < @ sesame . com > , fred
>
除了RELAY_HOST外,如果你还有UUCP邻居,那么你必须确保邮递给它们有着正确的操作。以UUCP形式句法寻址的邮件到一个与之用UUCP对话的主机必须是直接递送给它的(除非你用domaintable条目明确地指出不这样做)。假设主机swim是你的一个直接UUCP邻居。那么给sendmail输入swim!fred将产生下面的结果:
# /usr/lib/sendmail –bt –Cvstout.cf
ADDRESS TEST MODE
Enter
[Note: No initial ruleset 3 call]
> 3,0 swim!fred
rewrite: ruleset 3 input: swim ! fred
[...lines omitted ...]
rewrite: ruleset 0 returns: $# UUCP $@ swim $: < > , fred
>
如果你有uucpxtable条目来迫使UUCP投递到一个UUCP邻居(这个邻居使用Internet形式的有域标题发送它们的邮件),就也需要对其进行测试。
# /usr/lib/sendmail –bt –Cvstout.cf
ADDRESS TEST MODE
Enter
[Note: No initial ruleset 3 call]
> 3,0 dude@swim.2birds.com
rewrite: ruleset 3 input: dude @ swim . 2birds .com
[...lines omitted ...]
rewrite: ruleset 0 returns: $# UUCP $@ swim . 2birds $: < > , dude
>
15.6 重复性的邮件处理工作和愚蠢的邮件技巧
既然我们已经讨论了sendmail+IDA系统的配置、安装和测试的原理,让我们再花一点时间来看一下在邮件管理员的工作中天天会需要做些什么事。
远程系统有时会中断,Modem或电话线路会不通,由于人为的因素DNS的定义可能会不正确,网络会突然失去作用。在这些情况中,邮件管理者需要知道如何迅速、有效、安全地作出反应,以保持邮件能够从备用的路由传递,直到远程系统或服务提供者能恢复正常服务为止。
本章接下来的部分打算为你提供最常碰到的“电子邮件紧急事件”的解决方案。
15.6.1 将邮件转发到一个中继主机
为一个特定的主机或域转发邮件到一个指定的中继系统,你一般要使用mailertable。
例如,为了转发backwood.org的邮件到它们的UUCP网关系统backdoor去,你要将以下条目放入mailertable中