NAT ALG与FTP联动工作原理
普通NAT实现了对UDP或TCP报文头中的的IP地址及端口转换功能,但对应用层数据载荷中的字段无能为力,在许多应用层协议中,比如多媒体协议(H.323、SIP等)、FTP、SQLNET等,TCP/UDP载荷中带有地址或者端口信息,这些内容不能被NAT进行有效的转换,就可能导致问题。而NAT ALG(Application Level Gateway,应用层网关)技术能对多通道协议进行应用层报文信息的解析和地址转换,将载荷中需要进行地址转换的IP地址和端口或者需特殊处理的字段进行相应的转换和处理,从而保证应用层通信的正确性。
例如,FTP应用就由数据连接和控制连接共同完成,而且数据连接的建立动态地由控制连接中的载荷字段信息决定,这就需要ALG来完成载荷字段信息的转换,以保证后续数据连接的正确建立。
FTP需要用到两个连接:控制连接与数据连接,控制连接专门用于传输FTP控制命令及命令执行信息传送;数据连接专门用于传输数据(上传/下载)。
FTP有两种不同工作模式:PORT(主动模式)与PASV(被动模式)。PORT(主动模式)是指FTP建立数据连接时,是由FTP服务器主动连接客户端的数据端口;而PASV(被动模式)是指服务器被动地等待客户端连接自己的数据端口。
根据FTP服务器和客户端的位置不同,又可以分为FTP服务器在内网,而用户的客户端在外网的情况;和FTP服务器在外网,而用户的客户端在内网的情况。这两种情况和上述两种FTP的工作模式相组合,就有四种可能性,下面就这四种情况进行详细分析。
如图1所示,位于内部网络的客户端以PORT方式访问外部网络的FTP服务器,经过中间的设备进行NAT转换,该设备上使能了ALG特性。
一、FTP服务器在内网,而用户的客户端在外网的情况
1、采用被动模式(PASV)、ALG未开启情况下的连接过程
如图1所示,位于外网的客户端以PASV方式访问内网的FTP服务器,中间的内网网关设备已经配置了NAT Server功能,可以实现将FTP服务器的global地址(公网地址)转换为local地址(私网地址)。该设备在没有使能ALG特性前,通信流程如下所示。

图1PASV模式、ALG未开启的连接过程
(1)建立控制通道
客户端向服务器发送TCP连接请求。TCP连接建立成功后,服务器和客户端进入用户认证阶段。若TCP连接失败,服务器会断开与客户端的连接。
(2)用户认证
客户端向服务器发送认证请求,报文中包含FTP命令(USER、PASSWORD)及命令所对应的内容。如果用户名或密码不正确,认证没通过,则丢弃报文。如果用户名和密码都正确,则通过认证,才能和服务器建立数据连接,进行数据的交互。
(3)客户端和服务器设置FTP模式
客户端向服务器发送PASV命令,通知服务器开启PASV被动模式,服务器开启PASV模式后,会在发送给客户端的PASV响应报文中携带自己的私网地址和端口号(172.16.0.4,2049),告诉客户端连接自己的这个地址和端口号,随后服务器开始在该地址和端口监听,等待客户端连接自己。由于没有启动ALG功能,所以在经过内网网关的时候,PASV响应报文中的地址和端口号不变,仍然是私网地址和端口号。
(4)创建数据通道,数据交互
客户端随机选择一个空闲端口4302,连接服务器私网地和端口号(址172.16.0.4,2049),由于这是私网地址,沿途路由器没有去往目的地址的路由,导致连接失败。
在FTP服务器端抓包如图2所示

图2PASV模式、ALG未开启下内网网关公网接口抓包

图3 PASV模式、ALG未开启下服务器发回的PASV响应报文
由上抓包可知:被动模式(PASV)的连接过程是客户端程序首先为自己随机分配一个TCP端口,使用这个端口向服务器的FTP端口发出连接请求,服务器接受请求之后会建立一条控制链路,然后客户端程序发出PASV命令,要求服务器采用PASV模式建立数据连接,服务器便为自己随机分配一个数据通道端口,并将自己的私网地址和这个端口号告诉客户端程序(通常格式为:Entering Passive Mode (A1,A2,A3,A4,P1,P2),其中A1,A2,A3,A4为服务器IP地址,P1×256+P2为随机端口号)。当需要传送数据时,客户端程序采用另一个随机端口向服务器提供的数据通道端口发送连接请求,由于172.16.0.4是私网地址,沿途路由器没有去往目的地址的路由,导致连接失败。
2、采用被动模式(PASV)、ALG开启情况下的连接过程
如图4所示,位于外网的客户端以PASV方式访问内网的FTP服务器,中间的内网网关设备已经配置了NAT Server功能,可以实现将FTP服务器的global地址(公网地址)转换为local地址(私网地址)。该设备在开启ALG特性后,通信流程如下所示。

图4PASV模式、开启ALG的连接过程
(1)建立控制通道
客户端向服务器发送TCP连接请求。TCP连接建立成功后,服务器和客户端进入用户认证阶段。若TCP连接失败,服务器会断开与客户端的连接。
(2)用户认证
客户端向服务器发送认证请求,报文中包含FTP命令(USER、PASSWORD)及命令所对应的内容。如果用户名或密码不正确,认证没通过,则丢弃报文。如果用户名和密码都正确,则通过认证,才能和服务器建立数据连接,进行数据的交互。
(3)客户端和服务器设置FTP模式
客户端向服务器发送PASV命令,通知服务器开启PASV被动模式,服务器开启PASV模式后,会在发送给客户端的PASV响应报文中携带自己的私网地址和端口号(172.16.0.4,2049),告诉客户端连接自己的这个地址和端口号,随后服务器开始在该地址和端口监听,等待客户端连接自己。由于启动了ALG功能,所以在经过内网网关的时候,PASV响应报文中的私网地址和端口号被ALG转换为公网地址和端口号(202.108.0.4,51201)。
(4)创建数据通道,数据交互
客户端随机选择一个空闲端口4302,连接服务器地址和端口号(202.108.0.4,51201),由于这是公网地址,沿途路由器可以找到目的地址,数据包到达内网网关路由器的时候,由NAT协议将公网地址和端口号(202.108.0.4,51201)转换为私网地址和端口号(172.16.0.4,2049),继而找到FTP服务器,通过TCP三次握手建立FTP数据连接,客户端和服务器之间通过数据通道来进行数据传输。

图5PASV模式、开启ALG下内网网关公网接口抓包

图6 PASV模式、开启ALG下服务器发回的PASV响应报文
3、采用主动模式(PORT)的连接过程(ALG是否开启不会影响PORT模式)
如图7所示,位于外网的客户端以PORT方式访问内网的FTP服务器,中间的内网网关设备已经配置了NAT Server功能,可以实现将FTP服务器的global地址(公网地址)转换为local地址(私网地址)。通信流程如下所示。
图7PORT模式的连接过程
(1)建立控制通道
客户端向服务器发送TCP连接请求。TCP连接建立成功后,服务器和客户端进入用户认证阶段。若TCP连接失败,服务器会断开与客户端的连接。
(2)用户认证
客户端向服务器发送认证请求,报文中包含FTP命令(USER、PASSWORD)及命令所对应的内容。如果用户名或密码不正确,认证没通过,则丢弃报文。如果用户名和密码都正确,则通过认证,才能和服务器建立数据连接,进行数据的交互。
(3)客户端和服务器设置FTP模式
客户端向服务器发送PORT命令,通知服务器开启PORT被动模式,并告诉服务器连接IP地址是123.119.113.123,端口号是2065=8×256+17。随后客户端开始在该地址和端口监听,等待服务器主动连接自己。
服务器开启PORT模式后,会在发送给客户端的PASV响应报文中携带自己的私网地址和端口号(172.16.0.4,2049)。由于启动了ALG功能,所以在经过内网网关的时候,PASV响应报文中的私网地址和端口号被转换为公网地址和端口号(202.108.0.4,51201)。
(4)创建数据通道,数据交互
服务器开启PORT模式后,使用自己的私网地址和FTP公认的数据端口号(172.16.0.4,20),连接客户端地址和端口号(123.119.113.123,2065),由于这是公网地址,沿途路由器可以找到目的地址,数据包到达内网网关路由器的时候,由NAT协议将源地址和端口号(172.16.0.4,20)转换为公网地址和端口号(202.108.0.4,20),继而找到客户端主机,并通过TCP三次握手建立FTP数据连接,客户端和服务器之间通过数据通道来进行数据传输。

图8PORT模式下内网网关公网接口抓包

图9 PORT模式下客户端发送的PORT报文
总结:
FTP服务器在内网,而用户的客户端在外网的情况下
l 如果使用主动PORT模式,因为是内网服务器主动连接外网的客户端主机,由外网的客户端将自己的公网地址和端口告诉内网的服务器,因为是公网地址,所以内网的服务器可以直接找到外网的客户端,并建立TCP连接,故而不需要开启ALG就能跟内网的FTP服务器建立连接。
l 如果使用被动PASV模式,因为是由外网的客户端连接内网服务器,内网的服务器需要将自己的私网地址和端口告诉告诉外网的客户端,则必须在网关路由器开启ALG,将服务器私网地址和端口转换为服务器的公网地址和端口,外网客户端才能先通过服务器的公网地址和端口找到网关路由器,然后由网关路由器进行NAT地址转换,将服务器的公网地址和端口转换为服务器私网地址和端口,外网的客户端才能访问到内网的服务器。
二、FTP服务器在外网,而用户的客户端在内网的情况
在这种情况下,数据通信过程跟上述内容类似,使用ALG的情况正好相反:
l 如果使用主动PORT模式,因为是由外网的服务器主动连接内网客户端主机,内网的客户机需要将自己的私网地址和端口告诉告诉外网的服务器,则必须在网关路由器开启ALG,将客户端私网地址和端口转换为客户端的公网地址和端口,外网服务器才能先通过客户端的公网地址和端口找到网关路由器,然后由网关路由器进行NAT地址转换,将客户端主机的公网地址和端口转换为客户端私网地址和端口,外网的服务器才能访问到内网的客户端。
l 如果使用被动PASV模式,因为是内网客户端主机连接外网的服务器,由外网的服务器将自己的公网地址和端口告诉内网的客户端主机,因为是公网地址,所以内网的客户端主机可以直接找到外网的服务器,并建立TCP连接,故而不需要开启ALG就能访问到外网的FTP服务器。

