首页 > 代码库 > FTP的主动模式与被动模式
FTP的主动模式与被动模式
FTP服务器使用20和21两个网络端口与FTP客户端进行通信.
FTP服务器的21端口用于传输FTP的控制命令,20端口用于传输文件数据.
FTP主动模式:
FTP客户端向服务器的FTP控制端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路;当需要传送数据时,客户端在命令链路上用PORT的命令告诉服务器我开放了某端口,你过来连接我.于是服务器从20端口向客户端的该端口发送连接请求,建立一条数据链路来传送数据.在数据链路建立过程中是服务器主动请求,所以称为主动模式.
FTP被动模式:
FTP客户端向服务器的FTP控制端口(默认21)发送连接请求,服务器接受连接,建立一条命令链路;当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端,我打开了某端口,你过来连我.于是客户端向服务器的该端口发送连接请求,建立一条数据链路来传送数据.在数据链路建立的过程中是服务器被动等待客户机的请求,所以称被动模式.
由上面几点可以看出,FTP服务器的主动与被动模式是以FTP服务器进行数据传送连接的主动或被动为依据的.
对于FTP服务器与客户机之间存在的网络防火墙,不论是服务器侧还是客户机侧的网络防火墙设置策略都要保证FTP服务器和客户端之间能够正常建立命令链路和数据链路。
---------------
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会话从testbox1.slacksite.com(192.168.150.80),一个运行标准的FTP命令行客户端的Linux工作站,发起到testbox2.slacksite.com(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 testbox2
Connected to testbox2.slacksite.com.
220 testbox2.slacksite.com FTP server ready.
Name (testbox2:slacker): slacker
---> USER slacker
331 Password required for slacker.
Password: TmpPass
---> PASS XXXX
230 User slacker logged in.
---> SYST
215 UNIX Type: L8
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PORT 192,168,150,80,14,178
200 PORT command successful.
---> LIST
150 Opening ASCII mode data connection for file list.
drwx------ 3 slacker users 104 Jul 27 01:45 public_html
226 Transfer complete.
ftp> quit
---> QUIT
221 Goodbye.
2.2、被动FTP
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。
在被动方式FTP中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
1. 从任何端口到服务器的21端口 (客户端初始化的连接 S<-C)
2. 服务器的21端口到任何大于1024的端口 (服务器响应到客户端的控制端口的连接 S->C)
3. 从任何端口到服务器的大于1024端口 (入;客户端初始化数据连接到服务器指定的任意端口 S<-C)
4. 服务器的大于1024端口到远程的大于1024的端口(出;服务器发送ACK响应和数据到客户端的数据端口 S->C)
在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。然后在第2步中,服务器返回命令"PORT 2024",告诉客户端(服务器)用哪个端口侦听数据连接。在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4步中给客户端的数据端口返回一个"ACK"响应。
被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP守护程序,包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。
第二个问题是客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。
随着WWW的广泛流行,许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动的配置。
2.2.1 被动FTP的例子
下面是一个被动FTP会话的实际例子,只是服务器名、IP地址和用户名都做了改动。在这个例子中,FTP会话从testbox1.slacksite.com(192.168.150.80),一个运行标准的FTP命令行客户端的Linux工作站,发起到testbox2.slacksite.com(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 testbox2
Connected to testbox2.slacksite.com.
220 testbox2.slacksite.com FTP server ready.
Name (testbox2:slacker): slacker
---> USER slacker
331 Password required for slacker.
Password: TmpPass
---> PASS XXXX
230 User slacker logged in.
---> SYST
215 UNIX Type: L8
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PASV
227 Entering Passive Mode (192,168,150,90,195,149).
---> LIST
150 Opening ASCII mode data connection for file list
drwx------ 3 slacker users 104 Jul 27 01:45 public_html
226 Transfer complete.
ftp> quit
---> QUIT
221 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服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。
被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。 幸运的是,有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险。
2.3.4 参考资料
O‘Reilly出版的《组建Internet防火墙》(第二版,Brent Chapman,Elizabeth Zwicky著)是一本很不错的参考资料。里面讲述了各种Internet协议如何工作,以及有关防火墙的例子。
最权威的FTP参考资料是RFC 959,它是FTP协议的官方规范。RFC的资料可以从许多网站上下载,例如:ftp://nic.merit.edu/documents/rfc/rfc0959.txt 。
Active FTP vs. Passive FTP, Appendix 1
---------------
FTP主动与被动的好处和坏处:
在ISA(工业标准架构体系Industry Standard Architecture是IBM PC兼容机上的一种总线)的情况,如果采用被动模式,由于IIS是完全随机的选择一个端口,并告知客户,然后客户进行主动连接,这就意味着在ISA上,你要让所有的端口都允许动态入站连接才行,这样肯定不行,因为太危险了,等于打开了所有的端口连接。
如果采用主动模式(PORTMode),IIS选择好端口后,主动与客户进行连接,这时候不需要像PASV模式那样打开所有的动态入站连接,而且正好相反,我们需要打开所有的动态出站连接即可,安全性增加很多。而且由ISA的IPPACKET FILTER只对ISA本机起作用,不会造成局域网内的客户“放了羊”。
---------------
FTP主动模式及被动模式
FTP的特殊性:
大多数的TCP服务是使用单个的连接,一般是客户向服务器的一个周知端口发起连接,然后使用这个连接进行通讯。但是,FTP协议却有所不同,它使用双向的多个连接,而且使用的端口很难预计。一般,FTP连接包括:
一个控制连接(controlconnection)
这个连接用于传递客户端的命令和服务器端对命令的响应。它使用服务器的21端口,生存期是整个FTP会话时间。
几个数据连接(dataconnection)
这些连接用于传输文件和其它数据,例如:目录列表等。这种连接在需要数据传输时建立,而一旦数据传输完毕就关闭,每次使用的端口也不一定相同。而且,数据连接既可能是客户端发起的,也可能是服务器端发起的。
在FTP协议中,控制连接使用周知端口21,因此使用ISA的IP PACKETFILTER就可以这种连接进行很好的安全保护。相反,数据传输连接的目的端口通常实现无法知道,因此处理这样的端口转发非常困难。FTP协议使用一个标准的端口21作为ftp-data端口,但是这个端口只用于连接的源地址是服务器端的情况,在这个端口上根本就没有监听进程。FTP的数据连接和控制连接的方向一般是相反的,也就是说,是服务器向客户端发起一个用于数据传输的连接。连接的端口是由服务器端和客户端协商确定的。FTP协议的这个特征对ISA转发以及防火墙和NAT的配置增加了很多困难。
除此之外,还有另外一种FTP模式,叫做被动模式(passivemod)。在这种模式下,数据连接是由客户程序发起的,和刚才讨论过的模式(我们可以叫做主动模式)相反。是否采取被动模式取决于客户程序,在ftp命令行中使用passive命令就可以关闭/打开被动模式。
前面我们讲过,FTP协议的数据传输存在两种模式:主动模式和被动模式。这两种模式发起连接的方向截然相反,主动模式是从服务器端向客户端发起;被动模式是客户端向服务器端发起连接。
我们回到ISA的情况,如果采用被动模式,由于IIS是完全随机的选择一个端口,并告知客户,然后客户进行主动连接,这就意味着在ISA上,你要让所有的端口都允许动态入站连接才行,这样肯定不行,因为太危险了,等于打开了所有的端口连接。
如果采用主动模式(PORTMode),IIS选择好端口后,主动与客户进行连接,这时候不需要像PASV模式那样打开所有的动态入站连接,而且正好相反,我们需要打开所有的动态出站连接即可,安全性增加很多。而且由ISA的IPPACKET FILTER只对ISA本机起作用,不会造成局域网内的客户“放了羊”。
所以,我个人这样做的:
(1)由于IIS和ISA都在一台机器上,所以它俩都在侦听21号端口(IIS默认情况下会侦听所有地址的21端口),所以我们首先要让IIS只侦听内
网地址的PORT21,在DOS下,你可以通过NETSTAT -NA> abc.txt,然后打开这个文件,你会看到0.0.0.0 21LISTENING字样。
输入如下命令:
net stop msftpsvc (停止FTP服务)
进入\Inetpub\adminscripts\目录
cscript adsutil.vbs set msftpsvc/disablesocketpoolingtrue (停止侦听)
net start msftpsvc (启动FTP服务)
(2)在IIS控制台里面,ftp->Property->FTPSite->IP Address改为内网地址。现在,FTP服务只侦听内网IP的21号端口了。
(3)大家可能这时候有疑问,如果是IIS主动连接客户端,那客户端的防火墙是不是会阻止这个连接(PASV模式不存在这个问题)。为了防止这种情况,我们可以强制IIS不能与客户端的任意端口进行连接,而只有客户端连接IIS的端口进行数据传输。这样就可以解决PORTMODE与客户端防火墙的冲突。方法:修改注册
表,HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msftpsvc\Parameters\,将EnablePortAttack的值由0改为1,然后重新启动FTP服务。
(4)在ISA里面,使用SERVERPUBLISH的方法发布FTP服务,其中:IP address ofinternal server 填写ISA的内部网卡的IP,IP address of externalserver 填写ISA的外部网卡的IP,Mapped serverprotocol 选择 FTP Server。
(5)然后在IP PacketFilter建立一条新RULES,Protocol->TCP,Direction->Outbound,LocalPort->Dymanic,RemotePort->All。
这是我的解决办法,但是并不完美,主要是:
(1)客户不能使用PASV方法进行连接,原因上面已经讲了。
(2)由于第五条,所以ISA服务器随着保证了对外部访问的限制,却无法限制ISA本机对外部的访问。
我也把我的方法做了一下实验,使用serv-u做的,有一点错误,不过终归做了出来,下面总结一下:
PASV服务器放在ISA后面,其实就是要解决两个问题:
1. PASV的端口。我上面的方法提出使用secondaryconnection,但事实证明不对,应该每个PASV端口都建立一条primary connection,然后分别建立server publishingrules,有多少个PASV端口,就要建立多少条。
这里还可以引出另一个话题,就是对webpublishing rules的运用,tony你应该知道,通过web publishing rules也可以发布ftp服务器,但rule里面只给了一个ftp端口的选项,很明显,这是为PORT模式的FTP服务器准备的,因为PORT模式的数据连接是由服务器发起的,在服务器一边,不存在穿过防火墙的问题。
使用web publishingrules还有一个很令人振奋的特性,就是支持动态公用IP用户,不需要象server publishingrules那样,每拨一次号都要修改一次外部地址。如果在web publishing rules中也能搞定PASV问题,那么对于那些使用拨号上网而又想在内网发布PASV服务器的人来说,简直是天大的喜讯。
需要好好考虑的是如何通过那个只能填一个端口的选项来发布随机的PASV端口?我从今天的实验找到了一点灵感,就是也象上面说的那样,每个PASV端口都设置一条webpublishing rules!我还未做这个实验,还不能证实这样做行不行,相信晚上就会有结果了。
当然,还需要考虑如何控制PASV模式端口的范围,serv-u可以设定,而IIS的FTP不行。
2. 服务器向客户端传送IP的问题。当FTP客户端登录进入服务器的时候,PASV模式服务器会向客户端传送本机的IP地址和数据端口,当服务器放在内网中的时候,服务器会向客户端返回内网的IP,这当然是不能完成连接的,需要让服务器返回ISA的外网地址。本来,解决方法可以使用firwallclient的applicationsettings中的nameresolutionforlocalhost参数,设为P就可以让应用程序返回ISA的外网地址,但这个参数是供firewallclient使用的,而发布服务器不能安装firewall client,这很可惜。
幸好,还是有一个好消息,就是serv-u本身具有返回ISA外网地址这样的功能,方法是先选中新建FTP服务器的属性,在domain标签里选择“enable dynamicdns”,此时会出现第二个标签,叫“dynamicdns”,然后到tz0.com申请动态域名,申请后会得到一个key,在此标签中填入此key即可。最后一步,是到新建服务器的settings属性中,选择advanced标签,选中“allow passive mode datatransfer”,旁边的IP地址框留空。这个框对于拨号用户不用填,只有出口使用固定地址才需要填。
这样,serv-u向客户端返回IP和端口前,会先向tz0.com查询到ISA外网的地址,再发送给客户端。
解决了这两个问题,剩下的工作就简单了。
从以上内容也可以说明一点,从内网不能发布IIS的FTP服务器,因为IIS既没有选项可以选择PASV端口的范围,也没有办法让其返回ISA外网的地址。而serv-u这两条都可以满足。当然,在微软的网站上也可能有方法解决IIS的这两个问题。
发布FTP服务器的时候,要注意FTP服务器有PORT和PASV两种模式。两者的共同点,是都使用21端口进行用户验证及管理,差别在于传送数据的方式不同,PORT模式的FTP服务器数据端口固定在20,而PASV模式则在1025-65535之间随机。发布的时候要考虑这个差别。
如果FTP服务器在内部网络中,在建立serverpublish rules时(虽然web publish rules也能发布ftp服务器,但它并没有提供对port和pasv模式的处理),protocoldefinitions中的21 inbound条目要建立一个secondaryconnection,为20端口上的inbound或1025-65535端口之间的inbound。
如果FTP服务器建立在ISA服务器上,就需要在ip packetfilters中设置相关的条目,对于PORT模式,很简单,开放20inbound就是,但pasv模式就麻烦一点,因为ip packetfilters不能设置端口段,但我们也不可能把几万个端口逐个写一遍,只能把local port设置为dynamic,remoteport设置为all ports,当然,对安全性这是个损害。
幸运的是,有些PASV模式的FTP服务器能够设置PASV模式端口的范围,比如serv-u,它能够把PASV模式端口控制在最多50个端口范围内,如果为serv-u设置的并发用户数不多,那么我们就可以为每个PASV端口写一条filter,不需要开放所有的端口了。如果使用IIS的FTP服务器,这个FTP服务器没有提供选择PASV模式端口的功能,只能如上所述那样,开放dynamic和allports。
从你上面的出错信息来看,你应该是使用IE来访问FTP服务器吧。IE的FTP客户端与其它专业FTP客户端不同,不能够自动检测FTP服务器的类型以及根据服务器的类型改变客户端的种类。IE只提供了一个手工选项来改变PORT和PASV客户端角色,就是internet选项->高级->为FTP站点启用文件夹视图,选择它,IE为PASV模式客户端,不选则为PORT客户端。你需要根据服务器的类型手工更改这个选项。如果服务器的出口是ADSL类的链路,还要把“使用被动FTP(为防火墙和DSL调制解调器兼容性)”一项选上,这两个选项只在IE5.5以上版本提供。
---------------
ftp主动 (port)与被动(pasv) 模式区别
所谓port模式也就是主动模式。在FTP协议刚刚建立的时候,只定义了普通的连接模式,也就是port模式。
Port模式的连接过程是:在开始一个FTP的连接时,客户端程序首先会为自己随机分配一个TCP端口,它使用这个个端口向服务器的FTP端口(默认为21)发出连接请求,服务器接受请求之后会建立一条控制链路,然后客户程序发出port命令(通常格式为PORT A, A, A, A,I,I,其中A,A,A,A为客户端IP地址,I,I为随机的一个数据连接端口号)告诉服务器它的数据通道的端口打开了。当需要传送数据时,服务器便从随机选择的一个端口向客户端的20端口发送连接请求,请求被接受之后便开始传输数据,数据链路通道也就打开了。
---------------
所谓pasv模式也就是被动模式。随着网络的不断发展,出现了防火墙。老的FTP协议在遇到防火墙的时候就束手无策了,这是因为20端口往往是防火墙的重点封堵对象,因此数据也就不能发送出去了,于是pasv模式就诞生了。
Pasv模式的连接过程是:在开始一个FTP的连接时,客户端程序首先为自己随机分配一个TCP端口,它使用这个端口向服务器的FTP端口(默认为21)发出连接请求,服务器接受请求之后会建立一条控制链路,然后客户端程序发出PASV命令,代替原来PORT命令告诉服务器它的数据连接端口,于是服务器便为自己随机分配一个数据通道端口,并将这个端口号告诉客户端程序。当需要传送数据时,客户端程序会向服务器的数据通道端口发送连接请求,请求被接受之后便开始传输数据,数据链路通道也就打开了。
---------------
1.所谓主动和被动可以看作是以服务器端为基准,当服务器主动向客户端发送数据连接请求时,为主动模式;当客户端主动向服务器发送数据连接请求时,为被动模式。
2.无论客户端还是服务器端有防火墙,或是两边都有防火墙,只要PASV模式下两边数据通道的连接端口在防火墙的拦截之外就可以建立成功。如果防火墙将所有的端口全部堵死,则不能建立数据通道。
---------------
FTP使用中PASV模式的操作方法
(注:此方法只有在无法登录和下载的情况下才可使用,因为大部分服务都是pasv模式的。)
取消 pasv 模式的方法
有许多朋友的 FTP服务器是不支持 PASV 模式的,登入时要取消 PASV 模式才行。下面是几种 FTP 下载工具的取消方法:
1.把 flashget 的 pasv模式关掉的方法
点菜单上的“工具”->“选项”->“代理服务器”->“直接连接”->编辑->把“ pasv模式”前的勾勾去掉,一路确定回来。
2.把 Cutftp 的pasv 模式关掉的方法
点菜单上的“文件”->“站点管理”->在“站点管理器”窗口->“新建站点”->填上“域名”->“编辑”->“常规”->把“使用 pasv模式”前的勾勾去掉。
3.把 FlashFXP 的 pasv模式关掉的方法
点菜单上的“站点”->“站点管理器”->站点管理器窗口->“新建站点”->填上“域名”->“选项”->把“使用被动模式”前的勾勾去掉->“应用” 即可。
4.把 NetAnts 的pasv 模式关掉的方法
点菜单上的"选项"->"参数设置"->"代理"->“直接连接”->编辑->把“ pasv模式”前的勾勾去掉,一路确定回来。
5.把 IEpasv模式关掉方法
点菜单上的"工具"->"internet选"->"高级"->"使用ftp被动模式"钩去掉。
注:资料来自网络