ftp特殊性在于有两个通道,一个控制通道,一个数据通道。数据通道的建立依赖于控制通道,且数据通道的建立有两种模式:

主动模式:client和server控制连接建立好后,client通过控制通道告诉服务器使用主动模式,服务器则主动向客户端建立数据通道;

被动模式:client和server控制连接建立好后,client通过控制通道告诉服务器使用被动模式,客户端则主动向服务器建立数据通道。

主动模式下,客户端告诉服务器,客户端用于建立数据通道的地址和端口号(控制通道中的载荷数据),等待服务器的主动连接;

被动模式下,服务器告诉客户端,服务器用于建立数据通道的地址和端口号(控制通道中的载荷数据),等待客户端的主动连接。

在非NAT环境下,载荷数据不会发生改变,但在NAT环境中,载荷数据如果不发生改变,会导致数据通道建立失败。

下面详细介绍几种情形(本文中的NAT设备都是指cisco路由器):

一、FTP 客户端和FTP服务器同在一个局域网,无NAT(主动模式)

带ftp客户端的镜像 ftp服务器映射_服务器

二、FTP 客户端和FTP服务器同在一个局域网,无NAT(被动模式)

 

带ftp客户端的镜像 ftp服务器映射_服务器_02

三、FTP 客户端在内网,FTP服务器在外网,有NAT(主动模式)

带ftp客户端的镜像 ftp服务器映射_路由器_03

此情形下,处于公网的服务器主动去和一个私网ip的客户端建立数据通道,显然是不可能的-私网地址是不可能在公网上路由的。

注:cisco路由器默认是开启FTP ALG的,可以通过修改ftp的默认21号端口为其他端口如:2121,达到关闭FTP ALG的效果(系统会认为目的端口2121的应用才是ftp应用,目的端口21的是其他应用如web等,那么FTP ALG就不会将目的端口21应用中的载荷数据做NAT)。

NAT设备配置:

int g0/0
ip nat inside
ip add 192.168.1.254
int g0/1
ip nat outside
ip add 198.168.10.1
access-list 10 permit 192.168.1.0 0.0.0.255
ip nat inside source list 10 interface g0/1 overload
///修改ftp应用默认端口号21为2121
access-list 100 permit tcp any any eq ftp
ip nat service list 100 ftp tcp port 2121

使系统认为目的端口为2121的才为ftp应用,目的端口为21的为非ftp应用

四、FTP 客户端在内网,FTP服务器在外网,有NAT(主动模式-开启FTP ALG)

带ftp客户端的镜像 ftp服务器映射_服务器_04

此种情形下,FTP ALG将载荷数据中的(192.168.1.10,5567)做了NAT,转换成(198.168.10.1,8878)----一般情况下,端口号不变即(192.168.1.10,5567)-(198.168.10.1,5567),在此为了区别,故意将端口号也改变了。

NAT设备配置:

int g0/0
ip nat inside
ip add 192.168.1.254
int g0/1
ip nat outside
ip add 198.168.10.1
access-list 10 permit 192.168.1.0 0.0.0.255
ip nat inside source list 10 interface g0/1 overload

五、FTP 客户端在内网,FTP服务器在外网,有NAT(被动模式)

带ftp客户端的镜像 ftp服务器映射_带ftp客户端的镜像_05

NAT设备配置:

int g0/0
ip nat inside
ip add 192.168.1.254
int g0/1
ip nat outside
ip add 198.168.10.1
access-list 10 permit 192.168.1.0 0.0.0.255
ip nat inside source list 10 interface g0/1 overload
///修改ftp应用默认端口号21为2121
access-list 100 permit tcp any any eq ftp
ip nat service list 100 ftp tcp port 2121

总结:服务器在外,不开启FTP ALG的情形下,被动模式通,主动模式不通

六、FTP 客户端在外网,FTP服务器在内网,有NAT(主动模式)

带ftp客户端的镜像 ftp服务器映射_ftp_06

 

NAT设备配置:

int g0/0
ip nat inside
ip add 192.168.1.254
int g0/1
ip nat outside
ip add 198.168.10.1
ip nat inside source static tcp 192.168.1.10 21 198.168.10.1 21 extendable
///修改ftp应用默认端口号21为2121
access-list 100 permit tcp any any eq ftp
ip nat service list 100 ftp tcp port 2121
或者:ip nat inside source static tcp 192.168.1.10 21 198.168.10.1 21 extendable no-payload
//no-payload关键字 指示载荷数据不要转换

FTP 客户端在外网,FTP服务器在内网,有NAT(被动模式)

带ftp客户端的镜像 ftp服务器映射_cisco_07

此情形下,处于公网的客户端主动去和一个私网ip的服务器建立数据通道,显然是不可能的-私网地址是不可能在公网上路由的。

NAT设备配置:

int g0/0
ip nat inside
ip add 192.168.1.254
int g0/1
ip nat outside
ip add 198.168.10.1
ip nat inside source static tcp 192.168.1.10 21 198.168.10.1 21 extendable
///修改ftp应用默认端口号21为2121
access-list 100 permit tcp any any eq ftp
ip nat service list 100 ftp tcp port 2121
或者:ip nat inside source static tcp 192.168.1.10 21 198.168.10.1 21 extendable no-payload

//no-payload关键字 指示载荷数据不要转换

FTP 客户端在外网,FTP服务器在内网,有NAT(被动模式-开启FTP ALG)

带ftp客户端的镜像 ftp服务器映射_带ftp客户端的镜像_08

NAT设备配置:

int g0/0
ip nat inside
ip add 192.168.1.254
int g0/1
ip nat outside
ip add 198.168.10.1
ip nat inside source static tcp 192.168.1.10 21 198.168.10.1 21 extendable

总结:FTP服务器在内网,不开启FTP ALG,主动模式通,被动模式不通。

FTP 客户端和FTP服务器在内网,双NAT(主动模式)

带ftp客户端的镜像 ftp服务器映射_带ftp客户端的镜像_09

FTP 客户端和FTP服务器在内网,双NAT(被动模式)

带ftp客户端的镜像 ftp服务器映射_cisco_10

总结: FTP 客户端和FTP服务器同在内网,存在双NAT的情况下:

主动模式:靠近客户端的NAT设备需要开启FTP ALG

被动模式:靠近服务器端的NAT设备需要开启FTP ALG

注:ftp客户端和ftp服务器控制通道建立好了,就一直存在,除非通过命令主动关闭。

数据通道则是一次性的,即传输完数据后,马上就断开了。如果需要再传输数据,则需要新建数据通道。

例如:client端和server端控制通道建好后,client通过控制通道发送ls  -l命令给server端

1、主动模式下,服务器主动和客户端建立数据通道,建好通道后,服务器将ls -l的输出内容传输给客户端,数据传输完成后,服务器主动断开数据通道。同时通过控制通道告诉客户端,数据传输完毕。

2、被动模式下,客户端主动和服务器建立数据通道,建好通道后,服务器将ls -l的输出内容传输给客户端,数据传输完成后,服务器主动断开数据通道。同时通过控制通道告诉客户端,数据传输完毕。

client通过控制通道发送get  XXXX命令给server端,下载文件XXXX:

1、主动模式下,服务器再次主动和客户端建立数据通道,建好通道后,服务器将文件XXXX传输给客户端,数据传输完成后,服务器主动断开数据通道。同时通过控制通道告诉客户端,数据传输完毕。

2、被动模式下,客户端再次主动和服务器建立数据通道,建好通道后,服务器将文件XXXX传输给客户端,数据传输完成后,服务器主动断开数据通道。同时通过控制通道告诉客户端,数据传输完毕。

前后两次数据传输(ls -l 和get XXXX)过程中,控制通道始终保持连接状态不变,但是数据通道却建立了两次(前后两次的ip地址一样,但是端口号不同,随机的)。