浅谈防火墙对FTP的影响及故障排除分析

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 的提权

对于利用方法大家可以看下这篇文章(http://www.jb51.net/books/552915.html),那么就需要屏蔽本地14147端口的对外连接(使用防火墙或ip安全策略)。

(0)

相关推荐

  • 浅谈防火墙对FTP的影响及故障排除分析

    FTP是常见的基于TCP的网络服务,它使用了两个TCP连接来建立逻辑通信信道,即控制连接和数据连接.当客户端与服务器建立一个FTP会话时,使用TCP创建一个持久的控制连接以传递命令和应答.当发送文件和其它数据传输时,它们在独立的TCP数据连接上进行传递,这个连接根据需要创建和拆除. 更为复杂的是,FTP标准指定了创建数据连接的两种不同方法,即正常(主动)数据连接和被动数据连接.FTP的控制连接总是由客户端首先发起的,主动数据连接是由服务器端发起的,被动数据连接是由客户端发起的. 成功建立控制连接

  • 浅谈HashMap中7种遍历方式的性能分析

    目录 一.前言 二.HashMap遍历 2.1.迭代器EntrySet 2.2.迭代器 KeySet 2.3.ForEachEntrySet 2.4.ForEach KeySet 2.5.Lambda 2.6.Streams API 单线程 2.7.Streams API 多线程 三.性能分析 四.字节码分析 五.EntrySet性能分析 六.安全性测试 6.1.迭代器方式 6.2.For 循环方式 6.3.Lambda 方式 6.4.Stream 方式 6.5.小结 七.总结 一.前言 随着

  • 雨哲浅谈关于防采集而不影响收录内容篇

    让站长最头痛的事,除了程序和服务器安全外,可能就要算内容被采集了.当然,现在网络本身就是资源共享,我这里不谈采集的对错,只是就防采集说说个人看法. 一.如何分辨搜索爬虫          以前,在网上看到过关于用asp代码来捕捉搜索爬虫的代码,通过代码把爬虫的访问记录记录到文件.就此代码(原作者未知)我作了修改,加入程序中防采集.现做成函数,直接在页面中调用. 复制代码 代码如下: Function CheckSearchRobots(SearchRobotsAgent)   CheckSear

  • 浅谈AnDroidDraw+DroidDraw实现Android程序UI设计的分析说明

    AnDroidDraw 是一个与 DroidDraw 集成的 Android 应用程序,它允许你从 DroidDraw 应用 程序下载你的 GUIs, 也允许你在一个 Android 设备上预览你的 GUIs1.先下载安装DroidDraw,我使用的版本是droiddraw-r1b222.下载AnDroidDraw.apk,并在模拟器上进行安装,安装步骤如下: 1)使用cmd进入命令行窗口,进入你安装的android-sdk下的platform-tools目录,如图: 2)使用: adb ins

  • 浅谈DOCTYPE对$(window).height()取值的影响

    前言:公司项目需要用到一个弹框垂直居中,网上类似的垂直居中弹出层大同小异,因为项目是基于Jquery 下的,所以用$(window).height()-layer.height())/2 +$(document).scrollTop()取得垂直的位移.测了各种浏览器没问题,后台人员移值到项目中后,出问题了,当页面超出一屏时,在 chrome和FF下,弹出框不是在当前屏的垂直居中,而是相对于整个网页的居中. 查阅各方资料,所有结论都指出: 1.窗口高度,$(window).height() 2.文

  • 浅谈synchronized方法对非synchronized方法的影响

    StringBuilder是线程不安全的类. StringBuffer是线程安全的,因为它里面的方法加了synchronized. 今天写了一段代码测试了一下:用循环开启10个线程,调用StringBuffer(StringBuilder)的append追加1 到 10 . 结果预期一样:线程不安全的StringBuilder会漏掉一些数字, public static void main(String[] args) throws InterruptedException { StringBu

  • 浅谈vue异步数据影响页面渲染

    今天遇到一个问题,要保证页面渲染前请求的数据已经得到了 由于user是在异步请求之后保存在session中,而在页面渲染时session中还没有user,页面直接报错. 因此我希望能在所有请求都得到后再去做页面的渲染. 1.先把id为app的div用v-if="appShow",定义appShow为false进行隐藏,避免渲染 2.写计数器,每1ms进行一次查询,如果session中已经有user,删除过滤器,移除滤布,appShow为true,开始渲染页面,这样可以保证页面的正常渲染

  • 浅谈pytorch卷积核大小的设置对全连接神经元的影响

    3*3卷积核与2*5卷积核对神经元大小的设置 #这里kerner_size = 2*5 class CONV_NET(torch.nn.Module): #CONV_NET类继承nn.Module类 def __init__(self): super(CONV_NET, self).__init__() #使CONV_NET类包含父类nn.Module的所有属性 # super()需要两个实参,子类名和对象self self.conv1 = nn.Conv2d(1, 32, (2, 5), 1,

  • 浅谈C# StringBuilder内存碎片对性能的影响

    StringBuilder内部是由多段char[]组成的半自动链表,因此频繁从中间修改StringBuilder,会将原本连续的内存分隔为多段,从而影响读取/遍历性能. 连续内存与不连续内存的性能差,可能高达1600倍. 背景 用StringBuilder的用户可能大都想用StringBuilder拼接html/json模板.组装动态SQL等正常操作.但在一些特殊场景中--如为某种编程语言写语言服务,或者写一个富文本编辑器时,StringBuilder依然也有用武之地,通过里面的Insert/R

  • 浅谈vue 多个变量同时赋相同值互相影响

    首先,该项目用到了element-ui中的Tabs 标签:然后来龙去脉是酱紫的: 一个项目中需动态渲染一个列表billItemLIsts,列表中包含n组小列表,其中小列表的state_pj用于改变该小列表中的radio,于是: <el-tabs tab-position="left" style="max-height:280px;"> <el-tab-pane v-for="(itema,index) in billItemLIsts&

随机推荐