【资料】Linux基础教程 第6章 Intranet
第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,详细的资料请自己参考其文档。