在前面的配置操作中,我们都是关闭了FTP服务器上的防火墙,但这势必会大大降低FTP服务器的安全性。怎样才能在开启防火墙的情况下,也能实现客户端的顺利访问呢?这首先就必须要了解FTP服务的两种不同工作模式,然后才能去正确的配置防火墙。
在前面已经提到过,实现FTP服务需要在服务器端和客户端之间建立2个连接,分别为命令连接与数据连结。根据连接建立的方法不同,将FTP服务分为两种不同的工作模式:主动模式和被动模式
当FTP客户端需要登录到FTP服务器上时,服务器与客户端需要进行一系列的身份验证过程,这个过程就叫做命令连接。命令连接的用途非常有限,主要用来传输FTP的相关指令,如查看文件列表、删除文件等。如果要在客户端与服务器端之间进行文件传输,就需要再建立一个数据连接。主动模式与被动模式的差异主要体现在数据连结的建立方法上。
要想很好地理解命令连接和数据连接,首先我们需要了解一下端口和连接的概念。
1. 端口
端口是应用层的程序与传输层的TCP或UDP协议之间联系的通道。因为应用层程序多种多样,操作系统又允许同时运行多个程序,所以就必须得提供一种机制以使传输层协议能够区分开不同的应用层程序。当一个应用程序要与远程主机上的应用程序通信时,传输层协议就为该应用程序分配一个端口,不同的应用程序有着不同的端口,以使来往的数据互不干扰。
每个端口都有一个唯一的编号,在TCP/IP协议中是用一个16位的二进制数来为端口编号,所以端口号的取值范围为0~65535。这其中0端口未用,为了合理地分配使用端口,对它们进行了以下分类:
1~1023之间的端口固定地分配给一些常用的应用程序,称为固定端口。如http采用80端口,FTP采用21端口,Telnet采用23端口等。
1024~65535之间的端口随机的分配给那些发出网络连接请求的应用程序,称为动态端口,比如1024端口就是分配给第一个向系统发出申请访问网络的程序,程序关闭之后就会释放所占用的端口,然后可以再分配给其它程序使用。
另外根据所使用的传输层协议不同,端口又可以分为TCP端口和UDP端口两种类型。所以对端口的准确描述应该是:传输层协议+端口号。如HTTP使用的是TCP 80端口,Telnet使用的是TCP 23端口,SMTP使用的是TCP 25端口,POP3使用的是TCP 110端口,FTP使用的是TCP 21端口,DNS使用的是UDP 53端口等。对于这些常见的固定端口我们应该熟记。
2. 连接
在网络中传送数据时,发送方的应用程序通过端口将数据交给传输层协议封装成相应的信息单元。在信息单元的头部,记录了接收该数据的应用程序端口(目的端口),以及送出该数据的应用程序端口(源端口),接着逐层封装并在网络上传送。数据到达接收端后,传输层协议通过判断目的端口号决定将数据交给哪个应用层程序进行处理。所以,两个应用进程之间的通信,数据必须要通过各自的端口发送和接收。因此可以把进程间的通信看做在两个端口之间建立起来的逻辑通道上进行数据交换,这个逻辑通道的建立过程就称做“连接”。
连接的建立有两种模式:主动连接和被动连接。主动连接是指当端口开启之后,进程通过该端口主动发出连接请求,进而建立的连接;被动连接则是当端口开启之后,进程在该端口等待别的计算机发来的连接请求,最终所建立的连接。在客户端/服务器模式的网络架构下,连接的建立一般都是由客户端申请一个动态端口发起主动连接,而服务器端则要一直开放相应的固定端口,然后等待与客户端建立被动连接。
3. 查看端口与连接
如何查看电脑中目前打开的端口或已经建立好的连接呢?最简单易行的方法是利用系统中自带的netstat命令。netstat命令通过在内存中读取相关数据,可以用来获取系统目前打开的端口、正在使用的协议以及收到和发出的数据等信息,功能非常强大。
Netstat命令的主要用法:netstat –an
其中-a参数的作用是显示所有活动的TCP连接以及计算机侦听的TCP和UDP端口,-n参数的作用是以数字的形式显示地址和端口(也就是显示IP地址,否则是显示计算机的名字)。
如在没有客户端访问的情况下,在FTP服务器上执行netstat -an命令。
表明系统此时已经开放了21端口,正处于LISTENING侦听状态。
然后在客户端访问服务器,在服务器上再次执行该命令。
可以看到服务器通过21端口与客户端的50306端口之间建立了一个连接,这个连接就是FTP控制连接。
4. 主动模式与防火墙配置
主动模式又称为标准模式或PORT模式,此时FTP客户端与服务器之间的通信过程如下图所示。
控制连接和数据连接的建立过程:
(1) 服务器固定开放TCP 21端口,客户端利用随机端口m与之建立控制连接。
(2)当客户端需要下载或上传文件时,客户端发送PORT命令给服务器,此命令包含客户端的IP地址与另外一个随机端口号n。客户端利用PORT命令通知服务器通过此IP地址与端口号来发送文件给客户端。
(3) 服务器通过TCP 20端口主动与客户端的随机端口n建立数据连接。
如果在服务器端和客户端都部署有防火墙的话,那么在主动模式下防火墙该如何配置呢?
由于防火墙一般只阻挡入站连接,而对出站连接一般都是予以放行,因此对于服务器端的防火墙,需要开放TCP 21端口,允许放行发往该端口的数据。由于TCP 21是FTP服务的默认端口,因而只要服务器端部署了FTP服务,该端口就会默认开放。
对于客户端的防火墙,则要开放端口n。而端口n是一个随机端口,因此难以在防火墙针对这个不固定的端口来开放,此时要么将客户端的防火墙关闭,要么在客户端改用被动模式来连接服务器。
下面我们将客户端和服务器的防火墙全部开启,然后在客户端尝试来连接服务器。FTP服务到底是采用主动模式还是被动模式,这是由客户端决定的。由于IE浏览器和资源管理器默认都是采用被动模式,因而需要采用其它的方式才能以主动模式去连接FTP服务器。这里我们采用FTP命令行,
可以看到,在连接到FTP服务器之后,在执行dir命令列表显示时系统卡死,这就是由于服务器无法与客户端之间建立主动连接,此时只需将客户端的防火墙关闭即可。再次执行dir命令,就可以正常显示目录列表了。
5. 被动模式与防火墙配置
被动模式又称为PASV模式,此时FTP客户端与服务器之间的通信过程如下所示。
(1)服务器固定开放TCP 21端口,客户端利用随机端口m与之建立控制连接。
(2) 客户端通过控制连接发送PASV命令给服务器,表示要利用被动模式来与服务器通信。(3) 服务器通过控制连接将用来接听客户端请求的随机端口号x发给客户端。
(4) 客户端通过随机端口n与服务器随机端口x建立数据连接。
在被动模式下,由于所有的入站连接都发生在服务器端,因而客户端的防火墙可以不予考虑,将客户端的防火墙开启。
对于服务器端的防火墙,既要开放TCP 21端口,又要开放随机端口x。TCP 21端口默认已经开放,对于随机端口x,服务器端的防火墙默认已经设置了一条“FTP Server Passive”规则。
这条规则将1024-65535之间的所有随机端口全部开放。
这条规则默认已经启用,只是需要将服务器重启生效,重启之后,在客户端和服务器防火墙全部开启的情况下,客户端也能利用被动模式正常访问FTP(利用IE浏览器或资源管理器访问)。
但是在FTP服务器端开放这么大一段范围的端口,势必会降低安全性,我们可以将FTP服务器所使用的端口号固定在自行指定的一小段范围内,此时只需在防火墙开放这一段范围即可。
在服务器端打开【IIS管理器】,选中FTP服务器,打开“FTP防火墙支持”,在“数据通道端口范围”处设置端口号范围,如50000-50100。
服务器重启之后,打开防火墙的高级设置,首先将系统默认的“FTP Server Passive”规则禁用,然后再新建一条“50000-50100”入站规则,开放相应范围的端口。此时在客户机进行测试,也可以成功访问服务器。
最后总结一下,FTP主动模式由于需要对客户机的防火墙进行配置,这在实际应用中是不可能的,而且如果在FTP服务器和客户机之间存在有NAT之类设备的话,那么FTP服务器也将无法主动与客户机之间建立数据连接,因而主动模式在实践中很少采用。
绝大多数FTP客户端软件默认都是采用被动模式,此时就必须在服务器端进行正确的防火墙配置,开放指定范围的随机端口。
本文转自 yttitan 51CTO博客,原文链接:http://blog.51cto.com/yttitan/1184226