FTP是常见的基于TCP的网络服务,它使用了两个TCP连接来建立逻辑通信信道,即控制连接和数据连接。当客户端与服务器建立一个FTP会话时,使用TCP创建一个持久的控制连接以传递命令和应答。当发送文件和其它数据传输时,它们在独立的TCP数据连接上进行传递,这个连接根据需要创建和拆除。
更为复杂的是,FTP标准指定了创建数据连接的两种不同方法,即正常(主动)数据连接和被动数据连接。FTP的控制连接总是由客户端首先发起的,主动数据连接是由服务器端发起的,被动数据连接是由客户端发起的。
成功建立控制连接后,在进行主动连接时,客户端发送PORT命令,其中内嵌了地址和端口信息,以告知服务器进行连接,然后服务器打开默认端口20建立到客户端已告知地址和端口的数据连接。在进行被动连接时,客户机使用PASV命令告诉服务器等待客户机建立数据连接,服务器响应,告诉客户机为了数据传输它应该使用服务器上的什么端口(随机打开)。这种工作机制带来了一个严重的问题:在FTP的命令(PORT或PASV)或对它们的回答中传递IP地址及端口号与网络分层机制严重冲突,在FTP客户端与服务器的通信信道之间的网关设备(防火墙或路由器)上启用了NAT功能的情况下将出现连接性问题。
防火墙对于像FTP这样的多端口连接的TCP应用,其影响是深远的,在复杂的网络环境中,更是由于设备、软件的多样性可能导致不可预知的问题。作为一名网络管理员,深入了解防火墙和FTP的工作原理及其在NAT环境下防火墙对FTP的影响,对于选择FTP服务软件及安装、部署、管理及维护FTP服务和实际工作中排除FTP应用故障是大有裨益的。本文就以一个在实际环境中比较常见的FTP部署和应用拓扑为例,来详细解读防火墙(启用了NAT功能)对FTP的影响。如有不当之处,敬请指正。
一、网络拓扑图
二、主动模式的连接分析
如本例中网络拓扑所示,IP为192.168.1.1客户端计算机打开一个可用的TCP端口1025,经过其前端的防火墙进行NAT转换成地址1.1.1.1和端口1025后建立到目标地址为2.2.2.2的21端口的连接,然后服务器前端的防火墙将此连接信息传递到服务器172.16.6.1的21端口,成功建立FTP控制连接。
服务器则经由这个已经建立的逻辑连接通道返回数据包,与客户端进行交互。接着,客户端发出PORT指令,在指令中嵌入了地址信息(IP:192.168.1.1,Port:1026),告知服务器用于数据连接,并打开端口1026,等待服务器连接。当承载PORT指令的数据包到达客户机前端的防火墙时,由于NAT的缘故,在成功创建NAT表项,改写数据包的IP和TCP端口信息后:
如果此时防火墙不能识别并检查此连接是FTP应用,便不能对PORT指令中嵌入的地址和端口信息进行改写,则将此数据包通过先前已建立的控制连接通道传递到服务器后,服务器则打开20端口,将建立到192.168.1.1的1026端口的数据连接。
显然,此连接数据包要么被其前端的防火墙丢弃,要么在流入因特网后立刻被丢弃,永远无法到达客户端。在这种情况下,客户端一直处在控制连接阶段发送含有PORT指令的数据包,以便建立数据连接;而服务器则在打开了20端口后,一直尝试建立到客户端的数据连接,但始终收不到应答。
直接的结果就是:客户端成功连接了FTP服务器,却无法进行数据传输。这里可能还包含一个隐藏的安全威胁:如果恰巧192.168.1.1对于服务器主机来说是直接可达的,则此时服务器便将数据包发送到这台计算机,在这两台主机之间产生莫名的数据流。其他可能更隐蔽、更不好的情况,笔者不再做假设论述了。
如果此时防火墙能支持对FTP应用进行审查和跟踪,即能识别PORT指令中的内容,就将其中嵌入的地址信息改写成(IP:1.1.1.1,PORT:1026)并动态打开1026端口,并建立新的NAT转换表项,等待连接,则当服务器收到PORT指令后,打开20端口,建立到1.1.1.1上1026端口的连接,成功交互后,便能进行数据传输了。
三、被动模式的连接分析
控制连接建立后,客户端发出的PASV指令到达服务器,服务器则随机打开一个可用的TCP端口,并将地址和端口信息(IP:172.16.6.1,Port:50000)返回给客户端,告知客户端利用这些信息进行数据连接。当包含服务器地址信息的这个数据包到达其前端的防火墙时:
如果防火墙不能识别并检查此数据包的应用层数据,无法判定它是FTP的PASV指令的返回包,并对其中嵌入的地址信息进行重写,则当此数据包返回到客户端时,客户端将随机打开端口3000,以目的地址172.16.6.1、端口50000来进行数据连接,同理,此连接数据包永远不能到达服务器端。
这种情况下,客户端将一直尝试建立数据连接,却总是不能收到应答。这里可能包含的隐藏安全威胁,如前所述。
如果防火墙能对FTP应用进行审查和跟踪,并将返回包中嵌入的服务器地址信息进行重写,即转换成(IP:2.2.2.2,Port:50000),然后建立新的NAT表项,动态打开50000端口,等待连接。则此返回包到达客户端时,客户端将随机打开端口3000,以目的地址2.2.2.2、端口50000来新建连接,便能成功建立数据连接。
根据以上分析,为成功进行FTP数据传输,主动模式下要求客户机前端的防火墙在启用NAT后能对FTP应用进行审查和跟踪,识别并改写PORT指令中的客户端地址信息;被动模式下则要求服务器前端的防火墙能改写服务器响应PASV指令后返回数据包中的服务器地址信息。
当然,为保险起见,为保证FTP应用的正常使用,建议两端的防火墙都需要支持对FTP进行识别和内容审查。
四、网络防火墙与FTP
大多数网管设置防火墙的默认访问控制策略是:允许从内部到外部的一切流量,禁止从外部到内部的一切流量。
就FTP应用来说,为了简化防火墙策略的配置又兼顾安全策略要求,客户机选择被动模式进行数据连接较好,不需要对其前端的防火墙设置特别的访问控制策略,但要求服务器前端的防火墙能动态打开数据连接所需的随机端口;服务器端则选择主动连接较好,为允许客户端的访问,其前端防火墙的访问控制策略仅需要显式对外开放21端口即可,但需要客户机前端的防火墙能动态打开数据连接所需的端口。
从方便使用的角度考虑,既然提供FTP服务,就要配置好服务器前端的防火墙,使其访问控制策略能支持两种模式下的FTP服务正常工作。
如果客户机前端的NAT设备为路由器,不是防火墙,并不能审查和跟踪FTP应用,从前面的分析可以推断出,主动模式下肯定存在连接性问题,需要以被动方式建立数据连接才能成功使用FTP服务。
如果FTP控制端口非默认,而是定制的TCP端口(比如2121),在这种情况下,服务器前端的防火墙通过配置命令显式指示FTP的控制端口,便能进行审查和跟踪。但客户机前端的防火墙即使其能识别默认端口下的FTP应用,此时也会把控制端口非21的FTP服务当作一般的TCP应用对待,这种情形下,便不能改写主动模式下的客户端地址端口信息,导致服务器在建立数据连接时失败,但客户端使用被动连接模式能正常工作。
综上所述,客户端使用被动方式连接FTP服务器是最恰当的,能最大限度地降低连接性问题。同时降低了对客户机前端防火墙备的要求,不需要像主动方式那样动态开放允许输入的随机端口,把可能的安全威胁推给了服务器端。这或许是微软的IE浏览器(资源管理器)默认设置使用被动方式的原因。如图表2所示。另外需要注意的,在Windows命令行下,FTP默认是使用主动方式进行数据连接的。
五、主机防火墙与FTP
如果将FTP服务器架设在Windows Server 2008上,由于它内置Windows防火墙,而且默认已经启用,所以客户端建立到这台FTP服务器的控制连接便会被封锁,此时需要在防火墙上开放对TCP 21端口的传入连接。
被动模式下,由于服务器通过控制信道将用来监听客户端请求的端口号是随机产生的,此时需要在防火墙上开放的传入连接的端口也是随机的。由于Windows防火墙不能像网络防火墙那样根据需要动态打开和关闭FTP服务要求的随机端口,所以需要静态开放全部可能的随机端口。
Windows Server 2008默认的动态端口范围是49152-65535,而Windows防火墙的例外开放规则只能针对单一端口来开放,要开放49152-65535这个范围内的一万多个端口,非常不切实际,更是会给运行FTP服务器的主机带来严重的安全威胁。
所幸的是,基于IIS7.0建立的FTP服务器允许将端口号固定在自行指定的一个范围中,如50000-50005,此时便只需要开放这一小段范围的端口即可,大大提升了安全性和配置Windows防火墙的效率。如果服务器上部署的是第三方防火墙,则需要慎重考虑如何设置使之能安全保障FTP服务的正常运行。
小编补充:
因为现在大家服务器基本上都是用 FileZilla Server FTP服务器,他的例外方法就是通过添加端口或FileZilla server.exe为例外,最近因为针对 FileZilla Server 的提权
对于利用方法大家可以看下这篇文章(https://www.jb51.net/books/552915.html),那么就需要屏蔽本地14147端口的对外连接(使用防火墙或ip安全策略)。