BBS水木清华站∶精华区

发信人: ruster (尘埃*星辰*领悟), 信区: Linux        
标  题: 第六章 Intranet(上) 
发信站: BBS 水木清华站 (Thu Dec 21 13:42:02 2000) 
 
第6章 Intranet 
   
  本章要点: 
   
  本章介绍如何将Linux配置为Intranet/Internet服务器,如ftp,www服务器等等。 
   
      本章具体包括以下内容。 
   
    Internet名字服务器的配置 
   
    ftp服务器的配置 
   
    WWW服务器的配置 
   
  6.1 域名系统 
   
  域名服务即DNS系统,它可以让你在访问确定的机器的时候,无需给出IP地址而是利用 
容易记忆的名字来处理问题。实际上,它有两种任务,将用户提出的名字翻译成IP地址 
,或者从IP地址查出域名。 
   
  6.1.1 DNS的工作模式 
   
  DNS是一个庞大的分布式数据库系统,它使用树状结构来处理各种查询。首先,我们会 
注意到,DNS名字是一些用点号分开的字符串,例如www.microsoft.com,这种名字通常 
用一种虽不太准确却很容易的方式来理解,例如microsoft.com是.com下的一个“子域” 
,而www.microsoft.com是microsoft.com的一个成员。所有DNS的共同祖先是".",称为 
根域。 
   
  每个子域都应该有自己的名字服务器,或DNS服务器,例如,我们有一个.mydomain.c 
om域,为了实现对域内的机器以及下层子域能够提供DNS服务,我们至少应该有一台域名 
服务器来处理DNS请求。 
   
  下面我们看看DNS是如何工作的,假设我们的域名服务器是ns.mydomain.com,它用来 
处理所有域内机器发出的DNS请求,这种DNS请求可以分成三种,一种是在mydomain.com 
内部的名字,名字形式是(比如说)host1.mydomain.com;第二种是在mydomain.com之外 
,比如说bbs.edu.cn;第三种是在mydomain.com下的一个子域内的一台机器,例如host 
2.subdomain.mydomain.com。 
   
  ns.mydomain.com中应该包含所有名字为*.mydomain.com的机器的名字到IP地址的对照 
关系,但是不包含*.subdomain.com的对照关系。所以,当DNS客户机器向它提出一个查 
找host1.mydomain.com的请求的时候,它直接从本地数据库得到host1.mydomain.com的 
IP地址信息并且送回。 
   
  当接收到一个类似于bbs.edu.cn的DNS查询请求的时候,DNS服务器将首先判断出它不 
在本地域内部,为了得出一个结果,它有两个选择,一个是回答客户“我不知道,但是 
你可以去问XXX服务器”;另外一个选择是自己去查询其他的DNS服务器,得到结果后再 
传送给客户。第二种方式称为递归检索。 
   
  为了能够找到bbs.edu.cn的地址,ns.mydomain.com必须知道世界上其他服务器的地址 
,这有两种方案,第一种是ns.mydomain.com一开始就知道一个更庞大的DNS服务器,所 
有不懂的名字都交给它去查询,这种方式称为转发;另外一个方法更专业一点,首先, 
ns.mydomain.com知道世界上某些最重要的名字服务器的地址,然后再从这些服务器开始 
按照DNS的树状顺序查询。 
   
  举例来说,ns.mydomain.com发现自己不知道bbs.edu.cn的地址,但是它知道世界上有 
一些“根”服务器,例如,a.root.net就是这样的一个服务器,其地址是198.41.0.4。 
所以,它向198.41.0.4提出一个请求。 
   
  a.root.net在接受到这个请求之后,它也不知道这个名字到底在那里,但是由于bbs. 
edu.cn看起来在.cn中,而它知道.cn的域名应该由ns.cnc.ac.cn负责,其IP地址是159. 
226.1.1。于是它回答:“去问159.226.1.1,以后凡是.cn的请求你可以问它”。 
   
  接下来,ns.mydomain.com将会去询问ns.cnc.ac.cn,ns.cnc.ac.cn也不知道bbs.edu 
.cn在那里,但是它知道edu.cn应该由dns.edu.cn负责,所以它回应:“edu.cn应该去问 
dns.edu.cn,IP是202.112.0.35”。 
   
  当ns.mydomain.com询问dns.edu.cn时,终于得到了这个域名的正确地址:202.112.5 
8.200。但是接下来,在返回信息之前,ns.mydomain将首先记忆自己所学到的知识: 
   
  凡是.cn的名字,去问159.226.1.1 
   
  凡是.edu.cn的名字,去问202.112.0.35 
   
  bbs.edu.cn的名字是202.112.58.200 
   
  它将这些信息记录在自己的文件中,以后当再有客户询问bbs.edu.cn时,它直接回答 
:“我记得那是202.112.58.200”。 
   
  最后,返回查询结果。 
   
  当提问的是host2.subdomain.mydomain.com时,ns.mydomain.com将会首先看到subdo 
main.mydomain.com应该由ns.subdomain.mydomain.com处理,所以去询问ns.domain.my 
domain.com,其他和上面说的流程基本相同。 
   
  显然,由于ns.mydomain.com存储了查询到的知识,所以它也可以回答许多不应该由它 
回答的信息,但是这些信息可能是错误的(因为名字到IP的对照关系可以更改)。这种 
信息称为“非权威信息”。相反,有关host1.mydomain.com的信息它的知识肯定是正确 
的。 
   
  为了提高域名服务的效率,通常一个子域内可以有多个域名服务器,这些服务器可以 
分成三类,一类是确实记录了域内机器的名字信息的服务器,称为主(primary)域名服 
务器;另一类也包含记录,但是它的信息是定期从主服务器来的,这种服务器的名字信 
息也是权威信息,这种服务器称为从(secondary)域名服务器;还有一类简单地缓冲各种 
查询信息,自己并不发布任何权威信息,这称为cache-only服务器。 
   
  6.1.2 bind 8 服务器配置 
   
  DNS服务器通常用named守护进程提供,不过它有一个怪异的名字,称为bind。由于历 
史的原因,named有两个规范,分别称为bind 4和bind 8。我们研究的是bind 8,这是目 
前的Linux发行版本中的named程序的标准。 
   
  要使用named程序,你需要安装bind软件包,我这里使用的是bind-8.2.1-7。 
   
  配置bind8首先需要处理/etc/named.conf文件,通常它由一串段落构成,我们这里只 
能介绍最重要的部分。 
   
  让我们来看一个范例性的named.conf文件,在这个例子中,我们配置的是asnc.edu.c 
n域的主域名服务器: 
   
  [root@openlab /etc]# cat named.conf 
   
  options { 
   
          directory "/var/named"; 
   
  }; 
 
   
  zone "." in { 
   
          type hint; 
   
          file "named.ca"; 
   
  }; 
 
   
  zone "0.0.127.in-addr.arpa" in { 
   
          type master; 
   
          file "named.local"; 
   
  }; 
   
  zone "asnc.edu.cn" in { 
   
  type master; 
   
  file "asnc.hosts"; 
   
  }; 
   
  zone "248.199.202.in-addr.arpa" in { 
   
  type master; 
   
  file "asnc.rev"; 
   
  }; 
   
  首先是options段落,它用于建立一些全局信息,这里的directory 信息告诉named程 
序到哪里去找后面指出的那些文件。 
   
  每个zone段落定义一组查询信息,zone "."定义的是根信息,即DNS根服务器的信息, 
接下来file "named.ca"给出了根文件的名字。 
   
  zone "0.0.127.in-addr.arpa"段落给出反向的域名解析信息,注意0.0.127.in-addr 
.arpa"实际是定义的127.0.0.*的信息,也就是IP地址是反写的。type master表示这是 
个主域名服务器。同样,这个定义文件在named.local。 
   
  zone "asnc.edu.cn" 给出*.asnc.edu.cn的信息,按照这里的定义显然相应的信息在 
asnc.hosts文件中。相应地,zone "248.199.202.in-arpa"给出的是202.199.248.*的名 
字信息,文件在asnc.rev。 
   
  上面提到的四个文件按照options段落应该位于/var/named,那么我们看一下这几个文 
件: 
   
  [root@openlab named]# cat named.ca 
   
  .                        3600000  IN  NS    A.ROOT-SERVERS.NET. 
   
  A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4 
   
  .                        3600000      NS    B.ROOT-SERVERS.NET. 
   
  B.ROOT-SERVERS.NET.      3600000      A     128.9.0.107 
   
  .                        3600000      NS    C.ROOT-SERVERS.NET. 
   
  C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12 
   
  .                        3600000      NS    D.ROOT-SERVERS.NET. 
   
  D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90 
   
  .                        3600000      NS    E.ROOT-SERVERS.NET. 
   
  E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10 
   
  .                        3600000      NS    F.ROOT-SERVERS.NET. 
   
  F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241 
   
  显然,现在这个文件定义的是一些根服务器的地址。这个文件是在安装bind的时候自 
动生成的,你也可以按照bind的文档自己去下载。由于根服务器可能会改变,你需要定 
期下在这个文件。 
   
  接下来,我们可以注意named.local文件: 
   
  [root@openlab named]# cat named.local 
   
  @       IN      SOA     localhost. root.localhost.  ( 
   
                                        1997022700 ; Serial 
   
                                        28800      ; Refresh 
   
                                        14400      ; Retry 
   
                                        3600000    ; Expire 
   
                                        86400 )    ; Minimum 
   
                IN      NS      localhost. 
 
   
  1       IN      PTR     localhost. 
   
  这个文件由两个部分构成:SOA段落和名字记录。每个信息文件必须以一个SOA段落开 
始。它定义了下面的名字记录应该如何理解和使用,一个@ IN SOA代表了SOA记录的开始 
,现在的形式是: 
   
  @       IN      SOA     localhost. root.localhost.  ( 
   
  第一个localhost.表示这个SOA段落使用的是localhost机器,接下来的root.localho 
st应该理解为root@localhost,表示DNS管理员的邮件地址。注意这些地址后面都必须加 
上一个点号。加上结束点号的名字代表完整的主机名,而没有结束点号的名字将自动加 
上zone里面定义的后缀。 
   
  括号内定义了一组信息,其中,最主要的是序列号信息,例如这里的1997022700,实 
际上,其数值无关紧要,问题是次域名服务器需要根据这个数值判断文件的版本信息, 
所以每次更改内容,你都应该将这个数值加大一点。 
   
  另外的几个信息是缺省的刷新时间,这个缺省值已经可以使用,通常你无需更改它们 
,只有到最后的负载均衡部分我们才需要真正关心这个信息。 
   
  下面就是记录信息了,这里只有两个信息: 
   
  IN   NS localhost 
   
  这是个NS记录,表示本域的域名服务器是localhost。 
   
  IN PTR localhost. 
   
  我们指出过named.local是一个反向查询用的信息文件,现在就是一个信息记录,PTR 
表示这是一个反向解析记录,这里的PTR记录指出127.0.0.1的名字是localhost。注意这 
里用的是1,因为后面没有点号,所以named会自动给它加上来自named.conf的后缀,在 
这里就是.0.0.127,也就是组成1.0.0.127,反序之后就成为127.0.0.1。 
   
  下一个文件是asnc.hosts,它是: 
   
  [root@openlab named]# cat asnc.hosts 
   
  @       IN      SOA     openlab.asnc.edu.cn. wanghy.openlab.asnc.edu.cn.   

   
                                        1997022700 ; Serial 
   
                                        28800      ; Refresh 
   
                                        14400      ; Retry 
   
                                        3600000    ; Expire 
   
                                        86400 )    ; Minimum 
   
                IN      NS      openlab.asnc.edu.cn. 
   
  openlab       IN      A     202.199.248.6 
   
  mail          IN      A     202.199.248.11 
   
  www           IN      A     202.199.248.2 
   
  同样使用SOA段落开始,内容和刚才说的差不多。 
   
  NS之后就是A记录,A记录和PTR记录正好相反,是从域名解析IP地址用的记录。注意到 
按照/etc/named.conf这个文件负责的是asnc.edu.cn域,而且openlab后面没有点号,所 
以解释为openlab.asnc.edu.cn = 202.199.248.6。相应地,下面的两个记录也如此解释 
。 
   
  最后是asnc.rev,它的内容对于我们现在很清楚了: 
   
  [root@openlab named]# cat asnc.rev 
   
  @       IN      SOA     openlab.asnc.edu.cn. wanghy.openlab.asnc.edu.cn.   

   
                                        1997022700 ; Serial 
   
                                        28800      ; Refresh 
   
                                        14400      ; Retry 
   
                                        3600000    ; Expire 
   
                                        86400 )    ; Minimum 
   
                IN      NS      openlab.asnc.edu.cn. 
   
  2             IN      PTR     www.asnc.edu.cn. 
   
  11            IN      PTR     mail.asnc.edu.cn. 
   
  6             IN      PTR     openlab.asnc.edu.cn. 
   
  177           IN      PTR     physics.asnc.edu.cn. 
   
  确认上述文件无误之后,可以启动named了。通常我们用/usr/sbin/ndc程序来启动na 
med: 
   
  $ ndc start 
   
  new pid is 1289 
   
  出现这个信息说明named程序已经开始工作了。 
   
  要确认named的工作是否正确,使用nslookup程序: 
   
  $nslookup 
   
  Default Server:  openlab.asnc.edu.cn 
   
  Address:  202.199.248.6 
 
   
 
   
  >是nslookup程序的提示符,在这里可以输入nslookup命令,比如,在刚才我们定义了 
一个mail.asnc.edu.cn,其地址是202.199.248.11,那么,我们可以实验一下是否正确 
: 
   
  > mail.asnc.edu.cn 
   
  Server:  openlab.asnc.edu.cn 
   
  Address:  202.199.248.6 
 
   
  Name:    mail.asnc.edu.cn 
   
  Address:  202.199.248.11 
   
  > 202.199.248.11 
   
  Server:  openlab.asnc.edu.cn 
   
  Address:  202.199.248.6 
 
   
  Name:    mail.asnc.edu.cn 
   
  Address:  202.199.248.11 
   
  显然,这个地址信息的添加是正确的,然后我们要测试一下对非本域的地址验证是否 
正确,例如: 
   
  > www.gov.tw 
   
  Server:  openlab.asnc.edu.cn 
   
  Address:  202.199.248.6 
 
   
  Name:    service.gov.tw 
   
  Address:  210.69.2.1 
   
  Alias:  www.gov.tw 
   
  这个操作要花费比较长的时间,因为要去查询非本地的名字服务器,但是如果你再次 
查询这个信息,就会发生这样的情况: 
   
  > www.gov.tw 
   
  Server:  openlab.asnc.edu.cn 
   
  Address:  202.199.248.6 
 
   
  Non-authoritative answer: 
   
  Name:    service.gov.tw 
   
  Address:  210.69.2.1 
   
  Aliases:  www.gov.tw 
   
  Non-auth.....这样的提示表示信息不是真正从对方的服务器来的,而是来自某个缓冲 
服务的结果(在现在就是本地缓冲的结果)。 
   
  测试完毕后,输入exit退出。 
   
  一般情况下,DNS的工作信息可以在/var/log/messages中看到。 
   
  上面我们定义了一个主域名服务器,其实次要域名服务器的配置也差不多,不过,因 
为次要域名服务是从主域名服务器得到数据,所以不需要配置asnc.rev和asnc.hosts文 
件,相反,我们需要把zone中相应的部分改成: 
   
  zone "asnc.edu.cn" in { 
   
  type slave; 
   
  masters {202.199.248.2}; 
   
  }; 
 
   
  zone "248.199.202.in-addr.arpa" in { 
   
  type slave; 
   
  masters {202.199.248.2}; 
   
  }; 
   
  type slave说明这是个从域名控制器,masters子句给出了本域的主域名控制器的地址 
,注意必须用花括号括起来,这是个非常容易犯的错误。 
   
  还可以定义cache-only控制器,这可以用type forward方式实现,如 
   
  zone "asnc.edu.cn" in { 
   
  type forward; 
   
  forwarders {202.199.248.2}; 
   
  }; 
   
  由于named的实现,每次修改名字解析文件(如asnc.hosts,asnc.rev等等)之后,需 
要重新启动named,这可以用ndc restart命令实现。 
   
  前面我们曾经指出过,DNS是一种分级检索系统,那么,上级DNS如何知道下级DNS的信 
息呢?举个例子来说,如果你申请了一个mydomain.com的域名,那么.com的服务器应该 
如何注册它呢? 
   
  为了解释这个问题,我们看一个例子,这个例子的配置就是上面说的asnc.edu.cn域的 
主DNS服务器,现在我需要建立一个子域lab.asnc.edu.cn,那么,注意新的asnc.hosts 
文件(加粗体的是增加的部分): 
   
  [root@openlab named]# cat asnc.hosts 
   
  @       IN      SOA     openlab.asnc.edu.cn. wanghy.openlab.asnc.edu.cn.   

   
                                        1997022700 ; Serial 
   
                                        28800      ; Refresh 
   
                                        14400      ; Retry 
   
                                        3600000    ; Expire 
   
                                        86400 )    ; Minimum 
   
                     NS      openlab.asnc.edu.cn. 
   
  openlab       IN      A     202.199.248.6 
   
  mail          IN      A     202.199.248.11 
   
  www           IN      A     202.199.248.2 
   
  physics       IN      A     202.199.248.177 
   
  lab   134000  IN      NS    ns.lab.asnc.edu.cn. 
   
  ns.lab 134000  IN      A     202.199.248.149 
   
  第一个加粗的行定义了一个子域,因为lab后面没有点,所以自动解释为lab.asnc.ed 
u.cn。NS是名字服务器记录,这一行说明lab.asnc.edu.cn域的内容应该去ns.lab.asnc 
.edu.cn域询问,134000是生存期,即这个名字在多长时间内不会改变,这个栏目是可选 
的,缺省就使用前面的定义。注意如果在IN NS前面没有子域说明的话,就表示相应的名 
字服务记录是对于本域的。例如IN NS 202.199.248.254将定义另一个对于asnc.edu.cn 
域的域名服务器。 
   
  接着的一行定义了ns.lab机器的地址,这样,以后再有询问host.lab.asnc.edu.cn.的 
时候,我们的DNS服务器将去查询202.199.248.149服务器。 
   
  显然,如果你做的是一个很大的公司的主域名控制器,那么你的名字服务器会缓冲许 
多的信息,而且会忙于处理愚蠢的检索。为了解决这个问题,你可以将你的服务器设置 
成为非递归的,这可以通过在named.conf中加入参数 recursion no子句来实现,通常r 
ecursion是置为yes的。 
   
  在一般情况下,PTR和A记录是域名系统的主要数据,另外两种常见的记录类型是MX和 
CNAME,MX记录我们放到电子邮件那一章去描述,而CNAME是某个A记录的别名,例如在a 
snc.hosts中加入 
   
  www2   CNAME   mail 
   
  表示www2.asnc.edu.cn是mail.asnc.edu.cn的另外一个名字。 
   
  注意有两种给一个地址赋以多个名字的办法,一种是用两个地址栏相同的A记录,另一 
种是用CNAME,但是只有CNAME才能产生别名关系。这会在http server的设置中产生一些 
影响,详细内容见WWW server那一节。 
   
  6.2 文件传输服务 
   
  文件传输即ftp服务,在各种intranet的服务中它应该是最容易配置的。一般来说,它 
也非常容易管理。我们这里使用的是wu-ftpd和一些派生的ftp软件。实际上,如果要做 
ftp站点,Linux是非常合适的,因为它的磁盘操作性能很高。 
   
  6.2.1 wu-ftpd的配置和管理 
   
  wu-ftpd是Linux缺省的ftp服务器,几乎每个Linux发行版本都会包含这个产品。通常 
安装系统的时候就会安装这个软件,你可以用rpm –q wu-ftpd来检查是否安装了这个程 
序。如果没有,你仍然可以自己安装这个产品。 
   
  wu-ftpd程序是通过inetd程序启动的,要使用它,你应该首先确定/etc/services文件 
中包含这样一行: 
   
  ftp                 21/tcp 
 
   
  然后确定/etc/inetd.conf包括这样的行: 
   
  ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a  
 
   
  重新启动inetd就可以提供服务了。 
   
  因为in.ftpd程序是通过/usr/sbin/tcpd程序启动,所以以前介绍的身份控制文件hos 
ts.allow和hosts.deny程序对它仍然起作用。另外,ftp程序还有一些额外的身份检查。 
   
  前面我们指出过,/etc/passwd文件的最后一个栏目是用户的登录shell,即用户登录 
完成后执行的第一个程序,在ftp服务器启动的时候,它检查用户的shell程序,并且和 
/etc/shells文件列出的程序比较,只有在shell包含在/etc/shells里面的用户才能成功 
登录ftp,否则将被弹回。 
   
  登录时的另外一个检查是用户名是否是anonymous或者ftp,如果是,那么in.ftpd程序 
将认为这是一个匿名用户,这种情况下,它检查/etc/passwd中是否有名叫ftp用户,如 
果存在,in.ftpd程序将用户放到ftp用户的宿主目录中,并且执行一个chroot命令,将 
这个目录变成用户的根目录;如果不是匿名用户,那就把用户放到他的正确宿主目录中 
,也不执行chroot命令。显然,由于chroot的作用,匿名用户无法越出ftp用户的宿主目 
录,即使用连接也不行。但是这带来了一个问题,就是ftp用户无法访问/bin和/usr/bi 
n,/lib,/usr/lib目录,因此无法使用UNIX命令。解决的办法是在匿名用户的根目录( 
比如/ftp)下建立bin和lib目录,然后把最常用的一些命令拷贝到里面去,通常安装系 
统的时候,安装程序会替你作这件事情,不过它是自动建立在/home/ftp下面,如果你更 
改了ftp用户的目录,请把/home/ftp下面的bin和lib目录移动过去。 
   
  理解了wu-ftpd的工作方式之后,配置它就并不复杂了。wu-ftpd程序有一组配置文件 
,最重要的是/etc/ftpaccess,这个文件决定了大部分的ftp服务器行为,另外,/etc/ 
ftpconversions,/etc/ftphosts,/etc/ftpusers,/etc/ftpgroups也很重要。 
   
  让我们先看一下/etc/ftpaccess的语法,通常ftpaccess支持下列的句子(注意,这里 
只列出了绝对必须理解的句子,其他的你可以简单地使用缺省值。Linux的一大好处就是 
配置可以在原来的文件上改来改去): 
   
  class  
   
  定义可以访问服务器的一类用户。格式是class [类名] [用户类型] [地址组] 
   
  类名是任意的字符串,用它来标志一个类,用户类型是用逗号分开一个列表,表中的 
项目可以是anonymous,guest和real。anonymous就是匿名用户,real表示一切在服务器 
上有实际账户的用户,而guest用户比较奇怪,它是用guestgroup限制的真实用户,一般 
我们并不需要这个功能,如果你对此感兴趣,参考ftpd的文档。地址组是个通配符,表 
示用户可以登录的地点。 
   
  例如,class myclass real * 将允许真实用户从任何地方登录服务器,而class hos 
t anonymous 192.168.42.* 意味着允许匿名用户从192.168.42.0-255来登录;当然cla 
ss all guest,real,anonymous * 意味着所有人可以从任何地方登录。 
   
  可以有任意多个class子句。 
   
  deny 
   
  禁止用户从某些主机登录。语法是deny [地址组] [信息文件名字],其中信息文件名 
字是拒绝服务时显示的内容。例如,deny host1.edu.cn /ftp/message_deny将在有人试 
图从host1.edu.cn启用本机的ftp服务时拒绝并显示/ftp/message_deny文件的名字。 
   
  如果想拒绝没有域名的机器登录,在地址组中使用 ! nameserved。 
   
  limit 
   
  限制某个类中的ftp连接数。例如,想限制myclass类中的连接不能超过10个,使用 
   
  limit myclass 10 
   
  注意limit还有两个可选的参数,时间参数用于设定限制生效的时间,其形式比较古怪 
,你可以自己参考文档,不过我不认为这个有太大用处;另外一个参数是达到限制之后 
拒绝连接所显示的文件,如上面的行可以改成 
   
  limit myclass 10 /ftp/toomanyopen 
   
  然后在/ftp/toomanyopen中写上“由于连接数已满,请稍候再连接”。 
   
  loginfails 
   
  设置用户可以重试密码的次数,语法是loginfails [次数] 
   
  banner 
   
  显示欢迎信息,这个信息将在登录提示之前显示。语法是banner [文件名] 
   
  email 
   
  如果系统出错,给谁发信,语法是email [邮件地址]。 
   
  message 
   
  设定一些条件,当发生这些条件的时候,向用户传递信息。语法是 message [信息文 
件名] [条件] [适用的类]。其中条件可以是LOGIN或者CWD=[路径名],LOGIN表示登录成 
功,CWD则是进入到某个目录。不过要注意当对匿名用户使用时,信息文件的路径名要相 
对于ftp用户的宿主目录。 
   
  例如,定义匿名用户的类是ftp,然后希望匿名用户登录时显示/ftp/welcome,进入/ 
ftp/download目录时显示/ftp/help,而且ftp用户的宿主目录是/ftp,那么welcome和h 
elp文件的相对路径名应该是/help和/welcome,所以可以写成: 
   
  message /welcome LOGIN ftp 
   
  message /help CWD=/download ftp 
   
  log commands 
   
  记录用户的命令,用法是log commands [用户类型]。例如,要记录所有用户输入的命 
令,用log commands anonymous,real,guest 
   
  log transfers 
   
  记录用户进行的文件传输,语法是log transfers [用户类型] [传输类型],用户类型 
就是anonymous,guest和real,而传输类型可以是inbound和outbound,表示两个传输方 
向。例如 
   
  log transfers anonymous,guest,real inbound,outbound 
   
  记录文件在/var/log/xferlog。 
   
  chmod,delete,overwrite,rename 
   
  是否允许用户执行上述操作,语法类似于chmod [yes/no] [用户类型]。例如,想禁止 
匿名用户和guest用户更改服务器上的文件,可以使用: 
   
  chmod           no              guest,anonymous 
   
  delete          no              guest,anonymous 
   
  overwrite       no              guest,anonymous 
   
  rename          no              guest,anonymous 
   
  compress,tar 
   
  这是两个古怪的功能,它可以允许一个文件在被下载之前先解压或者先压缩,语法有 
点类似于compress [yes/no] [用户类型]。这样可以让没有tar或者gzip程序的用户也能 
够展开这些文件,但是这需要配置/etc/ftpconversions文件。实际上现在这两个功能几 
乎没有任何意义,你就自己看个乐子吧。man ftpconversions得到更多的信息。 
   
  passwd-check 
   
  对匿名用户的口令检验的方式,格式是passwd-check [规则] [处理方式]。规则可以 
是三个选项之一,即none,trial或者rfc822。如同你知道的那样,匿名ftp登录的时候 
需要输入一个email地址作为口令,none表示根本不进行检验,trial表示这个地址中至 
少要有一个@符号,rfc822要求最严,要求必须看上去是一个正确的email账号(然而, 
反正任何人都可以编造一个假的,不是吗?)。处理方式可以是warn或者enforce。在w 
arn的情况下,输入不合法信息的匿名用户仍然可以登录,但是会显示一条错误信息,而 
enforce将强迫你输入一个合乎规则的字符串。 
   
  upload 
   
  指定匿名用户上传文件的方式,语法是upload [目录] [上载位置] [yes/no] [uid]  
[gid] [mode] [dirs/nodirs] 
   
  目录是这个upload子句影响的目录,通常我们直接把它设置成匿名用户的宿主目录; 
上载目录是相对于前面定义的那个目录的上载目录的位置,yes或no这个开关设定[上载 
位置]目录是否可以上载,uid/gid/mode表示上载后文件的属主,组名和属性,dirs/no 
dirs则确定用户是否可以在这个目录里建立子目录。 
   
  例如,匿名用户的宿主目录为/ftp,要把/ftp/incoming当成上载目录,而且可以建立 
子目录,上传的文件属于ftp,组为ftp,属性0644,允许创建目录,那么可以设置 
   
  upload /ftp /incoming* yes ftp ftp 0644 dirs 
   
  注意/incoming*,这表示incoming各个子目录也可以上载。 
   
  为了使上载成功,需要将/ftp/incoming的属性设置为0777。 
   
  下面是一个范例性的ftpaccess文件: 
   
  class   all   real,guest,anonymous  * 
   
  email root@localhost 
   
  loginfails 5 
   
  message /welcome.msg            login 
   
  message .message                cwd=* 
   
  compress        yes             all 
   
  tar             yes             all 
   
  chmod  no  guest,anonymous 
   
  delete  no  guest,anonymous 
   
  overwrite no  guest,anonymous 
   
  rename  no  guest,anonymous 
   
  log transfers anonymous,real inbound,outbound 
   
  passwd-check rfc822 warn 
   
  upload  /ftp  /incoming*       yes  ftp  ftp  0644 dirs 
 
   
  下一个比较重要的配置文件是/etc/ftphosts,它用来定义一些地址可以或者不能使用 
ftp,语法是allow [用户名] [地址表] 或者 deny [用户名] [地址表],例如allow us 
er1 10.0.0.0/8。 
   
  /etc/ftpusers用来定义禁止使用ftp服务的用户,例如,在/etc/ftpusers中写上roo 
t一行将禁止root用户使用ftp。 
   
  6.2.2 其他的服务器 
   
  wu-ftpd是最常用的ftp服务器程序,但是,也存在许多其他的ftp服务程序,例如pro 
ftpd和beroftpd。 
   
  BeroFTPD实际是wu-ftpd的一个衍生程序,实际上,它和wu-ftpd几乎是一样的,但是 
支持一些新的功能。例如限制用户每次下载的字节数等等,组管理,虚拟服务器等等。 
要使用BeroFTPD,必须先安装这个产品,我们不想详细地介绍这个产品,你应该下载它 
的源代码并且自己编译这个程序,与wu-ftpd的主要差别在于你必须谨慎地配置它的各个 
目录。特别地,我们总是建议自己编译源代码: 
   
  ./configure  
   
  make  
   
  make install 
   
  BeroFTPD的配置文件和wu-ftp兼容,如果你愿意,可以直接把原来的/etc/ftpaccess 
文件拷贝到/etc下面,然后更改/etc/inetd.conf文件,将有关ftp的行改成: 
   
  ftp     stream  tcp     nowait  root    /usr/sbin/tcpd /usr/sbin/BeroFTPD 
   
  BeroFTPD是编译出的服务程序的名字。然后重新启动inetd就可以工作了。不过必须注 
意,BeroFTPD不使用/etc/ftpusers文件! 
   
  BeroFTPD有一些非常详细的手册页面,如man ftpd,man ftpaccess等等,如果需要进 
一步了解它的功能,可以参考联机手册。 
   
  另外一个非常常用的服务器程序是proftpd,详细的资料请自己参考其文档。 
   
   
 
 
-- 
当我越过无尽虚空的时候,我看见星辰的欲望,光荣和毁灭,这是光辉世界的宿命, 
一切的一切,最终必将落入黑暗和虚无。 
所以,我随着星光飞翔,去逃脱必然的终结,也许有一天,我将回到世界的原初, 
等待新的星辰的诞生。 
尘埃是星的起源,星的终结。 
 
 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.112.90.20] 

BBS水木清华站∶精华区