当两次NAT碰到FTP ALG (一)

      相信大家都在出口相关项目中,碰到过FTP服务器访问的问题吧,其实FTP协议是一个很经典和有代表性的问题,因为它和传统的单连接应用(传统的web类应用)不一样,有2个独立的连接:控制连接和数据连接,正是因为这点不同,导致在和出口NAT设备配合使用的时候,因为其独特的协议行为而引起访问问题。而要解决这些访问问题,则需要出口NAT设备配合,既NAT设备支持的FTP ALG。而在不同的网络场景中,相关配置又不相同,最复杂的莫过于两次NAT以后的FTP访问问题,最近我就碰到一个两次NAT以后的FTP访问问题,第一次是链路均衡设备的内向NAT,第二次是防火墙的NAT,结果就遇到了访问问题,经过分析以后找到了原因,所以就在本文中总结一下,需要了解的基本概念为:ftp协议运作细节、ftp ALG工作原理。

      要想深入分析原因,首先需要对ftp协议工作原理有个清晰的认识。

1、  控制连接

 ftp协议要正常工作,需要首先成功建立控制连接,默认情况下,是由ftp客户端向ftp服务器的端口21发起连接请求,通过3次握手成功建立控制连接。控制连接建立之后,ftp客户端会和ftp服务器端协商数据连接建立的方式,有2种方式:主动模式、被动模式,这两种方式分别适用于不同的网络场景。

2、  数据连接

ftp客户端和ftp服务器端协商好数据连接采用的方式以后,就会用协商好的方式建立数据连接。大家平时使用ftp客户端软件连接ftp服务器并且看到的文件列表,就是通过数据连接传送的。因此,ftp映射通常碰到的一个问题,列目录超时,就是数据连接无法成功建立的原因。

       现实环境中,ftp客户端和ftp服务器端的网络位置分多钟类型:

   场景1ftp客户端和ftp服务器端同时位于私有网络,所有端口可达(或者同时位于internet,所有端口可达)

   场景 2ftp客户端位于NAT设备后,ftp服务器位于公网

   场景 3ftp客户端位于公网,ftp服务器位于NAT设备之后的私有网络

   场景 4ftp客户端和ftp服务器端均位于NAT设备之后的私有网络。

 

      再不启用FTP ALG的时候,场景234会碰到不同的问题,在分析2,3,4前,我们

      先详细分析一下场景一的ftp客户端和ftp服务器端的交互行为。

 

   A、我们先分析数据连接采用主动模式时候的行为:

1、  控制连接

 

如上图所示,ftp客户端首先会主动与ftp服务器的21端口通过3次握手建立一个tcp连接,这个tcp连接既为控制连接。客户端和服务器端在控制连接上用ftp特有的7层命令来协商数据连接的建立方式。在场景1的主动模式中,ftp客户端告诉ftp服务器端自己会在192.168.10.50IP地址和2000端口上等待ftp服务器端主动发起的数据连接请求。

 

如上图所示,在协商成功数据连接用主动模式建立之后,ftp服务器端会以端口20为源端口,192.168.10.50为目标IP2000为目标端口,通过一个新的3次握手建立一条tcp连接,这条连接既为数据连接。这条连接一旦成功建立,在ftp客户端上就可以进行文件列表查询,上传下载等行为。

 

     B、再分析数据连接采用被动模式时候的行为:

        1、控制连接

和主动模式相似,ftp客户端首先会主动与ftp服务器的21端口通过3次握手建立控制连接,而与主动模式不同的是,ftp客户端会用pasv命令告诉ftp服务器端,自己会主动发起数据连接的建立,所以ftp服务器端会用port命令告诉ftp客户端,自己会在192.168.10.200上的2000端口等待ftp客户端的连接。

      随后ftp客户端会以大于1024的随机端口为源端口,192.168.10.200为目标IP2000端口为目标端口,发起新的3次握手,成功建立数据连接。

 从上诉描述来看,所谓主动模式和被动模式,是争对ftp服务器主动发起数据连接建立请求还是被动接受数据连接请求来区分的。

在场景1中,不论是主动还是被动模式,都是可以成功建立的,因为同在私有网络或者同在internet上,正常情况下客户端和服务器端的IP都是互相可达的,且端口也是全部可达。但是对于场景2,3,4,情况就不一样了。

t.d.