【转】ftp ALG 功能实现的概要说明

时间:2022-11-09 13:59:53

【转】ftp ALG 功能实现的概要说明  

2009-09-16 10:21:56|  分类: LINUX|字号 订阅

近阶段了解了一下ALG,有些体会做一个记录,以供以后查阅。
ALG,Application Layer Gateway的缩写,这是一般网络设备或者主机都必备的一个小模块,那ALG是为了完成一个什么功能呢?
这首先要从IPV4的地址过少说起,因为IPV4地址过少,所以规定了部分地址给内部分配使用,这种地址段在互联网上是不分配的,其中有10.X.X.X和192.168.X.X,一般公司较大的就用前一种,公司较小的就用后一种。(比如我在公司的机器就是192.168.5.188)
这样使用内部地址的机器要访问一个外部网络的服务器时,如大家平时在公司通过本地局域网的网关或路由器访问雅虎,这个时候网关或者路由器上必须有一个网络地址转换模块(NAT),可以把你的报文中的内部地址(192.168.X.X)转换成一个你从ISP处得到的外部地址,这样来完成网络访问。
但是有一部分协议,像FTP,它分为控制连接和数据连接。如果你ftp一个外部服务器时,你的本机也就是客户端,客户端会和服务器端首先建立一个控制连接,这个时候一般连接的是服务器端的端口21,但是客户端和服务器端需要传递文件的时候,都要先通过控制连接协商出一个数据连接来。详细说明如下:
FTP数据连接的协商分为两种模式,一种是主动模式,另一种是被动模式。
主动模式的特点是,在客户端和服务器端要进行文件传递时,首先是客户端使用一个报文告诉服务器端,它将用某个IP地址的某个端口作为数据连接(这个信息就是报文的载荷),也就是通常说的PORT命令。服务器端收到这个报文后,回应一个同意的ACK报文,然后服务器端会主动用自己的IP地址加上端口20来发送一个SYN报文到客户端通过PORT命令告诉它的那个IP地址和端口,和客户端建立起一个数据连接。
被动模式的特点是,在客户端和服务器端要进行文件传递时,首先是服务器端通过一个报文告诉客户端,它将用那一个IP地址的那一个端口作为数据连接(该报文以命令字227开始),也就是PASV命令。客户端收到这个报文之后,回应一个同意的ACK报文。然后客户端会用自己的IP地址,然后任选一个能够使用的端口(注意:通常情况下都不是20)和服务器端告诉它的那个IP地址和端口相连接,建立数据连接。
了解完了这两种模式,就知道在客户端的报文经过了路由器NAT之后,服务器端看到的报文的客户端的报文的IP源地址和端口都已经被改变了,当然对于控制连接来说这没有影响,因为有网关或者路由器的NAT模块在中间做管理,但是对于正要通过控制连接建立的数据连接就有问题了,因为NAT改变的仅仅是IP报文头,而对于因为报文中PORT命令中包含的地址和端口信息没有做任何改动,这样服务器是无法和一个内部地址建立连接的,所以这个时候就出现了ALG这个功能。ALG就是在发现如果报文头做了NAT,在这个时候如果发现这个是一个FTP的连接的时候(还有很多其他的连接也需要做ALG的,这里仅仅是为了说明FTP的情况),就需要同时改变PORT命令中的地址和端口(当然,这个地址和端口也必须通过NAT分配的机制来获得)。
因为FTP是一个TCP的连接,如果更改报文内容,那么就涉及到整个TCP连接的一些参数的更改,比如sequence number,TCP报文的checksum等等。当然也还存在某种时候要做ALG,某种时候不需要做ALG,这就需要按照具体是在哪个系统上实现具体对待了。