笔者最近几天被FTP折腾了一下,简单的路由器ACL就是无法通过被动模式的FTP流量。经数次实验和度娘、谷哥指导,终于对FTP模式有了深入理解。先感叹一句,以前学艺不精,书到用时方恨少!

RFC959中文版地址:http://ishare.iask.sina.com.cn/f/25520214.html

不必要对FTP协议深究,但是看看上面的RFC文档,对于网工来说,不无裨益。

FTP的目标是:促进程序/数据文件的共享;鼓励(通过程序)使用远程计算机;使用户不必面对不同主机上不同文件系统的差异;对数据进行高效可靠的传输。FTP使用C/S结构,服务器通过TCP21端口建立控制连接,一般情况下通过TCP20端口建立数据连接。

为什么上面说是一般情况,这就引出了FTP的两种模式:主动模式(PORT)和被动模式(PASV)。FTP服务器在主动模式时,会使用21、20两个端口,在被动模式时仍使用21端口做控制连接,使用大于1024的端口做数据连接。请看官仔细着,这里的被动和主动是对于服务器来说的。

以下内容引用自:http://hi.baidu.com/xianyang1981/item/20d68be050a50aaccf2d4f8e

主动模式过程:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口(即tcp 21端口)。紧接着客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。最后服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1),这样客户端就可以和ftp服务器建立数据传输通道了。ftp port模式工作流程如下图所示:

FTP两种模式详解和实践技巧

针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:
1、客户端口>1024端口到FTP服务器的21端口 (入:客户端初始化的连接 S<-C)
2、FTP服务器的21端口到客户端>1024的端口(出:服务器响应客户端的控制端口 S->C)
3、FTP服务器的20端口到客户端>1024的端口(出:服务器端初始化数据连接到客户端的数据端口 S->C)
4、客户端>1024端口到FTP服务器的20端口(入:客户端发送ACK响应到服务器的数据端口 S<-C)

被动模式过程:当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。ftp pasv模式工作流程如下图所示:

FTP两种模式详解和实践技巧

对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
1、客户端>1024端口到服务器的21端口 (入:客户端初始化的连接 S<-C)
2、服务器的21端口到客户端>1024的端口 (出:服务器响应到客户端的控制端口的连接 S->C)
3、客户端>1024端口到服务器的大于1024端口 (入:客户端初始化数据连接到服务器指定的任意端口 S<-C)
4、服务器的大于1024端口到远程的大于1024的端口(出:服务器发送ACK响应和数据到客户端的数据端口 S->C)

两种模式最主要区别就是数据端口连接方式不同,主动模式只要开启服务器的21和20端口,而被动模式需要开启服务器大于1024所有TCP端口和21端口。重网络安全的角度来看的话似乎PORT模式更安全,而PASV更不安全,那么为什么RFC要在PORT基础再制定一个PASV模式呢?其实RFC制定PASV模式的主要目的是为了数据传输安全角度出发的,因为FTP使用固定20端口进行传输数据,***很容易使用sniffer等探嗅器抓取ftp数据,这样一来通过PORT模式传输数据很容易被***窃取,因此使用PASV方式来架设FTP服务器是最安全绝佳方案。
如果作为一个有经验的网工就会发现使用PASV方式会给网络安全很大隐患,那就是PASV需要开启服务器tcp大于1024所有端口,这样对服务器的安全保护是非常不利的。在此我建议两种方法来完善PASV模式的端口开放问题,第一种就是使用弱洞扫描工具比如Xscan找出服务器开放的端口然后使用ACL把端口deny掉,另外一种方法就是使用具有状态检测防火墙开启PASV的端口。

在PASV模式下是使用状态检测防火墙比acl最大的好处就是使用状态检测防火墙只要开启21端口就可以了,状态检测防火墙会检测客户端口连接FTP服务器的21命令端口,一但检测客户端使用21命令端口然后就会允许这个Session使用FTP服务器大于1024端口,而其他方式是无法直接访问FTP服务器大于1024端口。通过状态检测防火墙就可以保证FTP服务器大于1024端口只对FTP Session开放了。思科的ASA系列防火墙完全满足要求。

技巧:可以限制客户端访问服务器的端口范围。

对于IIS搭建的FTP服务器来说,可进行如下操作:

以下内容引用自:http://blog.sina.com.cn/s/blog_44e5d6d10100sbzh.html

通过 ADSUTIL 脚本配置 PassivePortRange

1 . 单击开始-运行,键入cmd, 然后确定
2 . 键入cd Inetpub\AdminScripts,然后按 Enter。
3 . 键入以下命令。
CSCRIPT.exe adsutil.vbs set /MSFTPSVC/PassivePortRange "5500-5515"
4 重新启动 FTP 服务。
通过 ADSUTIL 脚本配置时您会看到以下输出:
Microsoft (R) Windows Script Host 版本 5.6
版权所有 (C) Microsoft Corporation 1996 - 2001。 保留所有权利。

PassivePortRange (STRING) " 5500-5515 ":
注意:如果开了系统自带的防火墙,必须在例外里添加以上端口,也要添加5500-5515