文件传输协议——FTP概述

本篇主要参考FTP协议的维基百科: File Transfer Protocol

FTP(FileTransfer Protocol)是在客户端和服务器之间传输文件的标准网络协议。FTP协议建立在C-S模型之上,在客户端和服务器之间使用单独的控制和数据连接。FTP用户可通过明文登陆协议来认证,通常是以用户名和密码形式,不过在服务器配置允许的情况下,也可以实现匿名连接。为了保护用户名和密码,以及对内容进行加密,FTP通常使用SSL/TLS来保证其安全性,即FTPS,有时也会用另一种不同技术的SSH文件传输协议,即SFTP。

FTP最初的协议是由AbhayBhushan写的,在1971年4月16日发布为RFC 114 。直到1980年,FTP一直都在TCP/IP的前身NCP上运行,后来该协议又先后被TCP/IP版本RFC 765(1980.06)和RFC 959(1985.10)代替,RFC959也就是目前的FTP规范。之后,根据不同的需要,一些被提议的标准分别对RFC 959进行了修正,例如RFC 1579(1994.02)启用了防火墙友好的FTP(被动模式passive mode,后面我们将会提及FTP的主动模式和被动模式),RFC 2228(1997.06)提出了FTP的安全扩展,RFC 2428(1998.09)增加了对IPv6的支持,并定义了一种新的被动模式。

1. 协议概览

1.1 通信与数据传输

FTP可以在主动(active mode)和被动模式(passive mode)上运行,不同的模式建立数据连接的方式有所不同。在两种模式下,都是客户端从一个随机端口N向FTP服务器的命令端口21建立TCP连接。

  • 主动模式:客户端从端口M上侦听服务器发来的数据连接,它通过向服务器发送PORT M命令来通知服务器它正在侦听的端口号。然后服务器从它的数据端口port 20上向客户端(端口M)发起一条数据通道。(S -> C)
  • 被动模式:在客户端被防火墙隔离而无法接收传入的TCP连接时,可以采用FTP的被动模式。在这种模式下,客户端首先通过控制连接(control connection)向服务器发送一个PASV命令,然后接收服务器返回的服务器IP地址和端口号,客户端再在自己的任意端口上向接收到的服务器IP地址和端口号建立数据连接。(C -> S)

服务器的响应由控制连接(control connection)返回,由ASCII编码的3个数字状态码外加一个可选的文本消息组成。数字表示响应的代码,文本是对该响应代码的解释。例如”200”或”200 OK”代表上一条命令成功执行(文章后面有对响应码数字的解释)。通过在控制连接(control connection)上发送一个中断消息可以终止正在数据连接(data connection)上进行的文件传输。

在FTP网络上传输数据时,可以使用4种数据表示形式,分别是:

  • ASCII mode:用于文本。如果需要,数据在发送前会由在主机上的字符表示转换为8比特的ASCII码形式,然后在接收主机端再转换为接收主机的字符表示。因此,该模式不适用于包含纯文本以外的数据的文件传输。
  • Image mode (也称Binary mode):发送方逐字节地发送文件,接收方则接收并存储到达的字节流。目前,Image模式已被推荐在所有FTP实现上支持。
  • EBCDIC mode:用于使用EBCDIC字符集的纯文本在不同主机之间的传输。
  • Local mode:允许两台相同设置的计算机使用专有格式传输数据,而无需转换为ASCII形式。

对于文本文件,FTP提供了不同格式的控制和记录结构选项,这些特性是为了方便包含Telnet或ASA的文件传输而设计的。

FTP数据传输有三种可选的模式,分别是流模式(Stream mode)、块模式(Block mode)和压缩模式(Compressed mode):

  • Stream mode:数据作为连续的流发送,FTP层不需要做任何处理,所有的处理都是通过TCP来完成的。该模式下不需要文件结尾标志(EOF),除非数据被划分为records(一种数据结构)。
  • Block mode:FTP将数据划分为几个block(每个block包含block header,byte count以及data field),然后移交给TCP进行传输。
  • Compressed mode:数据通过简单的压缩算法进行压缩,通常使用游程编码。

有些FTP软件还实现了一种基于DEFLATE的压缩模式,有时也称为“模式Z”,该模式在一个因特网草案中有描述,但尚未标准化。

1.2 Login

FTP使用普通的用户名和密码机制来授权访问。用户名使用USER命令发送至服务器,密码则使用PASS命令发送。该序列在传输线路上是不加密的,因此容易受到网络嗅探的攻击。如果客户端提供的信息被服务器接受,服务器会向客户端发送一个问候语,然后会话开始。如果服务器支持,客户端也可在不提供认证的情况下登陆FTP,但服务器对此类会话只提供受限的访问。

1.3 Anonymous FTP

提供FTP服务的主机也可能提供匿名FTP访问,用户只需要在login时输入一个‘anonymous’账户。虽然用户通常被要求发送他们的email地址代替password,实际上并不会对提供的email地址进行验证。许多以提供软件升级为目的的主机通常会允许匿名登陆。

1.4 NAT与防火墙穿越

一般情况下,在FTP客户端发送PORT命令之后,服务器向客户端发起连接来实现数据传输,但这在NAT和防火墙存在的情况下是有问题的,因为从因特网连接到他们内部的主机是不被允许的。对于NAT,还有一个更麻烦的问题就是,在PORT命令中的IP地址和端口号都是指NAT内部主机的IP地址和端口号,而不是NAT的公共IP地址和端口。

补充一点NAT的概念。NAT即Network Address Translation(网络地址转换)的缩写。当在专有网络内部的一些主机本来已经分配到了本地的IP地址(仅在本专用网络内部使用的专用地址),但又想和因特网上的主机通信时,可使用NAT方法。这种方法需要在专用网络连接到互联网的路由器上安装NAT软件,即NAT路由器,它至少有一个有效的外部全球IP地址(公共IP)。这样,所有本地地址的主机在和因特网通信时,都要在NAT路由器上将其转换成公共IP地址。通过这种使用少量的公有IP地址代表较多的私有IP地址的方式,也有助于减缓可用的IP地址空间的枯竭。

目前有两种方法来解决以上提到的问题。第一就是,使用FTP的被动模式,即发送PASV命令,使连接从客户端向服务器发起,而不是从服务器向客户端发起,这种方法是目前的FTP客户端广泛采用的。另一种方法是,NAT通过使用应用程序级网关去修改PORT命令的值。

1.5 与HTTP的不同之处

HTTP本质上解决了FTP传输许多小而短的网络内容不方便的问题。

FTP通过一个有状态的控制连接(control connection)来维护当前的工作目录和其他flags,而数据传输需要另起一路连接(data connection)来实现。在被动模式下,data connection是由客户端向服务器发起的,而在默认的主动模式下,data connection则是由服务器向客户端发起。在主动模式下的这种明显的角色转换,以及所有传输都使用随机端口号,使得FTP在穿越防火墙和NAT时非常困难。相反,HTTP是无状态协议,并且控制和数据都被复用在一个从客户端到服务器的单一连接上,使用熟知端口,使得HTTP能够很容易穿透NAT网关和防火墙。

由于发送命令并等待接收响应的所需的往返时间,使得建立FTP连接的速度很慢,因此,一贯的处理是,建立起一条控制连接后即保持该连接的开放状态,该控制连接可用于多个文件的传输控制,而不是在多个文件之间反复地关闭并重建会话。相比之下,HTTP在最初的实现中,每当传输完一个文件(或其他数据)后,都会关闭连接,虽然后来HTTP也支持了重用一个TCP连接实现多次传输的功能,但其基本的概念模型仍然是独立的请求而非会话。

当FTP在数据连接上传输数据时,控制连接处于空闲状态,如果传输时间过长,防火墙或NAT会认为控制连接已断开而停止跟踪,从而使得文件下载中断。而HTTP连接仅在多个请求之间处于空闲态,因此在超时后将该连接断开是正常的,也是合理的。

2. Web浏览器支持

大多通用浏览器都能检索FTP服务器上的文件,虽然他们可能不支持FTP的扩展协议如FTPS。用Web访问给定的FTP URL时显示的远程服务器上内容与其他的网站内容很相似。例如,在火狐浏览器上运行的一个全功能FTP客户端称为FireFTP。

FTP URL的形式为:ftp://[user[:password]@]host[:port]/url-path,方括号内的部分可选。例如,ftp://public.ftp-servers.example.com/mydirectory/myfile.txt 表示服务器public.ftp-servers.example.com上目录mydirectory 下的文件myfile.txt 。ftp://user001:[email protected]/mydirectory/myfile.txt 则在上面的基础上添加了访问该FTP地址的用户名和密码。默认情况下,大多web浏览器都使用PASV模式,方便终端用户穿越防火墙。

3. 安全

FTP没有被设计为一个安全协议,存在许多安全方面的弱点。在1999年5月,RFC 2577的作者列出了以下的安全漏洞:

  • 暴力破解 (Brute force attack)
  • FTP跳转攻击 (FTP bounce attack)
  • 数据包捕获 (Packet capture)
  • 端口窃取 (Port stealing,猜测下一个打开的端口并窃取合法连接)
  • IP欺骗攻击 (Spoofing attack)
  • 用户名枚举 (Username enumeration)

FTP不对其传输内容加密;所有的传输都是明文的,用户名、密码、命令和数据可以被在互联网上进行数据包捕获(网络嗅探)的任何人读取。这个问题普遍存在于在加密机制(如TLS、SSL等)被创造出来之前设计的网络协议,如SMTP、Telnet、POP和IMAP。常用的解决方案包括:

  • 使用非安全协议的安全版本,如用FTPS代替FTP、TelnetS代替Telnet;
  • 使用另外的能够处理同样工作的更安全的协议,如SSH文件传输协议(SSH File Transfer Protocol)或安全复制协议(Secure Copy Protocol);
  • 使用安全隧道,如Secure Shell (SSH)或虚拟专用网络(VPN)。

3.1 FTP over SSH

FTP over SSH是在Secure Shell隧道连接上传输正常FTP会话的一种做法。由于FTP使用多个TCP连接,在SSH隧道上传输是相当困难的。许多SSH客户端试图在控制通道上建立隧道,但这样仅能保护该控制通道;当数据传输时,两端的FTP软件为数据通道建立新的连接,因而数据连接上没有机密性和完整性保护。另外一种更安全的实现方式是,SSH客户端软件有足够的FTP协议知识,以监测并重写FTP控制通道消息,并自动为数据通道建立新的分组转发。支持该模式的软件包有:SSH通信安全软件套件Tectia ConnectSecure (Win/Linux/Unix)。

4. 派生协议

4.1 FTPS

FTPS有显式和隐式两种。显示FTPS (Explicit FTPS)为FTP标准的扩展,允许客户端请求会话加密。该功能通过发送“AUTH TLS”命令实现。服务器提供两种选项,可允许或拒绝未请求TLS的连接。该扩展协议定义在 RFC 4217中。隐式FTPS (Implicit FTPS)是一个过时的FTP标准,需要使用SSL或TLS连接,并且指定区别于普通FTP的端口,默认的控制连接端口号为990,数据连接端口号为989。

4.2 SSH文件传输协议 (SSH File Transfer Protocol)

SSH文件传输协议(SFTP)有一个与FTP类似的用户命令集,但使用SSH协议来传输文件。与FTP不同,SFTP对命令和数据都做加密,防止密码和敏感信息在网络上的公开传输。SFTP软件与FTP软件之间不支持互操作。

4.3 普通文件传输协议 (Trivial File Transfer Protocol)

普通文件传输协议(TFTP)是一个简单的、锁步(lock-step)FTP,允许客户端从远程主机下载或向远程主机上传文件。由于实现简单,其最初的用途之一,是用作早期局域网内部传输文件的方式。与鲁棒性更强的文件传输协议(如FTP)对比,TFTP缺乏安全性以及其他高级功能。TFTP在1981年被首次标准化,当前的协议规范见RFC 1350

4.4 简单文件传输协议 (Simple File Transfer Protocol)

简单文件传输协议(SFTP)作为一个TFTP和FTP之间复杂互操作的非安全文件传输协议被提出,其定义见RFC 913。该协议从未被互联网广泛接受,并且已成为历史。该协议运行在端口115上,有一个包含11个命令的命令集,并支持3种数据传输:ASCII模式、二进制模式(binary)和连续模式(continuous)。对于字长为8比特倍数的系统,对binary和continuous两种模式的操作是相同的。该协议也支持使用用户名和密码的登陆,层次化的文件夹与文件管理(包括重命名、删除、上传、下载、覆盖下载、附加下载)。

5. FTP 命令和响应码

FTP命令较多,暂时不列出来,可以参考: List of FTP Command

FTP服务器返回的响应码由三个数字“xyz”组成。第一个数字表示三种可能的响应之一——成功、失败、指示错误或不完整:

  • 2yz — 成功;
  • 4yz / 5yz — 失败;
  • 1yz / 3yz — 错误或不完整。

第二个数字定义了错误的类别:

  • x0z — Syntax,语法错误;
  • x1z — Information,对请求的答复信息;
  • x2z — Connections,对控制连接和数据连接的答复;
  • x3z — Authentication and accounting,对账户鉴权和登陆过程的答复;
  • x4z — Not defined,未定义;
  • x5z — File system,来自服务器文件系统中状态码。

第三个数字用来为第二个数字定义的几类状态提供进一步细化。

更详细的响应码信息可参考:List of FTP server return codes

6. 常用FTP服务器

常用的开源FTP服务器如下:

  • FileZilla Server (Windows)
  • Pure-FTPd (Unix)
  • VsFTPd (Unix)
  • ProFTPd (Unix)

猜你喜欢

转载自blog.csdn.net/DeliaPu/article/details/79499811
今日推荐