FTP的简介

来源:互联网 发布:java int转0x01 编辑:程序博客网 时间:2024/05/29 13:59

FTP (File transfer protocol) 是相当古老的传输协定之一,他最主要的功能是在伺服器与用户端之间进行档案的传输。 这个古老的协定使用的是明码传输方式,且过去有相当多的安全危机历史。为了更安全的使用 FTP 协定,主要介绍较为安全但功能较少的 vsftpd 这个软体。

1 FTP操作流程以及使用到的端口

FTP 使用了两个连线,分别是命令通道与数据流通道 (ftp-data) 。这两个连线都需要经过三次握手。

1.1 FTP的主动模式

简单的连接流程如下图:
这里写图片描述
1.建立命令通道的连线
如上图所示,用户端会随机取一个大于 1024 以上的端口 (port AA) 来与 FTP 服务器端的 port 21 达成连线, 这个过程当然需要三向交握了!达成连线后用户端便可以透过这个连线来对 FTP 服务器下达指令, 包括查询档名、下载、上传等等指令都是利用这个通道来下达的;

2.通知 FTP 服务器端使用 active 且告知连接的端口号
FTP 服务器端的 21 端口主要用在命令的下达,但是当牵涉到数据流时,就不是使用这个连线了。 用户端在需要资料的情况下,会告知服务端要用什么方式来连线,如果是主动式 (active) 连线时, 用户端会先随机启用一个端口 (图 21.1-1 当中的 port BB) ,且透过命令通道告知 FTP 伺服器这两个资讯,并等待 FTP 服务器的连线;

3.FTP 服务器『主动』向用户端连线
FTP 服务器由命令通道了解用户端的需求后,会主动的由 20 这个端口向用户端的 port BB 连线, 这个连线当然也会经过三向交握啦!此时 FTP 的用户端与服务器端共会建立两条连线,分别用在命令的下达与数据的传递。 而预设 FTP 服务器端使用的主动连线就是 port 20 。

主动连接的服务端与客户端具有防火墙

结构如下图:
这里写图片描述
1.用户与服务器间命令通道的建立:
因为 NAT 会主动的记录由内部送往外部的连线资讯,而由于命令通道的建立是由用户端向服务器端连线的, 因此这一条连线可以顺利的建立起来的;

2.用户与服务器间数据通道建立时的通知:
同样的,用户端主机会先启用 port BB ,并透过命令通道告知 FTP 服务器,且等待服务器端的主动连线;

3.服务器主动连到 NAT 等待转递至用户端的连线问题:
但是由于透过 NAT 的转换后,FTP 服务器只能得知 NAT 的 IP 而不是用户端的 IP(NAT的原理就是记录对应的内外IP+端口和外网IP+端口,此处只知道外网的IP+端口不知道内网的IP+端口) , 因此 FTP 服务器会以 port 20 主动的向 NAT 的 port BB 发送主动连线的要求。 但你的 NAT 并没有启动 port BB 来监听 FTP 服务器的连线啊!

解决方法:
1.使用iptables提供的FTP模块(ip_conntrack_ftp和ip_nat_ftp)
2.客户端使用被动模式

1.2 FTP被动连接的模式

连接过程如下图:
这里写图片描述
1.用户与服务器建立命令通道:
同样的需要建立命令通道,透过三次握手就可以建立起这个通道了。

2.用户端发出 PASV 的连线要求
当有使用数据通道的指令时,用户端可透过命令通道发出 PASV 的被动式连线要求 (Passive 的缩写), 并等待服务器的回应;

3.FTP 服务器启动数据端口,并通知用户端连线:
如果你的 FTP 服务器是能够处理被动式连线的,此时 FTP 服务器会先启动一个端口在监听。 这个端口号码可能是随机的,也可以自订某一范围的端口,端看你的 FTP 服务器软件而定。 然后你的 FTP 服务器会透过命令通道告知用户端该已经启动的端口 (图中的 port PASV), 并等待用户端的连线。

4.用户端随机取用大于 1024 的端口进行连接:
然后你的用户端会随机取用一个大于 1024 的端口来对主机的 port PASV 连线。 如果一切都顺利的话,那麽你的 FTP 资料就可以透过 port BB 及 port PASV 来传送了

如果在客户侧和FTP的服务器端也有NAT,那么防火墙的设置需要牵涉到更深的DMZ技巧。

2 FTP的断点续传

最重要的一点,断点续传需要服务器的支持,这个是必要条件。
传统的FTP SERVER是不支持断点续传的,因为它不支持REST指令,传统的FTP指令(我是指服务器端指令)并不包括REST指令。

客户端要知道使用REST等一系列指令来作断点续传。

看看断点续传的详细过程(FTP SERVER):
首先客户端使用REST指令来告诉FTP SERVER它需要从文件的某个点开始传,接着用STOR或者RETR命令开始传文件,大概的命令的流程如下:

  TYPE   I         200   Type   set   to   I.     PASV         227   Entering   Passive   Mode   (204,48,18,69,98,250)         REST   187392         350   Restarting   at   187392.   Send   STORE   or   RETRIEVE   to   initiate   transfer.         RETR   /pub/audio/pci/maestro-3/win2k/1056.zip         150   Opening   BINARY   mode   data   connection   for   /pub/audio/pci/maestro-3/win2k/1056.zip   (936098   bytes).    

首先使用TYPE命令告诉FTP SERVER使用BINARY模式传送文件;
然后使用PASV命令告诉FTP SERVER使用被动打开模式来传送文件;
接着使用REST 187392指令告诉FTP SERVER要从文件的187392字节开始传送;
最后使用RETR指令来传送文件。

从上面可以看出,这个FTP SERVER支持REST指令,有的FTP SERVER(特别的老的)是不支持这个指令的,这时即使FTP CLIENT支持断点续传也一点用都没有!

支持断点的FTP SERVER:Serv-U FTP,还有一系列的新出现的FTP SERVER;
不支持断点的:IIS4以前版本所带的都不行,IIS5 有,不家可以测试一下,登录进FTP SERVER,然后输入REST 1000命令,看服务器是否认识,认识就是支持断点。

原创粉丝点击