BBS水木清华站∶精华区

发信人: wshu (树上的老虎), 信区: Unix 
标  题: Sendmail 8.6.11安装简介 
发信站: BBS 水木清华站 (Wed May 21 19:59:57 1997) 
 
              【Sendmail 8.6.X安装简介】 
测试版本:Sendmail 8.6.11 
测试日期:1995年3月 
 
    Sendmail对一般的系统管理者而言,往往是个不敢手的「禁区」 
,因为绝大多数系统的使用者对E-Mail的需求与依赖的程度之高,可 
说是稍有分毫差错,系统管理者就要准备接受如雪片般飞来的抗议与 
抱怨!而Sendmail这个东东的「内函」,似乎又有点不太容易理解: 
与设定有关的sendmail.cf 档,如果不是下过一番死功夫,则读起来 
如同读天书一样,只知道里面有英文字与数字!所以一般人总是能不 
动则不动,只要能用就好。不过,很不幸的,一般跟著机器而来的 
sendmail总是有著令人心惊胆跳的「附加功能」,就是常常都有一些 
可以让无聊人士作为侵入路径的BUG 或後门,某些BUG 还可以让侵入 
者经由Sendmail而取得最高权限的root!一旦root权限被人拿走了, 
那麽这机器就可被人任意屠宰,最恶劣的,还可能破坏系统! 
 
    Sun 在国内的使用人口相当的多,笔者对Sun 也稍微比较熟悉一 
点。不过,Sun 的Sendmail却是令人颇不敢恭维的,几乎可以说:只 
要还在使用Sun 的Sendmail而没有「常常」patch 的话,那甚麽系统 
安全都不必谈了,谈了也是白谈;如果还在使用Sun 的Sendmail,那 
就如果系统抱著一颗不定时炸弹,随时一个不注意,都可能引爆:(。 
这一点,大家可以翻一翻CERT或8lgm看一看,几乎是只要有sendmail 
的问题,Sun 大多跑不了....。其他系统的Sendmail也不要偷笑,虽 
然大家的出场率没有Sun 高,可是也常会问题的。 
    另一方面,Sendmail 8.6.9与之前的版本最近刚发现有个ident 
方面的Bug 。如果方便的话,请大家务必换成最新版。如果不方便的 
话,在v8.6.5之後的版本有个克难式的补救法,即在sendmail.cf 加 
入这麽一行: 
        Orident=0 
表示不作ident 的检查。 
v8.6.5之前的版本就一定要换成最新版。 
 
    本软体在系统安全方面,是目前评价最高的,目前已知的BUG 
都已经改好了,最主要的原因,当然是要感谢作者Eric Allman ,他 
(或他们)能作到一发现重大的Bug (如系统安装)就立刻出新版。 
本软体是一public domain ,可以在网路上各ftp server上找到其 
source code。由於该软体的发展者把一些必要的设定步骤自动化了 
,所以,其实安装这个软体并不是想像中那麽样的困难。如果连 
compile 的时间也算下去,顺利的话,不用半个小时就可以安装完毕 
!所以,「麦惊」啦!:) 
 
    笔者把Sendmail的安装分成几个步骤: 
步骤○:用任何手段(其实大概是用ftp :))抓到此软体。如果在 
        ftp://ftp.nccu.edu.tw/pub/mail/ 下找到的,会是好几个 
        名叫"sendmail.8.6.11.XXX"的档案,请使用者至少把: 
          sendmail.8.6.11.base.tar.gz 
          sendmail.8.6.11.cf.tar.gz 
          sendmail.8.6.11.xdoc.tar.gz 
        这三个档抓回,其中,第一个档是此软体的程式,第二个档 
        是此软体的设定,此二者是必要的档案;第三个是文件档, 
        如果不想看,可以不要。 
        抓回之後,tar 开。强烈建议大家有空读一读此软体的 
        Document。不过,如果「没有空」读,那麽阅读本文大概也 
        是装得起来的.... 
 
        PS. 以下的符号:"~/sendmail" 是表示抓来的sendmail所 
        tar 开的目录。 
 
步骤1:全tar 开後应该会在该目录下建立几个目录,其中程式是在 
        "~/sendmail/src" 的目录下,设定档在"~/sendmail/cf" 
        目录下。请转换至"~/sendmail/src" 的目录,用ls可以看 
        到许多名 Makefile.XXX 的档案。请使用者找到一个适合自 
        己系统的makefile,如: 
        假设是用IBM AIX 的系统,那就使用Makefile.AIX;用HP的 
        系统,那就用Makefile.HP-UX;如果是Sun 系统,那就用 
        Makefile.SunOS.x.x,但如果是SunOS 4.1.3 ,那得要用 
        Makefile.SunOS这个makefile档,而是Solaris 2.3 ,则得 
        要用Makefile.SunOS.5.x。 
        用vi或任一种编辑器,叫出刚挑出的makefile档,作一点点 
        必要的修改。所要修改的地方不多,下面是可能要修改的地 
        方: 
 
        1."CC ="如果原档所用的compiler并不是我们系统的,这才 
          要改。 
 
        2.本系统是否有安装Berkerlay 的New database?如果有, 
          跳过本点,到第3 点。 
          如果没有(如:一般SunOS 都没有装),那麽请修改这几 
          行(下面以Makefile.SunOS为例,但其他系统也类似): 
 
          A.在  DBMDEF= -DNDBM -DNEWDB -DNIS  一行,请改成: 
                DBMDEF= -DNDBM -DNIS 
            (即去掉-DNEWDB) 
 
          B.把这两行REMARK起来: 
                INCDIRS=-I/usr/sww/include/db 
            --> # INCDIRS=-I/usr/sww/include/db 
                LIBDIRS=-L/usr/sww/lib 
            --> # LIBDIRS=-L/usr/sww/lib 
 
          C.修改LIBS= -ldb -ldbm -lresolv   这一行成: 
                LIBS= -ldbm -lresolv 
            (即去掉-db ) 
 
 
        3.把nroff 的"-mandoc "参数改成一般系统可以接受的 
          "-man"(当然,这得依你的系统而定,如果你是用groff 
          ,那就可以很愉快的直接使用,不必改这个参数:))。如 
          果不改也并不会影响sendmail的安装,只是不能看到格式 
          化後的sendmail相关文件罢了。 
 
 
步骤2:输入make -f Makefile.XXX (当然,Makefile.XXX是指刚刚 
        从众里千百度挑出的那个档) 。然後就可以泡杯茶耐心的等 
        compile完毕。 
        不过,我们可以乘这个空档把旧的sendmail相关档案备份起 
        来,以防万一有甚麽不测,还可以向老板交代:)。要备份的 
        的档,当然是:/usr/lib/sendmail 和 sendmail.cf(後者 
        所在位置得依原系统而定,不过,一般都是在/etc下或 
        /etc/mail 之下)。 
        有一点要记得的是,原来的/usr/lib/sendmail 是个suid 
        root的程式,备份的请记得执行chmod u-s XXXX,要不然, 
        留著这样一个suid root 的程式,也是会让人有机可乘的! 
 
步骤3:此一步骤也是可以在compile 程式时进行的,就是要产生系 
        统设定档,也就是sendmail.cf 。 
 
        1.请切换至设定档目录~/sendmail/cf/cf 之下。找一个合 
          适自己系统的XXXX.mc档。笔者一般上是使用tcpproto.mc 
          这一个不用uucp的档。如果是用tcpproto.mc 这个档,笔 
          者在solaris 2.3 试了,得记得在档中要加上一行: 
             OSTYPE(solaris2) 
          Sun 4.1.3 不必,其他系统就不晓得了。 
        □在目录 ~/sendmail/cf/ostype下有几个OSTYPE()可以的 
          档,只有这个目录有资料的才可能能够OSTYPE()。还有, 
          如果是 system V的/bin/mail,似乎就得要加OSTYPE()。 
          一句老话,详情请看DOCUMENT:~/sendmail/cf/README 
           。这希望有经验的朋友能够补充:) 
 
     如果不小心忘了加上OSTYPE()会怎样?也不会怎样,只会 
     有"unknow mailer error" 的错误,然後信收不到。 
 
        □有一点要提醒大家的,就是:在~/sendmail/cf/cf 所看 
          到的各种系统的.mc 档,都是Sendmail 8.6.x的作者 
          Eric Allman 「示□」给大家看的,所以,可以看到档名 
          都有个"cs",要是没有修改就用这些档的话,那一定会发 
          生错误的。而要修改,有相当多地方要改,所以,如笔者 
          一般懒的人,用tcpproto.mc 还是比较简单又不会出错:) 
 
 
        2.好,选定了某一个合意的.mc 档,那接下来可执行m4产生 
          .cf 档。请下指令: 
            # m4 XXX.mc > YYY.cf 
          如果是sun 4.1.3 ,可能系统会抱怨m4的版本太旧了。那 
          请试一试用: 
            # /usr/5bin/m4 XXX.mc >YYY.cf 
          要是还是不行,那就请去抓新版的m4回来compile (可以 
         在ftp.edu.tw找到gnu 的m4)。 
 
        3.产生出来的YYY.cf一般得要改个地方才能正常的收信。请 
          寻找"Cw",原来产生的.cf 档,Cw应是: 
            Cwlocalhost 
          请在localhost 之後加上你那一台机器所有可能用来当收 
          信地址的host name 。 
          例如我有一台机器叫:ftp.nccu.edu.tw,而且也叫: 
                              gopher.nccu.edu.tw 
          ,而我希望这一台机器这两个名字都能收信,那我要这麽 
          作: 
            Cwlocalhost ftp.nccu.edu.tw gopher.nccu.edu.tw 
 
          顺便说一下,Cw之後只能写入本机器的名字,千万不能写 
          入其他机器的名字,否则,甚麽地方都能寄,那被写的就 
          一定不能寄。 
 
        □上面其实是简略的说法,如果你对DNS 也熟悉的话,可参 
          考这节来作判断,判断是否须要在Cw之後写入东东。否则 
          请直接跳过这一小节,闭上眼睛把本机器所用的所有名字 
          都写上就是了:) 
          1.在一台机器上,如果有多个名字(hostname),而是用 
            CNAME 建立的,如: 
            $ORIGIN nccu.edu.tw 
            ftp         IN      A       140.119.1.2 
            gopher      IN      CNAME   ftp 
 
            那麽可以不必在Cw上标明。系统会透过DNS 找到其 
            Canonical name。 
 
          2.如果一台机器有多个名字,可是,每个名字是用A record 
            建立的。如: 
            $ORIGIN nccu.edu.tw. 
            ftp         IN      A       140.119.1.2 
            gopher      IN      A       140.119.1.2 
            这种情况【一定】要记得在Cw後写上你所要收信的名字。 
            如果这个忘了写,会有怎样的问题呢? 
            忘了将会有从外面机器寄信来,没有写上的机器名将却收 
            不到信,机器会抱怨: 
            "Local configuration error" 。 
 
            如:我的sendmail.cf中的Cw这行是如下: 
              Cw ftp.nccu.edu.tw 
            那我将无法使用这个地址: 
              username@gopher.nccu.edu.tw 
            而只能用 
              username@ftp.nccu.edu.tw 
            否则将出现上述错误。 
 
            如果发现了错误,那再加上去也就可以了。 
 
          3.如果一台机器有多interface ,各interface有其本身的 
            名字,且要收信。这个情况也要在Cw之後写明所有要收信 
            的hostname。 
 
 
        □不过,有一点要提醒大家的,就是再加上去 之後,一定要 
          用"kill -9 [pid-of-sendmail]" ,如果用 kill -HUP 是 
          不会发生作用的! (这是颇多人常遇到的问 题,切记!) 
 
 
步骤4:终於来到令人紧张兴奋的时刻了!这个步骤是要把compile 
        好的东东install 到系统上去了。 
 
        罗嗦的我还是得再一次提醒您看看:把旧档案备份好了吗? 
 
        好,假设compile 的结果非常没挑战性的没有任何错误,产 
        生.cf 档过程也没有甚麽值得注意的讯息。所产生的.cf 档 
        也改好了。而且最重要的:作好旧档的备份(不是我要吓人 
        ,这是以防万一)。 
 
        1.挑个老板没有在用mail的时间,快手快脚的切换至目录 
          ~/sendmail/src ,下指令: 
            # make -f Makefile.XXX install 
          系统会把compile出来的~/sendmail/src/sendmail与man 
          document拷贝到它们该有的目录(所以你还如果没有备份 
          /usr/lib/sendmail ,那赶快祈祷待回不要出问题,要不 
          然就赶快准备泪水哭吧!因为旧的会被compile 出来的 
          sendmail覆盖) 
 
        2.切换至目录~/sendmail/cf/cf ,把产生出来的YYY.cf档 
          拷贝到本系统sendmail.cf 应该在的地方,如:/etc或 
          /etc/mail 。 
 
        3.把旧sendmail daemon 的process 杀掉。(这应该不用我 
          罗嗦吧!用ps -ax |grep sendmail |grep -v grep 找出 
          旧daemon的process(或head -1 /etc/sendmail.pid 或 
          head -1 /etc/mail/sendmail.pid),然後用 
          kill -9 processID干掉它(或直接用 
          kill -9 `head -1 /etc/sendmail.pid`)。 
 
        4.启动新daemon。例如下指令: 
            /usr/lib/sendmail -bd -q30m 
          当然,保守一点,看旧的daemon怎麽跑,照旧的来下参数 
          应该是没有问题。 
步骤5:嗯嗯,东东都装上了,这个步骤当然就只是测试罢了。记得 
        要测: 
          1.local 的收、发信。 
          2.remote的收、发信。 
          3.最好当然能试试不同的domain 或甚至net 的收发情况。 
        如果一切都正常,那太恭喜你了:) 
        如果有甚麽问题,可以post到bbs 求救。或者,post到news 
        的group :comp.mail.sendmail。cms 这个讨论群还可以看 
        得到sendmail 8.6.X的作者Eric Allman 常在上面为人解答 
        哩!或者,可以直接mail到:sendmail@cs.berkeley.edu, 
        会有专人解答。 
 
【问题集】 
1.为甚麽我所寄的信有时会queue 著?有些会connect refuse? 
◆在sendmail.cf 中有两个个option与queue 有关,即: 
  Oxn 其中n值是系统loading值,如果loading超过此值,信将queue 
      著。default值是8 。 
  OXn 如果系统loading 值超过n ,则将罢工不干了。default 是12 
  当然,sendmail 8.6.x的default 不见得适合每个系统,大家可依 
  自己机器可接受的程度作适当的调整。 
◆根据syc 先生的使用经验发现如果使用Eric的处理queue 的script 
  也会有信queue 著的情形。所以,请不要使用Eric的script。 
 
 
 
2.可不可以让机器所寄出去的信,都用某个指定的名字,如domain 
  name? 
  请在作m4之前,在所选定的.mc 档加入这两行: 
    FEATURE(allmasquerade) 
    MASQUERADE_AS(some_name) 
                  ^^^^^^^^^如:cc.nccu.edu.tw 
 
3.出现"unknow mailer error" or "Local configuration error"怎麽 
  办? 
  请参考上文。 
 
4.为何修改了sendmail.cf 之後,系统运作并如想像中那样子?就好像 
  没有任何作用一样.... 
  请用kill -9   `head -1 /etc/sendmail.pid`然後再启动daemon, 
  而不能用: 
      kill -HUP `head -1 /etc/sendmail.pid` 
5.AIX 的机器上要如何使用Sendmail v8? 
  笔者在AIX 3.2.5.1 试过,好像在把local mailer改成AIX 的 
  /bin/bellmail 才行。即改成: 
  Mlocal, P=/bin/bellmail, F=lsDFMmn, S=10, R=20/40, A=mail -F $g $u 
                             ^^^^^^^^注意,这里不能有flag "r" 
 
6.root使用者能写信,一般使用者却不能? 
  请查看是否/usr/lib/sendmail忘了suid root。 
 
 
【非sendmail的问题】 
这是与mail有关,但却不是sendmail的问题。 
1.在AIX 机器的信会queue 著,用/usr/lib/sendmail -q强迫处理queue 
  时,出现如下的错误: 
    bellmail: lockf(/usr/spool/mail/hup): Permission denied 
  为甚麽呢? 
 
  原因:AIX 的bellmail太麻烦! 
  bellmail要处理local 的信,要求/usr/spool/mail/下的档案的group 
  与bellmail的group 相同,而且mode一定要是660,否则就会出现这个 
  问题。所以/usr/spool/mail 这个目录一定要sgid 为与bellmail同个 
  group ,而且常跑个cron,看那个使用者把自己的mode改成600了的就 
  改回去。 
  还有,如果用elm ,那请记得,elm 一定要sgid成与bellmail同个 
  group ,否则/usr/spool/mail 下的档案的group 可能会被改走。 
 
 
 
-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.18.6] 

BBS水木清华站∶精华区