FTP服务器使用20和21两个网络端口与FTP客户端进行通讯.html
FTP服务器的21端口用于传输FTP的控制命令,20端口用于传输文件数据.web
FTP客户端向服务器的FTP控制端口(默认是21)发送链接请求,服务器接受链接,创建一条命令链路;当须要传送数据时,客户端在命令链路上用PORT的命令告诉服务器我开放了某端口,你过来链接我.因而服务器从20端口向客户端的该端口发送链接请求,创建一条数据链路来传送数据.在数据链路创建过程当中是服务器主动请求,因此称为主动模式.浏览器
FTP客户端向服务器的FTP控制端口(默认21)发送链接请求,服务器接受链接,创建一条命令链路;当须要传送数据时,服务器在命令链路上用PASV命令告诉客户端,我打开了某端口,你过来连我.因而客户端向服务器的该端口发送链接请求,创建一条数据链路来传送数据.在数据链路创建的过程当中是服务器被动等待客户机的请求,因此称被动模式.安全
由上面几点能够看出,FTP服务器的主动与被动模式是以FTP服务器进行数据传送链接的主动或被动为依据的.服务器
对于FTP服务器与客户机之间存在的网络防火墙,不管是服务器侧仍是客户机侧的网络防火墙设置策略都要保证FTP服务器和客户端之间可以正常创建命令链路和数据链路。网络
---------------架构
主动方式的FTP是这样的:客户端从一个任意的非特权端口N(N>1024)链接到FTP服务器的命令端口,也就是21端口。而后客户端开始监听端并发
口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它本身的数据端口(20)链接到客户端指定的数据端口(N+1)。app
针对FTP服务器前面的防火墙来讲,必须容许如下通信才能支持主动方式FTP:dom
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的客户端并无实际创建一个到服务器数据端口的链接,它只是简单的告诉服务器本身监听的端口号,服务器
再回来链接客户端这个指定的端口。对于客户端的防火墙来讲,这是从外部系统创建到内部客户端的链接,这是一般会被阻塞的。
下面是一个主动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.
为了解决服务器发起到客户的链接的问题,人们开发了一种不一样的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时才支持被动的配置。
下面是一个被动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.
下面会帮助管理员们记住每种FTP方式是怎样工做的:
命令链接:客户端 >1024端口 -> 服务器 21端口
数据链接:客户端 >1024端口 <- 服务器 20端口
命令链接:客户端 >1024端口 -> 服务器 21端口
数据链接:客户端 >1024端口 -> 服务器 >1024端口
主动FTP对FTP服务器的管理有利,但对客户端的管理不利。由于FTP服务器企图与客户端的高位随机端口创建链接,而这个端口颇有可能被客户端的防火墙阻塞掉。
被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。由于客户端要与服务器端创建两个链接,其中一个连到一个高位随机端口,而这个端口颇有可能被服务器端的防火墙阻塞掉。 幸运的是,有折衷的办法。既然FTP服务器的管理员须要他们的服务器有最多的客户链接,那么必须得支持被动FTP。咱们能够经过为FTP服务器指定一个有限的端口范围来减少服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除全部针对服务器的危险,但它大大减小了危险。
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
---------------
在ISA(工业标准架构体系Industry Standard Architecture是IBM PC兼容机上的一种总线)的状况,若是采用被动模式,因为IIS是彻底随机的选择一个端口,并告知客户,而后客户进行主动链接,这就意味着在ISA上,你要让全部的端口都容许动态入站链接才行,这样确定不行,由于太危险了,等于打开了全部的端口链接。
若是采用主动模式(PORT Mode),IIS选择好端口后,主动与客户进行链接,这时候不须要像PASV模式那样打开全部的动态入站链接,并且正好相反,咱们须要打开全部的动态出站链接便可,安全性增长不少。并且由ISA的IP PACKET FILTER只对ISA本机起做用,不会形成局域网内的客户“放了羊”。
---------------
FTP的特殊性:
大多数的TCP服务是使用单个的链接,通常是客户向服务器的一个周知端口发起链接,而后使用这个链接进行通信。可是,FTP协议却有所不一样,它使用双向的多个链接,并且使用的端口很难预计。通常,FTP链接包括:
一个控制链接(control connection)
这个链接用于传递客户端的命令和服务器端对命令的响应。它使用服务器的21端口,生存期是整个FTP会话时间。
几个数据链接(data connection)
这些链接用于传输文件和其它数据,例如:目录列表等。这种链接在须要数据传输时创建,而一旦数据传输完毕就关闭,每次使用的端口也不必定相同。并且,数据链接既多是客户端发起的,也多是服务器端发起的。
在FTP协议中,控制链接使用周知端口21,所以使用ISA的IP PACKET FILTER就能够这种链接进行很好的安全保护。相反,数据传输链接的目的端口一般实现没法知道,所以处理这样的端口转发很是困难。FTP协议使用一个标准的端口21做为ftp-data端口,可是这个端口只用于链接的源地址是服务器端的状况,在这个端口上根本就没有监听进程。FTP的数据链接和控制链接的方向通常是相反的,也就是说,是服务器向客户端发起一个用于数据传输的链接。链接的端口是由服务器端和客户端协商肯定的。FTP协议的这个特征对ISA转发以及防火墙和NAT的配置增长了不少困难。
除此以外,还有另一种FTP模式,叫作被动模式(passive mod)。在这种模式下,数据链接是由客户程序发起的,和刚才讨论过的模式(咱们能够叫作主动模式)相反。是否采起被动模式取决于客户程序,在ftp命令行中使用passive命令就能够关闭/打开被动模式。
前面咱们讲过,FTP协议的数据传输存在两种模式:主动模式和被动模式。这两种模式发起链接的方向截然相反,主动模式是从服务器端向客户端发起;被动模式是客户端向服务器端发起链接。
咱们回到ISA的状况,若是采用被动模式,因为IIS是彻底随机的选择一个端口,并告知客户,而后客户进行主动链接,这就意味着在ISA上,你要让全部的端口都容许动态入站链接才行,这样确定不行,由于太危险了,等于打开了全部的端口链接。
若是采用主动模式(PORT Mode),IIS选择好端口后,主动与客户进行链接,这时候不须要像PASV模式那样打开全部的动态入站链接,并且正好相反,咱们须要打开全部的动态出站链接便可,安全性增长不少。并且由ISA的IP PACKET FILTER只对ISA本机起做用,不会形成局域网内的客户“放了羊”。
因此,我我的这样作的:
(1)因为IIS和ISA都在一台机器上,因此它俩都在侦听21号端口(IIS默认状况下会侦听全部地址的21端口),因此咱们首先要让IIS只侦听内
网地址的PORT 21,在DOS下,你能够经过NETSTAT -NA > abc.txt,而后打开这个文件,你会看到0.0.0.0 21 LISTENING字样。
输入以下命令:
net stop msftpsvc (中止FTP服务)
进入\Inetpub\adminscripts\目录
cscript adsutil.vbs set msftpsvc/disablesocketpooling true (中止侦听)
net start msftpsvc (启动FTP服务)
(2)在IIS控制台里面,ftp->Property->FTP Site->IP Address改成内网地址。如今,FTP服务只侦听内网IP的21号端口了。
(3)你们可能这时候有疑问,若是是IIS主动链接客户端,那客户端的防火墙是否是会阻止这个链接(PASV模式不存在这个问题)。为了防止这种状况,咱们能够强制IIS不能与客户端的任意端口进行链接,而只有客户端链接IIS的端口进行数据传输。这样就能够解决PORT MODE与客户端防火墙的冲突。方法:修改注册
表,HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msftpsvc\Parameters\,将EnablePortAttack的值由0改成1,而后从新启动FTP服务。
(4)在ISA里面,使用SERVER PUBLISH的方法发布FTP服务,其中:IP address of internal server 填写ISA的内部网卡的IP,IP address of external server 填写ISA的外部网卡的IP,Mapped server protocol 选择 FTP Server。
(5)而后在IP Packet Filter创建一条新RULES,Protocol->TCP,Direction->Outbound,Local Port->Dymanic,Remote Port->All。
这是个人解决办法,可是并不完美,主要是:
(1)客户不能使用PASV方法进行链接,缘由上面已经讲了。
(2)因为第五条,因此ISA服务器随着保证了对外部访问的限制,却没法限制ISA本机对外部的访问。
我也把个人方法作了一下实验,使用serv-u作的,有一点错误,不过终归作了出来,下面总结一下:
PASV服务器放在ISA后面,其实就是要解决两个问题:
1. PASV的端口。我上面的方法提出使用secondary connection,但事实证实不对,应该每一个PASV端口都创建一条primary connection,而后分别创建server publishing rules,有多少个PASV端口,就要创建多少条。
这里还能够引出另外一个话题,就是对web publishing rules的运用,tony你应该知道,经过web publishing rules也能够发布ftp服务器,但rule里面只给了一个ftp端口的选项,很明显,这是为PORT模式的FTP服务器准备的,由于PORT模式的数据链接是由服务器发起的,在服务器一边,不存在穿过防火墙的问题。
使用web publishing rules还有一个很使人振奋的特性,就是支持动态公用IP用户,不须要象server publishing rules那样,每拨一次号都要修改一次外部地址。若是在web publishing rules中也能搞定PASV问题,那么对于那些使用拨号上网而又想在内网发布PASV服务器的人来讲,简直是天大的喜讯。
须要好好考虑的是如何经过那个只能填一个端口的选项来发布随机的PASV端口?我从今天的实验找到了一点灵感,就是也象上面说的那样,每一个PASV端口都设置一条web publishing rules!我还未作这个实验,还不能证明这样作行不行,相信晚上就会有结果了。
固然,还须要考虑如何控制PASV模式端口的范围,serv-u能够设定,而IIS的FTP不行。
2. 服务器向客户端传送IP的问题。当FTP客户端登陆进入服务器的时候,PASV模式服务器会向客户端传送本机的IP地址和数据端口,当服务器放在内网中的时候,服务器会向客户端返回内网的IP,这固然是不能完成链接的,须要让服务器返回ISA的外网地址。原本,解决方法可使用firwall client的application settings中的nameresolutionforlocalhost参数,设为P就可让应用程序返回ISA的外网地址,但这个参数是供firewall client使用的,而发布服务器不能安装firewall client,这很惋惜。
幸亏,仍是有一个好消息,就是serv-u自己具备返回ISA外网地址这样的功能,方法是先选中新建FTP服务器的属性,在domain标签里选择“enable dynamic dns”,此时会出现第二个标签,叫“dynamic dns”,而后到tz0.com申请动态域名,申请后会获得一个key,在此标签中填入此key便可。最后一步,是到新建服务器的settings属性中,选择advanced标签,选中“allow passive mode data transfer”,旁边的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服务器在内部网络中,在创建server publish rules时(虽然web publish rules也能发布ftp服务器,但它并无提供对port和pasv模式的处理),protocol definitions中的21 inbound条目要创建一个secondary connection,为20端口上的inbound或1025-65535端口之间的inbound。
若是FTP服务器创建在ISA服务器上,就须要在ip packet filters中设置相关的条目,对于PORT模式,很简单,开放20 inbound就是,但pasv模式就麻烦一点,由于ip packet filters不能设置端口段,但咱们也不可能把几万个端口逐个写一遍,只能把local port设置为dynamic,remote port设置为all ports,固然,对安全性这是个损害。
幸运的是,有些PASV模式的FTP服务器可以设置PASV模式端口的范围,好比serv-u,它可以把PASV模式端口控制在最多50个端口范围内,若是为serv-u设置的并发用户数很少,那么咱们就能够为每一个PASV端口写一条filter,不须要开放全部的端口了。若是使用IIS的FTP服务器,这个FTP服务器没有提供选择PASV模式端口的功能,只能如上所述那样,开放dynamic和all ports。
从你上面的出错信息来看,你应该是使用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被动模式"钩去掉。
注:资料来自网络