一支朝气蓬勃,积极进取,有着丰
富教学管理经验的专职队伍,依托清
华大学,以精品教育、诚信教育为准
则,倡导一切为学员服务的办学理念
   定单式就业培训,定职定岗,并且
为每位学员提供至少10次就业保障.
国内率先推出就业保3年的服务承诺
您的成功,就是我们最大的欣慰。
点击这里给我发消息 阳阳老师 点击这里给我发消息 刘老师 点击这里给我发消息 李老师 点击这里给我发消息 黄老师 点击这里给我发消息 杨老师 点击这里给我发消息 孙老师 点击这里给我发消息 就业咨询老师
  北京市劳动人民文化宫教育培训中心简介

作品名称

架设FTP服务器

系统平台

Windows2003server/RedHat linux8.0

文件大小

100KB

文件字数

15705

文件内容

FTP(File Transfer Protocol)是文件传输协议的简称。
FTP的作用
正如其名所示:FTP的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)察看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。
FTP工作原理
拿下传文件为例,当你启动FTP从远程计算机拷贝文件时,你事实上启动了两个程序:一个本地机上的FTP客户程序:它向FTP服务器提出拷贝文件的请求。另一个是启动在远程计算机的上的FTP服务器程序,它响应你的请求把你指定的文件传送到你的计算机中。FTP采用“客户机/服务器”方式,用户端要在自己的本地计算机上安装FTP客户程序。FTP客户程序有字符界面和图形界面两种。字符界面的FTP的命令复杂、繁多。图形界面的FTP客户程序,操作上要简洁方便的多。简单地说,支持FTP协议的服务器就是FTP服务器,下面介绍一下什么是FTP协议(文件传输协议)
一般来说,用户联网的首要目的就是实现信息共享,文件传输是信息共享非常重要的一个内容之一。Internet上早期实现传输文件,并不是一件容易的事,我们知道 Internet是一个非常复杂的计算机环境,有PC,有工作站,有MAC,有大型机,据统计连接在Internet上的计算机已有上千万台,而这些计算机可能运行不同的操作系统,有运行Unix的服务器,也有运行Dos、Windows的PC机和运行MacOS的苹果机等等,而各种操作系统之间的文件交流问题,需要建立一个统一的文件传输协议,这就是所谓的FTP。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议,这样用户就可以把自己的文件传送给别人,或者从其它的用户环境中获得文件。

与大多数Internet服务一样,FTP也是一个客户机/服务器系统。用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上。客户机程序代表用户接收到这个文件,将其存放在用户目录中。

在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上载"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上载"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上载(下载)文件。

使用FTP时必须首先登录,在远程主机上获得相应的权限以后,方可上载或下载文件。也就是说,要想同哪一台计算机传送文件,就必须具有哪一台计算机的适当授权。换言之,除非有用户ID和口令,否则便无法传送文件。这种情况违背了Internet的开放性,Internet上的FTP主机何止千万,不可能要求每个用户在每一台主机上都拥有帐号。匿名FTP就是为解决这个问题而产生的。

匿名FTP是这样一种机制,用户可通过它连接到远程主机上,并从其下载文件,而无需成为其注册用户。系统管理员建立了一个特殊的用户ID,名为anonymous, Internet上的任何人在任何地方都可使用该用户ID。

通过FTP程序连接匿名FTP主机的方式同连接普通FTP主机的方式差不多,只是在要求提供用户标识ID时必须输入anonymous,该用户ID的口令可以是任意的字符串。习惯上,用自己的E-mail地址作为口令,使系统维护程序能够记录下来谁在存取这些文件。

值得注意的是,匿名FTP不适用于所有Internet主机,它只适用于那些提供了这项服务的主机。当远程主机提供匿名FTP服务时,会指定某些目录向公众开放,允许匿名存取。系统中的其余目录则处于隐匿状态。作为一种安全措施,大多数匿名FTP主机都允许用户从其下载文件,而不允许用户向其上载文件,也就是说,用户可将匿名FTP主机上的所有文件全部拷贝到自己的机器上,但不能将自己机器上的任何一个文件拷贝至匿名FTP主机上。即使有些匿名FTP主机确实允许用户上载文件,用户也只能将文件上载至某一指定上载目录中。随后,系统管理员会去检查这些文件,他会将这些文件移至另一个公共下载目录中,供其他用户下载,利用这种方式,远程主机的用户得到了保护,避免了有人上载有问题的文件,如带病毒的文件。

作为一个Internet用户,可通过FTP在任何两台Internet主机之间拷贝文件。但是,实际上大多数人只有一个Internet帐户,FTP主要用于下载公共文件,例如共享软件、各公司技术支持文件等。 Internet上有成千上万台匿名FTP主机,这些主机上存放着数不清的文件,供用户免费拷贝。实际上,几乎所有类型的信息,所有类型的计算机程序都可以在Internet上找到。这是Internet吸引我们的重要原因之一。匿名FTP使用户有机会存取到世界上最大的信息库,这个信息库是日积月累起来的,并且还在不断增长,永不关闭,涉及到几乎所有主题。而且,这一切是免费的。

匿名FTP是Internet网上发布软件的常用方法。Internet之所以能延续到今天,是因为人们使用通过标准协议提供标准服务的程序。像这样的程序,有许多就是通过匿名FTP发布的,任何人都可以存取它们。Internet中的有数目巨大的匿名FTP主机以及更多的文件,那么到底怎样才能知道某一特定文件位于哪个匿名FTP主机上的那个目录中呢?这正是Archie服务器所要完成的工作。Archie将自动在FTP主机中进行搜索,构造一个包含全部文件目录信息的数据库,使你可以直接找到所需文件的位置信息。

文件传输协议(File Transfer Protocol, FTP)

1. 介绍

FTP的目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。虽然我们也可以手工使用它,但是它的主要作用是供程序使用的。在阅读本文之前最好能够阅读TCP协议标准规范和Telnet协议标准规范。

2. 概览

在本节中我们将讨论一些表面上的问题,有些名词的定义请参阅TCP和Telnet参考文献。我们先介绍一下(1)字节大小,在FTP中字节大小有两个:逻辑字节大小和用于传输的字节大小。后者通常是8位,而前者可不一定是多少了。传输字节不必等于逻辑字节大小,也不必对数据结构进行解释。(2)控制连接是建立在USER-PIT和SERVER-PI之间用于交换命令与应答的通信链路。(3)数据连接是传输数据的全双工连接。传输数据可以发生在服务器DTP和用户DTP之间也可以发生在两个服务器DTP之间。(4)DTP:数据传输过程(DTP)建立和管理数据连接,DTP可以是主动的也可以是被动的。(5) EOR代表记录尾。(6)NTV代表网络虚拟终端,它的定义与在Telnet协议中的定义一致。(7)NVFS代表网络虚拟文件系统。(8)FTP可以传输非连续的文件,这些文件的一部分称为页。(9)PI代表协议解释器。(10)服务器DTP代表一种传输过程,它通常处于“主动”状态,它和侦听端口建立数据连接,它还可以为传输和存储设置参数,并根据PI的指令传输数据。当然,DTP也可以转入“被动”状态。(11)服务器FTP进程,它是和用户FTP 进程一起工作的,它由PI和DTP组成。至于用户FTP进程则是由PI,DTP和用户接口组成的。下图是FTP服务示意图:
bs


注意:数据连接是双向的,它不用整个时间都存在。上图中用户PI开始控制连接,控制连接与Telnet协议很象。在开始阶段,标准FTP命令由用户PI产生并通过控制连接传送到服务器进程。服务器PI向用户PI返回标准应答。FTP命令指定数据连接参数和文件系统操作。用户DTP在特定数据端口侦听,服务器开始数据连接并以指定的参数开始数据传输。数据端口不必在开始FTP命令的机器上,但用户或用户FTP进程必须确定它在指定的数据端口上侦听。这个数据连接是全双工的。

在另外一种情况下,用户或许希望在两个主机间传送文件,不是两个本地主机。用户在两台主机间建立控制连接,然后规划数据连接。用这种方式,控制信息由用户PI获得,但是数据在服务器DTP之间传送。下面就是一个例子:

协议要求数据传输在处理时打开控制连接。在完成FTP服务后由用户中止控制连接,而服务器具体操作。如果在未接收命令时关闭了控制连接,服务器也会关闭数据传输。FTP和Telnet很有联系,FTP使用Telnet协议进行控制连接,可有两种方法达到目的:用户PI或服务器PI可以在自己的过程中实现 Telnet协议的功能;第二种方法是利用系统中现有的Telnet模块。实现上,FTP对Telnet协议的依赖也不多,即使重新实现,代码量也不大。

3. 数据传输功能

数据连接只传输数据,控制连接传送命令和响应。几个命令是关于在主机间传输数据的,数据传输基本上独立于物理结构的,但是如果在压缩传输模式下流式传输与文件结构有关,文件的属性与表示类型有关。

3.1. 数据表示与保存

数据是在主机间的存储设置间传送的。因为两个系统的数据存储方式不同,因此需要对它进行转换,在传送文本时会有对ASCII表示的问题,在进行二进制传送的时候,会有不同系统对字节长度规定不同的问题,有的系统是7位,有的系统可能是32位,这也需要进行转换。需要提供数据表示与传输模型函数,但是FTP提供这方面的功能不多,超过FTP提供功能的那一部分要用户自己实现。

3.1.1. 数据类型

数据表示是由用户指定的表示类型,它可以是隐含的,也可以是用户指定的。请一定注意:逻辑字节长度与物理字节长度是不同的。

3.1.1.1. ASCII类型

这是所有FTP必须实现的默认类型,用于传送文本文件,当在主机间使用EBCDIC传送时更方便,则不使用ASCII类型。发送方将内部表示转换为NVT- ASCII格式,接收方则进行相反的过程接收数据。根据NVT标准,要在行结束处使用序列。NVT-ASCII是8位的。ASCII和EBCDIC的格式参数在下面讨论。

3.1.1.2. EBCDIC类型

它是作为ASCII的另一种方法在主机间传送数据的数据类型。EBCDIC和ASCII很象,仅在类型的功能描述上有一些差别。行结束符使用很少。

3.1.1.3. 图象类型

在此类型下传送的数据被看作连续的位,发送方将数据打包到8位传输字节中传送。因为结构的需要要对传送数据进行填充,填充字节全部为0,填充必须在文件结构时使用,而且要标记出以便接收方过滤掉。它用于传送二进制数据和有效地传送和存储文件,因此所有FTP也必须实现。

3.1.1.4. 本地类型

也可以以十进制指定逻辑字节大小。如果物理字节大小和逻辑字节大小不同,直接将物理数据打包为逻辑字节,不用什么填充。接收方根据逻辑字节大小进行和本机的存储特点进行转换。传输必须是可重复的,也就是说,相同的文件相同的参数,那内容必须是一样的。

3.1.1.5. 格式控制

ASCII 和EBCDIC有一个可选参数,它说明文件垂直格式控制,下面的数据表示类型在FTP中有定义。字符文件可能有三种用途,打印,存储或留待以后处理。如果是用于打印,那主机必须知道垂直格式控制的表示,如果存储或等以后处理,也需要保留文件格式。如果在远程主机上处理完后传输回本地主机,要保证远程主机处理时没有麻烦。这都需要在ASCII和EBCDIC格式上加入新的参数。

3.1.1.5.1. NON PRINT

未指定第二个参数是它是默认值。它必须为所有FTP接受。如果传输的文件是用于打印的,则使用边界和间隔的默认值。通常它不用于打印目的,而用于保存文件或执行文件。

3.1.1.5.2. TELNET格式控制

文件包括ASCII/EBCDIC垂直格式控制,这些控制字符可以使打印正常进行。

3.1.1.5.3. CARRIAGE CONTROL (ASA)

文件包含ASA (FORTRAN)垂直格式控制字符。在以ASA标准形成的行中,第一个字符不打印,它用于决定打印前的走纸量。下面是定义了的ASA字符:

blank: 向下移动1行;0:向下移动2行;1:移动至下一页;+:不移动

打印机必须能够决定结构体的结束。如果文件本身有记录结构就没有问题,如果没有,用于区别打印行,但这些格式标记已经由ASA控制字符使用了。

3.1.2. 数据结构

除了有不同的数据类型外,FTP还允许有不同的文件结构,下面是三种文件结构:文件式结构:文件中没有内部结构,文件被看作是二进制流;记录结构:文件是由一系列记录组成的;页结构:文件是由不同的索引页组成的。

如果未使用STRU命令,文件结构是默认值。文件的结构会影响传输模型,存储和数据表示。文件本来的属性和保存它的主机有关,不同的机器会以自己的方式保存文件。在不同主机间传送文件时必须使主机能够识别相互的表示。有些主机上的文件是面向字节的,有些是面向记录的,在传送时就会出现问题。那就要在接收方进行内部转换。在进行转换的时候,需要区别记录的边界,在ASCII中使用,在EBCDIC中使用作为分隔符。采用这种实现方法的必须保证转换是可逆的。

3.1.2.1. 文件结构

如果未使用STRU命令,文件结构是默认值。文件结构中没有默认值,文件被看作是连续的字节串。

3.1.2.2. 记录结构

对于文本文件,记录结构必须是所有FTP实现必须有的。记录结构文件是由连续的记录构成的。

3.1.2.3. 页结构

文件是非连续时使用页结构。这种文件称为随机访问文件。这些文件中有时会的和文件整体或部分相关的信息出现。在FTP中,文件的一个部分称为页。为了提供不同的页大小和相关信息,每页都带页头发送。页头中有如下域:

头长度

包括此字节的页头长度,单位为字节,最小长度为4

页索引

指出此部分在原文件中的位置,它和传输编号不是一回事

数据长度

页数据中的逻辑字节数,最小值为0

页类型

页的类型有以下几种:0=未页,指示传输结构,包头必须为4,数据长度必须为0;1=通常页,没有控制信息的通常页文件的普通类型;2=描述子页,用于传送整体文件的描述信息;3=访问控制页,包括页级访问控制信息的页文件头域,包头长度必须为5

可选域

提供每页的控制信息

所有域均以1个逻辑字节长度为大小,逻辑字节长度由TYPE命令指定。如果读取版本与和开始版本号一致,文件访问时必须以相同的参数进行。如果参数相同,FTP实现要保证取得的文件内容是相同的。

3.2. 建立数据连接

传送数据机制包括建立连接选择数据参数。用户和服务器DTP有默认数据端口。用户进程默认数据端口和控制连接端口相同。服务器进程默认数据端口和控制连接端口相邻。传输字节大小是8位字节。此字节是实际传输字节,但不代表主机内的数据表示。被动数据传输进程在数据端口接收数据,FTP请求命令决定数据传输的方向。服务器在接收到请求以后,将初始化端口的数据连接。当连接建立后,传输在DTP之间传送,服务器PI对用户PI返回应答。FTP实现运行一个默认数据端口,用户PI才能改变默认端口。

通过PORT命令可能改变端口,用户可能希望数据在第三方主机上进行其它操作,用户PI需要在两个服务器PI上建立连接。一个服务器被告知侦听另一服务器的请求。用户PI通过PORT命令通知另一服务器的数据端口。最后双方发送相应的传送命令。通常,服务器负责支持数据连接,初始化并关闭它,除非用户DTP在传输模式下要求关闭连接。服务器在下面情况下关闭数据连接:

1. 服务器结束发送数据,通过EOF要求中止传送;

2. 用户发送ABORT命令;

3. 用户改变端口;

4. 控制连接关闭;

5. 发生不可恢复错误。

3.3. 数据连接管理

默认数据连接端口:所有FTP必须支持默认数据连接,只有用户PI能够初始化非默认端口的使用。

确定非默认数据端口:用户PI可以使用PORT命令指定非默认端口,它要求服务器方以PASV确定非默认数据端口。连接是由双方地址确定的,因此改变一方地址就改变了连接。

数据连接的重用:在使用流式数据传输模型时,文件结束通过关闭连接指示。如果要传送多个文件时就会出麻烦,解决的方法有两个,一个是确定非默认端口,另一个是使用另一种传输模式。就传输模式而言,流传输模式是不安全的,因此无法确定连接是暂时还是永久关闭。其它传输模式不通过关闭连接表示文件结构,它们可以通过FTP命令决定传送结构。因此使用这些传输模式可以在保持连接的情况下传送多个文件。

3.4. 传输模式

有三种传输模式:一种将数据格式化并考虑重新开始过程;一种压缩数据;一种是不经过处理(少量处理)传送。所有数据传输必须以一个EOF结束,它可以显式给出,也可以通过关闭连接隐式给出。对于记录文件,所有EOR是显式的,包括最后一个记录。对于以页结构传送的文件,使用“最后一页”表示结束。从这里开始,下文中我们提到的字节指的是“传输字节”。

为了进行标准化传送,传送主机必须把行结束或记录结束的内部表示转化为传输模式和文件结构指定的形式传送,接收方则进行相反的工作。IBM大型机的记录计数域可能不能为其它主机识别,所以记录结束标记在流模式下以双字节控制码传送,在块或压缩模式下以标记位传送。而ASCII或EBCDIC的行结束则则或指示。这样的转换需要时间,所以相同的系统在传送文本文件时采用二进制或流表示比较合适。下面是 FTP定义的传输模式:

3.4.1. 流模式

数据以字节流的形式传送。使用的表示类型没有限制,允许记录结构。在记录结构文件EOR和EOF表示为双字节控制码。第一字节全为0,后一字节为转义字符。当第二位值为1时表示EOR,为2时表示EOF,如果要同时表示EOR和 EOF,值为3。全1字节作为数据发送时必须使用双字节传送,其中数据保存在第二个字节内。如果是文件结构,通过发送方关闭连接表示EOF,接收到的所有数据就是文件内容。



3.4.2. 块模式

文件以块形式传送,块带有自己的头部分。头字节包括计数域和描述子代码。计数域说明了数据块的字节数,描述子代码定义了以下内容:EOF,EOR重新开始标记或怀疑错误数据。怀疑错误数据不是为了进行差错控制,它是为了站点间交换特定数据,传送时不管本地错误(如硬盘错误)而只管传送,但是传送时可要指出,这个数据可能有错。在此模式下可以使用记录结构,也可以使用相应的数据表示。头字节的结构如下图所示:

描述子 8位

字节计数 16位

描述子代码由在描述子字节中的位标记说明,下面是已经指定的四种代码及其意义:

代码

意义

128

数据块结束是EOR

64

数据块结束是EOF

32

数据块内有怀疑错误

16

数据块是重新开始标记





以这种编码,对于特定块可能存在多个描述子编码条件,所需要的位必须全部设置。重新开始标记包括在数据流中,它作为8位整数代表在控制连接上使用语言的可打印字节,但不得出现在其中。例如要传送6字节标记,下面就是例子:



Descrptr code = 16

Byte count = 6



Marker 8位

Marker 8位

Marker 8位



Marker 8位

Marker 8位

Marker 8位

3.4.3. 压缩模式

有三种信息需要传送:常规数据以字节串传送;压缩数据,包括复本和过滤器;控制信息,以两个转义字符传送。如果有N(>0但小于127)个常规数据传送,在数据前一位加上一个字节,这个字节最高位为0,其它位表示的数值等于N。如下图:

若要压缩一个数据位D的N复本字符串,用两个字节传送,如下图,它表示的是压缩的字节:

一串N过虑器字节可以压缩为一个字节,而过滤器字节根据表示法不同而不同。如果类型是ASCII或EBCDIC,过滤器字节是,如果是图象或本地类型,则是0。下面就是过滤器字节:

转义序列是双字节,头一个全0,后一个内是定义于块模式下的描述子代码。描述子代码与块模式中的意义相同,它作用于其后串中的字节。而压缩模式对于增加带宽有好处(因为数据是压缩过的)。

3.5. 差错恢复和重新开始

位丢失和数据错误是这一层的差错控制由TCP负责。而重新开始则是给用户一个处理系统(包括操作系统,网络等)失败的方法。重新开始过程仅适用于块和压缩模式,它要求发送者在数据流中加入特定标记,标记仅对传送者有意义,但其中的内容是控制连接使用的语言。标记可以代表一个位记数,记录记数或可以标记数据数目的任何点。如果接收方也支持重新开始,将会在接收系统中保存这一标记。在系统失败重新启动后,用户可以根据原来的标记重新开始数据传送,也就是我们通常熟悉的断点续传过程。接收方接收到一段数据,然后记下一点,如果发送方失败了,就从这一点以后再传送相应的数据。具体的这里不多说了。

 

主要技术手 段

用Linux架设FTP服务器
使用文件传输协议(FTP)来通过网络在计算机之间传输文件是很普遍的一种方法。几乎在所有的平台上面都有FTP 的客户端和服务端的软件,因此用FTP来传送文件也是很方便的一个方法。本文介绍配置
使用文件传输协议(FTP)来通过网络在计算机之间传输文件是很普遍的一种方法。几乎在所有的平台上面都有FTP 的客户端和服务端的软件,因此用FTP来传送文件也是很方便的一个方法。
有很多配置FTP服务器的不同方法。其中一种是把FTP配置成只对系统中的用户开放的私有服务器,这也是FTP的默认配置。一个私有的FTP服务器只运行系统中的用户访问,而且可以对用户进行访问控制,这样可以给予或拒绝特定用户的访问权限。
另一种是把FTP服务器配置成匿名服务器。匿名FTP服务器允许任何人(不管有没有帐号)访问服务器并传输文件。因为可能存在潜在的安全问题,必须小心配置使得只允许访问系统中特定的目录。 在这一节里,我们把FTP配置成“chrooted”的方式,这种配置运行用户访问,例如:Web站点的目录,但是不允许他们访问更高一层的目录。
注意事项
下面所有的命令都是Unix兼容的命令。
源路径都为“/var/tmp”(当然在实际情况中也可以用其它路径)。
安装在RedHat Linux 6.1下测试通过。
要用“root”用户进行安装。
wu-ftp的版本号是2.6.0。
编译和安装
把软件包(tar.gz)解压缩:
[root@deep]# cp wu-ftpd-version.tar.gz /var/tmp

[root@deep]# cd /var/tmp

[root@deep]# tar xzpf wu-ftpd-version.tar.gz
编译和优化
转到wu-ftpd的新目录下,运行下面的命令:
编辑“ftpcount.c”文件(vi +241 src/ftpcount.c),改变下面这一行:
#if defined (LINUX)
改为:
#if defined (LINUX_BUT_NOT_REDHAT_6_0)
编辑“pathnames.h.in”文件(vi +42 src/pathnames.h.in),改变下面这一行:
#define _PATH_EXECPATH "/bin/ftp-exec"
改为:
#define _PATH_EXECPATH "/usr/bin/ftp-exec"
我们把“ftp-exec”从“/bin”目录改到“/usr/bin”目录下。
先设置编译器的编译参数:
CC="egcs"

CFLAGS="-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-

pointer -fno-exceptions"

./configure

--prefix=/usr

--sysconfdir=/etc

--localstatedir=/var

--disable-dnsretry

--enable-quota

--enable-pam

--disable-daemon

--disable-newlines

--disable-virtual

--disable-plsm

--disable-pasvip

--disable-anonymous

--enable-ls

--enable-numericuid
这些编译参数告诉编译器如何编译wu-ftpd:
不要用失败的DNS查询
加入对定额(QUOTA)的支持(如果OS支持)
加入对PAM的支持
不允许作为单独的daemon运行
删除过多的空行
不支持虚拟服务器
禁止PID加锁睡眠消息(用于繁忙的站点)
被动连接的时候不要求用同样的IP
不允许匿名ftp访问
使用内部的“ls”命令(试验性的)
内部的“ls”命令显示UID而不显示用户名(为了提高速度)
用下面的命令编译和安装软件:
make

make install

install -m 755 util/xferstats /usr/sbin

touch /var/log/xferlog

chmod 600 /var/log/xferlog

cd /usr/sbin

ln -sf in.ftpd /usr/sbin/wu.ftpd

ln -sf in.ftpd /usr/sbin/in.wuftpd

strip /usr/bin/ftpcount

strip /usr/bin/ftpwho

strip /usr/sbin/in.ftpd

strip /usr/sbin/ftpshut

strip /usr/sbin/ckconfig

strip /usr/sbin/ftprestart
上面的“make”和“make install”可以配置软件以保证系统中有编译所需要的函数库,然后把所有的源文件都编译成可执行的二进制文件,最后把二进制文件和配置文件安装到相应的目录里。
“install –m”安装“xferstats”程序,用于统计传输了多少文件。“touch”命令为xferstats在“/var/log”目录下创建日志文件。 “chomod”把“xferlog”的权限改为只对超级用户“root”可读和可写。接着,我们为“in.ftpd”二进制文件创建符号链接。最后,用 “strip”命令减小所有二进制文件的大小以提高wu-ftpd的性能。
清除不必要的文件

[root@deep]# cd /var/tmp

[root@deep]# rm -rf wu-ftpd-version/ wu-ftpd-version.tar.gz
“rm”命令删除所有编译和安装wu-ftpd所需要的源程序,并且把wu-ftpd软件的压缩包删除掉。
为FTP站点的用户建立没有shell的帐号

首先,创建一个新的用户,这个用户被允许连接到ftp服务器上。因为要有“chroot”的环境,这个帐号不同于正常的用户帐号,不能受访问限制。“chroot”使用户产生这样的感觉好像自己已经在文件系统的最顶层了。
第一步
用下面的命令在“/etc/passwd”文件中创建用户。对于每个允许访问ftp服务器的新用户都要重复这个步骤。
[root@deep]# mkdir /home/ftp

[root@deep]# useradd -d /home/ftp/ftpadmin/ -s /dev/null ftpadmin > /dev/null 2>&1

[root@deep]# passwd ftpadmin
Changing password for user ftpadmin

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully
第二步
编辑“/etc/shells”文件并加入一个空shell,如:null。这个假的shell可以限制用户对ftp服务器的访问。
[root@deep]# vi /etc/shells
/bin/bash

/bin/sh

/bin/ash

/bin/bsh

/bin/tcsh

/bin/csh

/dev/null This is our added no existent shell
第三步
现在编辑“/etc/passwd”文件,手工加上“/./”把“/home/ftp”目录和“/ftpadmin”目录分开,用户 “ftpadmin”会自动转到(chdir)“/ftpadming”目录下。在“passwd”文件中每添加一个ftp用户都要重复这个步骤。
编辑“passwd”文件(vi /etc/passwd),把下面这一行改为:
ftpadmin:x:502:502::/home/ftp/ftpadmin/:/dev/null
改为:
ftpadmin:x:502:502::/home/ftp/./ftpadmin/:/dev/null
帐号为“ftpadmin”,这这个帐号的家目录有一些奇怪。第一部分“/home/ftp/”表示“chroot”时作为根目录的目录。被点号分开的 “/ftpadmin”表示当登录ftp服务器的时候会自动转到这个目录。“/dev/null”这个空shell不允许“ftpadmin”像正常用户那样登录。经过这些改变,“ftpadmin”用户用的不是真正的shell而是伪shell,这样访问ftp服务器就受到限制。创建一个“chroot”用户环境

先要创建一个简单的根文件系统(root file system),包含有足够的文件,如果二进制程序、口令文件,等等。当用户登录的时候,Unix就可以改变根文件系统(chroot)。注意一下,如果编译的时候象上面那样加上“--enable-ls”参数,“/home/ftp/bin”和“/home/ftp/lib”两个目录就可以不要了,因为 WU-FTP会用自己带的“ls”。不过我们还是介绍一下旧的方法,也就是把“/bin/ls”拷贝到“/home/ftp/bin”(chroot之后就是“/bin”)目录下,然后把相关的运行库拷贝到“/home/ftp/lib”目录下。
第一步

创建改变根文件系统(chrooted)环境所需要的所有的目录:
[root@deep]# mkdir /home/ftp/dev

[root@deep]# mkdir /home/ftp/etc

[root@deep]# mkdir /home/ftp/bin (require only if you are not using the “--enable-ls” option)

[root@deep]# mkdir /home/ftp/lib (require only if you are not using the “--enable-ls” option)
第二步

把新目录的权限设成0511:
[root@deep]# chmod 0511 /home/ftp/dev

[root@deep]# chmod 0511 /home/ftp/etc

[root@deep]# chmod 0511 /home/ftp/bin (require only if you are not using the “--enable-ls” option)

[root@deep]# chmod 0511 /home/ftp/lib (require only if you are not using the “--enable-ls” option)
上面这些“chmod”命令把chrooted之后的“dev”、“etc”、“bin”和“lib”目录设置成超级用户“root”可读、可执行,用户组和所有用户可执行。
第三步

把“/bin/ls”文件拷贝到“/home/ftp/bin”目录下,并把“ls”的权限改为0111(不运行用户改变这个文件)。
[root@deep]# cp /bin/ls /home/ftp/bin (require only if you are not using the “--enable-ls” option)

[root@deep]# chmod 0111 /bin/ls /home/ftp/bin/ls (require only if you are not using the “--enable-ls” option)
第四步

找到“ls”程序所需的共享库:
[root@deep]# ldd /bin/ls (require only if you are not using the “--enable-ls” option)
libc.so.6 => /lib/libc.so.6 (0x00125000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)
把共享库拷贝到“/home/ftp/lib”目录下:
[root@deep]# cp /lib/libc.so.6 /home/ftp/lib/ (require only if you are not using the “--enable-ls” option)

[root@deep]# cp /lib/ld-linux.so.2 /home/ftp/lib/ (require only if you are not using the “--enable-ls” option)
注意:如果想用Linux的“ls”程序而不是用WU-ftpd自带的“ls”(编译时加上“--enable-ls”参数),才需要第三和第四步。
第五步

创建“/home/ftp/dev/null”文件:
[root@deep]# mknod /home/ftp/dev/null c 1 3

[root@deep]# chmod 666 /home/ftp/dev/null
第六步

把“group”和“passwd”文件拷贝到“/home/ftp/etc”目录下,然后再改变这两个文件。
[root@deep]# cp /etc/passwd /home/ftp/etc/

[root@deep]# cp /etc/group /home/ftp/etc/
编辑“passwd”文件(vi /home/ftp/etc/passwd)把除了“root”和允许使用ftp的用户之外的所有其它项删掉。这对于改变根文件系统的环境很重要,改变之后的“passwd”文件会是象下面这样的:
root:x:0:0:root:/:/dev/null

ftpadmin:x:502:502::/ftpadmin/:/dev/null
编辑“group”文件(vi /home/ftp/etc/group),把除了“root”和允许使用ftp的用户之外的所有其它项删掉。改变之后的“group”文件会是象下面这样的:
root:x:0:root

ftpadmin:x:502:
配置

可以到这去下载“floppy.tgz”文件:http: //pages.infinit.net/lotus1/doc/opti/floppy.tgz。把“floppy.tgz”文件解开之后,可以在相应的目录下发现我们在这本书中介绍的所有软件的配置文件。这样就没有必要手工重新生成这些文件,或者用拷贝粘贴的方法把它们粘贴到配置文件中去。不管是打算自己动手生成配置文件还是拷贝现成的,你都要学会自己修改配置文件并且把配置文件拷贝到正确的目录下。下面将具体说明。
为了运行FTP服务器,必须创建或者把下面的文件拷贝到相应的目录下:
把“ftpaccess”文件拷贝到“/etc”目录下

把“ftpusers”文件拷贝到“/etc”目录下

把“ftphosts”文件拷贝到“/etc”目录下

把“ftpgroups”文件拷贝到“/etc”目录下

把“ftpconversion”文件拷贝到“/etc”目录下

把“ftp”文件拷贝到“/etc/pam.d”目录下

把“ftpd”文件拷贝到“/etc/logrotate.d”目录下
可以把“floppy.tgz”解压之后,找到上面列出来的文件,并拷贝到相应的目录下,或者用拷贝粘贴的方法从本书中直接粘贴出。
配置“/etc/ftpaccess”文件

“/etc/ftpaccess”文件是用来配置“ftpd”的。这个文件主要是设置允许哪个用户、多少用户访问ftp服务器,以及一些安全方面的问题。配置文件的每一行或者定义一个属性或者设定一个属性值,。对于非匿名的“chroot”访问,必须创建一些“guestgroup”,每一个都要对应“/home/ftp/etc/group”文件中的项。
创建ftpaccess文件(touch /etc/ftpaccess),在文件中加入:
class openarch guest 208.164.186.*

limit openarch 20 MoTuWeTh,Fr0000-1800 /home/ftp/.too_many.msg

email admin@openarch.com

loginfails 3

readme README* login

readme README* cwd=*

message /home/ftp/.welcome.msg login

message .message cwd=*

compress yes all

tar yes all

chmod yes guest

delete yes guest

overwrite yes guest

rename yes guest

log commands real,guest

log transfers real,guest inbound,outbound

guestgroup ftpadmin

guestgroup webmaster

# We don‘t want users being able to upload into these areas.

upload /home/ftp/* / no

upload /home/ftp/* /etc no

upload /home/ftp/* /dev no

# We‘ll prevent downloads with noretrieve.

noretrieve /home/ftp/etc

noretrieve /home/ftp/dev

log security real,guest

guest-root /home/ftp ftpadmin webmaster

restricted-uid ftpadmin webmaster

restricted-gid ftpadmin webmaster

greeting terse

Keepalive yes

noretrieve .notar
现在把文件的权限设成600:
[root@deep]# chmod 600 /etc/ftpaccess
下面解释配置文件中的设置:
class
“class”用来定义一个允许访问ftp服务器的用户类别。可以定义任意多的类别(class)。每一个“class”行的格式如下:
class <classname> <typelist> <addrglob>
<classname>是class的名字,<typelist>是允许加到类别(class)中的用户类型,<addrglob>是这个class允许的IP地址范围。
<typelist>中的项是用逗号隔开的,每一个项有三种可能的取值:anonymous、guest或real。anonymous用户是用 anonymous或ftp帐号访问ftp服务器而且只需要访问公用文件的那些用户。guest用户有一些特殊因为他们在系统中没有帐号,但是却又是 guest组的成员。real用户必须在FTP服务器上有帐号,而且需要经过服务器的安全验证。
<addrglob>可以用通配符,例如:“*”表示所有的站点。下面这一行:
class openarch guest 208.164.186.*
表示只有在系统中有自己帐号的guest用户而且IP地址为“208.164.186.*”才能访问ftp服务器。
limit
“limit”根据class和时间范围来限制登录ftp服务器的用户数。“limit”的格式是:
limit <class> <n> <times> <message_file>
其中<class>是受限制的类别(class),<n>表示在这个类别中受到限制的最多用户数,<times>表示“limit”有效的时间段,<message_file>是当达到最大的用户数目的时候,别的用户还想登录时显示的信息。
<times>中的字符串用逗号隔开,每一个字串表示一天。星期一到星期日分别用Mo、Tu、We、Th、Fr、Sa和Su表示,周末也可以用Wk表示。表示时间的小时和分钟之间不要用冒号隔开。“-”用来表示范围。
例如,限制“openarch”这个类别,最多可以有20个用户,访问时间是星期一道星期四全天,星期五从半夜到下午六点。用下面这一行来表示: limit openarch 20 MoTuWeTh,Fr0000-1800 /home/ftp/.too_many.msg
如果一旦达到最大的用户数,还有别的用户想连接ftp服务器,就会把“/home/ftp/.too_mang.msg”中的信息传给用户。
loginfails
“loginfails”设置最多允许的登录失败的次数。可以用下面这一行来表示:
loginfails <n>
<n>表示最多允许的登录失败的次数。例如,只允许失败两次可以这样表示:
loginfails 3
readme
“readme”设置在什么条件下,一旦当前目录中的文件发生了变化需要提醒用户。
这个命令的格式为:
readme <path> <when>
<path>是用来提醒用户的文件的名字(例如:README),<when>设置出现这个提示信息的条件。
<when>可以为下面两种形式:LOGIN或CWD=<dir>。如果为LOGIN,当用户成功登录的时候就会出现提示信息。如果为CWD=<dir>,当用户进入<dir>目录的时候就会有提示信息。
请记住当给匿名(anonymous)用户设置提示信息的路径的时候,这个路径必须是相对于匿名ftp目录。

 

主要特点

作为Internet上的FTP服务器,系统的安全性是非常重要的,这是建立FTP服务器者所考虑的第一个问题。其安全性主要包括以下几个方面
作为Internet上的FTP服务器,系统的安全性是非常重要的,这是建立FTP服务器者所考虑的第一个问题。其安全性主要包括以下几个方面 :

一、 未经授权的用户禁止在服务器上进行FTP操作。

二、 FTP用户不能读取未经系统所有者允许的文件或目录

三、 未经允许,FTP用户不能在服务器上建立文件或目录。

四、 FTP用户不能删除服务器上的文件或目录。

FTP服务器采取了一些验明用户身份的办法来解决上述第一个问题,主要包括以下几个措施:

FTP用户所使用的用户帐号必须在/etc/passwd文件中有所记载(匿名FTP用户除外),并且他的口令不能为空。在没有正确输入用户帐号和口 令的情况下,服务器拒绝访问。

FTP守护进程FTPd还使用一个/etc/FTPusers文件,凡在这个文件中出现的用户都将被服务器拒绝提供FTP服务。服务器管理可以建立"不受 欢迎"的用户目录,拒绝这些用户访问。 只有在服务器的/etc/passwd文件中存在名为"FTP"的用户时,服务器才可以接受匿名FTP连接,匿名FTP用户可以使用"anonymous"或"FTP" 作为用户名,自己的Internet电子邮件地址作为保密字。

为了解决上述安全性的另外三个问题,应该对FTP主目录下的文件属性进行管理,建议 对每个目录及其文件采取以下一些措施:

FTP主目录:将这个目录的所有者设为"FTP",并且将属性设为所有的用户都不可写,防止不怀好意的用户删改文件。

FTP/bin目录:该目录主要放置一些系统文件,应将这个目录的所有者设为"root"(即超级用户),并且将属性设为所有的用户都不可写。 为保证合法用户可显示文件,应将目录中的ls文件属性设为可执行。

FTP/etc目录:将这个目录的所有者设为"root",并且将属性设为所有的用户都不可写。将目录下的group文件和passwd文件的属性设为所 有用户只读属性,并用编辑器将passwd文件中用户加过密的口令删掉。 FTP/pub目录:将这个目录的所有者置为"FTP",并且将它的属性设为所有用户均可读、写、执行。 这样经过设置,既保证了系统文件不被删改,又保证了FTP合法用户的正常访问。

关于ftp服务程序中不安全因素研究
FTP(File Tranfer Protocol)是一种很古老的协议来的了,自unix始就一直有使用的了,FTP因为本身不但可以提供多用户同时下载的功能外,还可以让用户上载文件,在不断的发展中,还可以使用ftp远程执行命令,由于FTP一般需要帐户和密码的,而且对于不同的帐户可提供不同的权限,由于这么多的功能,所以一直至今还是相当流行的。不过,以下我会说说FTP服务程序很 可能出现的安全方面的问题。

FTP的连接一般是有两个连接的,一个是客户程和服务器传输命令的,另一个是数据传送的连接。FTP服务程序一般会支持两种不同的模式,一种是Port模式,一种是Passive模式(Pasv Mode),我先说说这两种不同模式连接方式的分别。

先假设客户端为C,服务端为S.

Port模式:

当客户端C向服务端S连接后,使用的是Port模式,那么客户端C会发送一条命令告诉服务端S(客户端C在本地打开了一个端口N在等着你进去数据连接),当服务端S收到这个Port命令后,就会向客户端打开的那个端口N进行连接,这种数据连接就生成了。

Pasv模式:

当客户端C向服务端S连接后,服务端S会发信息给客户端C,这个信息是(服务端S在本地打开了一个端口M,你现在去连接我吧),当客户端C收到这个信息后,就可以向服务端S的M端口进行连接,连接成功后,数据连接也建立了。

从上面的解释中,大家应该可以看到两种模式主要的不同是数据连接建立的不同,对于Port模式,是客户端C在本地打开一个端口等服务端S去连接建立数据连接;而Pasv模式就是服务端S打开一个端口等待客户端C去建立一个数据连接。

两种模式看起来其实都是没什么问题,但其实都是隐藏着安全方面的问题的。

对于Port模式,这种模式多是用于因为服务端有防火墙,无法使用Pasv在服务端打开端口让客户端去连接而被逼使用的,但由于连接本身是由服务端本身向外连接的,这本身就存在了一个安全的问题了,因为如果这个连接一旦被hijack,由于连接是由服务器本身向外连的,防火墙将不会有任何动作去处理这个连接。

对于Pasv模式,看起来是比Port模式安全很多不过认真想一想的话,还是会发现它本身的问题的。由于服务端会打开一个端口等客户端去连接,但如果这个打开的端口并没有检测连接的IP是否那个是那个客户端的IP,那么安全问题的出现了。因为有很多FTP服务器打开的数据端口等客户端连接是随机的,但都会在一定范围内的,例如是20000-21000这些端口间。如果FTP服务器并没有在接收数据端口的连接时检测连接过来的 IP是不是已经是合法登陆的用户的话,那么其他并没有登陆的用户就很有机会写程序hijack这个连接了。以下给一个例子说明一下:

服务端S接收到客户端C(IP=12.12.12.12)的命令连接使用的是Pasv模式,服务端S打开了端口20000等待数据连接,在这时,一位黑客(IP=11.11.11.11)扫描了服务端S的20000到20100的端口,发现了20000端口打开了,马上就连接上去服务端S的20000这个端口了。在这情况中,如果服务端S并没有检测11.11.11.11这个IP是不是合法登陆的用户的IP的话,那么真正的客户端C的数据连接就被人 hijack了,如果客户端C发送给服务端S的命令是下载某个文件的话,那么那个文件只会发送到那个黑客中去了。这种情况下,黑客可以是随机扫描并 hijack到不同的连接,或者可以同时对那些端口不停的连接,那么合法用户的连接就会很多被hijack了,hijack后黑客会做什么,那就视乎那位黑客的能力和想做什么了。

解决:

对于Port模式,由于那是FTP本身的问题,所以没有什么解决的好方法。或者可以的话,只是允许Pasv模式而不允许Port模式。

对于Pasv模式,只要在接收到数据连接时检测IP是不是合法用户的请求,就可以避免连接被hijack的问题。

以上hijack连接的都属于比较高级的"黑客"才有机会实现的,因为对于不同的FTP服务程序是有所不同的,而且一般是需要自己先研究过那个FTP服务程序然后再写程序才有可能实现的。以下说说一般用户都可以因为写FTP服务程序对于安全的不注重而进行通过FTP而入侵到系统的问题。

这个问题其实平时都是很常见的了,一般都是对于用户登入FTP后可以跳转到的目录的权限限制问题。

很多用过的FTP程序(最基本的FTP服务,只提供上传,下载,连用户名和密码都不需要那种),如anonymouse ftp(aftp)那类,根本不会限制登陆用户可以跳转到的目录,就是说登入的用户可以随意查看系统不同目录的文件,下载不同目录的文件或者上传文件到任何目录中去的,可以下载任何文件或上传任何文件到任何目录,这问题有多严重,我也不需要说了吧。

有的FTP程序,虽然提供了用户名和密码,但一样没有对于用户可访问目录进行任何限制,xfocus的出品,xftpd就是一个很好的例子,用户登入后,一样是可以上面所说的,用户可 以下载系统任何文件或上传任何文件到任何目录中去的。

有的FTP,就是对于要限制可访问的目录的检测不够全面,导致登入用户可以使用一些特殊的字符而可以访问到限制访问的目录中去。好的一个例子就是旧版的 slimftpd了。这种情况一般称为"Directory Traveling Vulnerability",很多旧版的共享的FTP服务程序都曾存在过这些问题的。

如果你要建立一个FTP服务器,我可以给的建议就是选择一个比较稳定和安全的FTP程序(当然可以考虑自己写的),然后在真正投入使用前对于上面所提及到的安全问题都自己检测一下,如果是自己写的话可以发布些免费版本(不是全功能的)给用户去测试一下,测试没问题后再投入正式使用。

 





4.0版本热招

7月28日  高中定向班  余3人  
8月04日  高中定向班  余2人
8月11日  紧急征急班  热招
8月19日  紧急征急班  热招

网页设计班

8月06日             余5人
8月15日             热招

平面设计班

8月06日             余3人
8月15日             热招

 
待业者为什么选择技能+学…
a 高中同等学历,技能+大专学…
大专生,选择技能+本科学…
家庭经济困难,是否选择……
如何选择一个适合自己的电
交通路线                         常年招聘
Copyright © wooyo.net, All Rights Reserved 北京厚德无限科技发展有限公司&人文大学版权所有,未经同意请勿转载