当前位置:文档之家› FTP主动被动

FTP主动被动

1. FTP的主动模式与被动模式:FTP服务器使用20和21两个网络端口与FTP客户端进行通信.FTP服务器的21端口用于传输FTP的控制命令,20端口用于传输文件数据.FTP主动模式:FTP客户端向服务器的FTP控制端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路;当需要传送数据时,客户端在命令链路上用PORT的命令告诉服务器我开放了某端口,你过来连接我.于是服务器从20端口向客户端的该端口发送连接请求,建立一条数据链路来传送数据.在数据链路建立过程中是服务器主动请求,所以称为主动模式.FTP被动模式:FTP客户端向服务器的FTP控制端口(默认21)发送连接请求,服务器接受连接,建立一条命令链路;当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端,我打开了某端口,你过来连我.于是客户端向服务器的该端口发送连接请求,建立一条数据链路来传送数据.在数据链路建立的过程中是服务器被动等待客户机的请求,所以称被动模式.由上面几点可以看出,FTP服务器的主动与被动模式是以FTP服务器进行数据传送连接的主动或被动为依据的.对于FTP服务器与客户机之间存在的网络防火墙,不论是服务器侧还是客户机侧的网络防火墙设置策略都要保证FTP服务器和客户端之间能够正常建立命令链路和数据链路.主动模式下:客户机与服务器之间建立连接时,客户机是大于1024的端口上,服务器是20 端口。

客户机的端口是大于1024的,而服务器的端口是21 端口接收请求,而是20 端口给客户机回应。

允许FTP客户机从大于1024的端口连接服务器的21端口.允许FTP服务器从21端口回应FTP客户机中大于1024端口的网络连接.允许FTP服务器从20端口主动连接FTP客户机中大于1024的端口允许FTP客户机从大于1024的端口回应来自FTP服务器的20端口的网络连接.被动模式下:客户机与服务器之间建立连接都是在大于1024的端口上的。

客户机的端口是大于1024的,而服务器的端口是21 端口接收请求,而是从大于1024 端口给客户机回应。

允许FTP客户机从大于1024的端口连接服务器的21端口.允许FTP服务器从21端口回应FTP客户机中大于1024端口的网络连接.允计FTP客户机从大于1024的端口连接FTP服务器的大于1024端口.允许FTP服务器从大于1024的端口回应来自FTP客户机大于1024端口的网络连接.2. ftp客户端有主动模式和被动模式是什么意思?2.1 主动FTP主动方式的FTP是这样的:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。

然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。

接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。

2.1.1 支持主动方式FTP的条件:针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:1. 任何端口到FTP服务器的21端口(客户端初始化的连接S<-C)2. FTP服务器的21端口到大于1024的端口(服务器响应客户端的控制端口S->C)3. FTP服务器的20端口到大于1024的端口(服务器端初始化数据连接到客户端的数据端口S->C)4. 大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口S<-C)在第1步中,客户端的命令端口与FTP服务器的命令端口建立连接,并发送命令“PORT 1027”。

然后在第2步中,FTP服务器给客户端的命令端口返回一个"ACK"。

在第3步中,FTP 服务器发起一个从它自己的数据端口(20)到客户端先前指定的数据端口(1027)的连接,最后客户端在第4步中给服务器端返回一个"ACK"。

主动方式FTP的主要问题实际上在于客户端。

FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。

对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。

2.1.2主动FTP的例子下面是一个主动FTP会话的实际例子。

当然服务器名、IP地址和用户名都做了改动。

在这个例子中,FTP会话从(192.168.150.80),一个运行标准的FTP命令行客户端的Linux工作站,发起到(192.168.150.90),一个运行ProFTPd1.2.2RC2的Linux工作站。

debugging(-d)选项用来在FTP客户端显示连接的详细过程。

红色的文字是debugging信息,显示的是发送到服务器的实际FTP命令和所产生的回应信息。

服务器的输出信息用黑色字表示,用户的输入信息用粗体字表示。

仔细考虑这个对话过程我们会发现一些有趣的事情。

我们可以看到当PORT命令被提交时,它指定了客户端(192.168.150.80)上的一个端口而不是服务器的。

当我们用被动FTP时我们会看到相反的现象。

我们再来关注PORT命令的格式。

就象你在下面的例子看到的一样,它是一个由六个被逗号隔开的数字组成的序列。

前四个表示IP地址,后两个组成了用于数据连接的端口号。

用第五个数乘以256再加上第六个数就得到了实际的端口号。

下面例子中端口号就是( (14*256) + 178) =3762。

我们可以用netstat来验证这个端口信息。

testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2Connected to .220 FTP server ready.Name (testbox2:slacker): slacker---> USER slacker331 Password required for slacker.Password: TmpPass---> PASS XXXX230 User slacker logged in.---> SYST215 UNIX Type: L8Remote system type is UNIX.Using binary mode to transfer files.ftp> lsftp: setsockopt (ignored): Permission denied---> PORT 192,168,150,80,14,178200 PORT command successful.---> LIST150 Opening ASCII mode data connection for file list.drwx------ 3 slacker users 104 Jul 27 01:45 public_html226 Transfer complete.ftp> quit---> QUIT221 Goodbye.2.2、被动FTP为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。

这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。

在被动方式FTP中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。

当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >1024和N+1)。

第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。

这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORTP命令给客户端。

然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。

对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:1. 从任何端口到服务器的21端口(客户端初始化的连接S<-C)2. 服务器的21端口到任何大于1024的端口(服务器响应到客户端的控制端口的连接S->C)3. 从任何端口到服务器的大于1024端口(入;客户端初始化数据连接到服务器指定的任意端口S<-C)4. 服务器的大于1024端口到远程的大于1024的端口(出;服务器发送ACK响应和数据到客户端的数据端口S->C)画出来的话,被动方式的FTP连接过程大概是下图的样子:在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。

然后在第2步中,服务器返回命令"PORT2024",告诉客户端(服务器)用哪个端口侦听数据连接。

在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。

最后服务器在第4 步中给客户端的数据端口返回一个"ACK"响应。

被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。

最大的问题是需要允许从任意远程终端到服务器高位端口的连接。

幸运的是,许多FTP守护程序,包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。

详细内容参看附录1。

第二个问题是客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。

例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。

随着WWW的广泛流行,许多人习惯用web浏览器作为FTP客户端。

大多数浏览器只在访问ftp://这样的URL时才支持被动...??的配置。

2.2.1 被动FTP的例子下面是一个被动FTP会话的实际例子,只是服务器名、IP地址和用户名都做了改动。

在这个例子中,FTP会话从(192.168.150.80),一个运行标准的FTP命令行客户端的Linux工作站,发起到(192.168.150.90),一个运行ProFTPd1.2.2RC2的Linux工作站。

debugging(-d)选项用来在FTP客户端显示连接的详细过程。

红色的文字是debugging信息,显示的是发送到服务器的实际FTP命令和所产生的回应信息。

服务器的输出信息用黑色字表示,用户的输入信息用粗体字表示。

注意此例中的PORT命令与主动FTP例子的不同。

这里,我们看到是服务器(192.168.150.90)而不是客户端的一个端口被打开了。

可以跟上面的主动FTP例子中的PORT命令格式对比一下。

testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2Connected to .220 FTP server ready.Name (testbox2:slacker): slacker---> USER slacker331 Password required for slacker.Password: TmpPass---> PASS XXXX230 User slacker logged in.---> SYST215 UNIX Type: L8Remote system type is UNIX.Using binary mode to transfer files.ftp> passivePassive mode on.ftp> lsftp: setsockopt (ignored): Permission denied---> PASV227 Entering Passive Mode (192,168,150,90,195,149).---> LIST150 Opening ASCII mode data connection for file listdrwx------ 3 slacker users 104 Jul 27 01:45 public_html226 Transfer complete.ftp> quit---> QUIT221 Goodbye.2.3、总结FTP主被动下面的图表会帮助管理员们记住每种FTP方式是怎样工作的:2.3.1 主动FTP:命令连接:客户端>1024端口-> 服务器21端口数据连接:客户端>1024端口<- 服务器20端口2.3.2 被动FTP:命令连接:客户端>1024端口-> 服务器21端口数据连接:客户端>1024端口-> 服务器>1024端口2.3.3 主动与被动FTP优缺点的简要总结:主动FTP对FTP服务器的管理有利,但对客户端的管理不利。

相关主题