FTP主动模式与被动模式的解决与原理
来源:转载 日期:6/29/2010 5:23:58 PM

FTP是File Transfer Protocol(文件传输协议)的缩写,用来在两台计算机之间互相传送文件。相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。

FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。

PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
 
概括:
主动模式:服务器向客户端敲门,然后客户端开门
被动模式:客户端向服务器敲门,然后服务器开门
所以,如果你是如果通过代理上网的话,就不能用主动模式,因为服务器敲的是上网代理服务器的门,而不是敲客户端的门
而且有时候,客户端也不是轻易就开门的,因为有防火墙阻挡,除非客户端开放大于1024的高端端口



FTP服务器的主动和被动模式使用

  FTP是仅基于TCP的服务,不支持UDP。与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是21(命令端口)和20(数据端口)。但FTP 工作方式的不同,数据端口并不总是20。这就是主动与被动FTP的最大不同之处。

    (一)主动FTP
    主动方式的FTP是这样的:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。
    针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:
    1. 任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接)
    2. FTP服务器的21端口到大于1024的端口。 (服务器响应客户端的控制端口)
    3. FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口)
    4. 大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)
    (二)被动FTP
    为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。
    在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。
    当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
    对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
    1. 从任何大于1024的端口到服务器的21端口 (客户端初始化的连接)
    2. 服务器的21端口到任何大于1024的端口 (服务器响应到客户端的控制端口的连接)
    3. 从任何大于1024端口到服务器的大于1024端口 (客户端初始化数据连接到服务器指定的任意端口)
    4. 服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)
    (三) 主动与被动FTP优缺点:
    主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。




要用主动模式来下载,请您把下载工具的被动模式(PASV)都不要打勾,用主动模式来下载就OK了,如果在出错,那就被动主动相互转换一下 

常见的FTP客户端软件的PASV方式的关闭方法

大部分FTP客户端默认使用PASV方式,PASV模式的意式是被动模式。 在大部分FTP客户端的设置里,常见到的字眼都是“PASV”或“被动模式”。 

IE: 工具 -> Internet选项 -> 高级 -> “使用被动FTP”(需要IE6.0以上才支持)。 

CuteFTP: Edit -> Setting -> Connection -> Firewall -> “PASV Mode” 
或 File -> Site Manager,在左边选中站点 -> Edit -> “Use PASV mode” 

FlashGet: 工具 -> 选项 -> 代理服务器 -> 直接连接 -> 编辑 -> “PASV模式”

FlashFXP: 选项 -> 参数选择 -> 代理/防火墙/标识 -> “使用被动模式” 
或 站点管理 -> 对应站点 -> 选项 -> “使用被动模式” 
或 快速连接 -> 切换 -> “使用被动模式” 

LeapFTP: Option ->Preferences -> General->Proxy->Use Pasv Mode

从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完全不同。而FTP的复杂xing就在于此。

 


 

常见的FTP客户端软件PORT方式与PASV方式的切换方法。

大部分FTP客户端默认使用PASV方式。IE默认使用PORT方式。

在大部分FTP客户端的设置里,常见到的字眼都是“PASV”或“被动模式”,极少见到“PORT”或“主动模式”等字眼。因为FTP的登录方式只有两种:PORT和PASV,取消PASV方式,就意味着使用PORT方式。

IE:
工具 -> Internet选项 -> 高级 -> “使用被动FTP”(需要IE6.0以上才支持)。

CuteFTP:
Edit -> Setting -> Connection -> Firewall -> “PASV Mode”

File -> Site Manager,在左边选中站点 -> Edit -> “Use PASV mode”

FlashGet:
工具 -> 选项 -> 代理服务器 -> 直接连接 -> 编辑 -> “PASV模式”

FlashFXP:
选项 -> 参数选择 -> 代理/防火墙/标识 -> “使用被动模式”

站点管理 -> 对应站点 -> 选项 -> “使用被动模式”

快速连接 -> 切换 -> “使用被动模式”

什么叫做PASV mode(被动模式传送)?他是如何工作的?

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去建立一个数据连接。

我需要把传送模式设置成PASV mode吗?

如 果您连接到INTERNET的方式如下图,你需要设置成为PASV mode模式传送从上图中我们可以看出,路由上有两个ip一个是内网ip(也就是你的网关地址)另外一个是外网IP,你所有LAN中的计算机都是共享这个 218.63.1.5访问INTERNET的(中间通过了192.168.1.1这个网关),让我们来看一个连接的详细过程,以便您更进一步了解为什么需 要设置成为PASV mode 传送: 当您通过下载工具或使用浏览器下载影片的时候就开始连接FTP服务器, 当FTP服务收到你的连接请求后发送应答信息给客户并开始等待用户的认证信息,-->认证通过后开始建立数据连接 如果你不是设置成为pasv模式,那么客户段(下载工具)会在本地计算机开一个数据端口,然后发送一条“命令”给FTP服务段,(我已打开了n端口你现在 可以连接我),那么FTP服务器段就开始连接你ip地址的N端口,(但是连接是失败的) 因为你是通过192.168.1.1 这个网关(你的路由设备)访问internet的ftp服务段他实际上是同你的外网地址为218.63.1.5的路由设备连接,根本就连接不上你下载工具 中打开的端口,例如你使用的是 192.168.1.2 这个客户机,FTP服务段此时无法同你计算机(192.168.1.2)监听端口N连接上,所以此时你会看到服务器反馈的错误信息,提示你 192.168.1.2打开的端口无法连接之类的, 信息此时你就需要把传送模式设置成为PASV模式, 而如果你使用的是PASV模式那么当你ftp通过认证后,客户段首先向服务器发送一条PASV命令,服务段接受到命令后打开一个端口并告诉客户段“我已打 开了一个端口,你此时可以来连接了" 客户段(下载工具)接受到信息后,就去连接服务段已经打开了的端口,从而完成数据连接,所有ftp下载的数据流都将通过这个端口传送。

经常听见有人讨论PORT和PASV,到底两者有何区别?

答:防火墙有很多种,其中有一些会禁止那些不是从内部网络IP发出的连接请求。
而 ftp协议是个很老的东东,没有考虑这个问题。可以这样简单描述一般ftp的工作原理:client对server发出请求:“嗨,我的xx端口正等着你 传送数据呢,sever听到这个请求,就会建立一个连接,指向这个端口,并且开始传送数据。这就回到了我们的问题,如果发出请求的client在防火墙的 后面,而这个防火墙禁止外部IP建立连接,那么当然server(在外部)不能建立与client的连接。所以,过了几年,人们修改了ftp协议以应付这 种情况。这就是passive mode,工作原理如下:client向server发出passive命令,server回答说:“数据在xx端口等你,自己来拿。” 而这回则由client建立指向server的连接,从而取得数据。这就避免了防火墙的限制。

为什么PORT方式比PASV方式安全?

FTP 传输过程中要求建立一个专门的连接来传输数据,建立连接有两个方法:一个就是FTP Server打开一个端口,Client可以去连接这个端口来建立连接。这就是PASV方式。一个就是FTP Client打开一个端口,Server去连接这个端口来建立连接。这就是PORT方式。显然,如果服务器打开了一个端口,就意味着向互联网打开了一个端 口。所以PORT方式比PASV方式安全。

概括:PASV就是被动,FTP被动等着客户来连,懒吗!所以安全性差
PORT就是主动,FTP主动同客户连接,勤奋所以安全性高哦

一些FTP帐号密码都正确却登录不上,

实际上问题在于:此FTP登录要求连接方式是PORT方式.而用一般FTP软件连接时,通常缺省默认是PASV模式,而此FTP要求PORT方式,所以进去list就会出错,解决方法就是改成PORT连接方式.

很多FTP帐号密码公布正确,而你连不上很可能是这个原因

cuteftp 中站点设置的数据连接类型有port和pasv类型.在cuteftp.leapftp中都有一个选项,比如汉化版的CuteFTP Pro 3.0中,工具-全局选项-连接-数据连接类型里面有PASV 和port 选项.FTP取消PASV模式.版本不同,设置方法也略有不同,因此需要根据实际情况进行设置。下面举几个例子: