ftp特殊性在于有两个通道,一个控制通道,一个数据通道。数据通道的建立依赖于控制通道,且数据通道的建立有两种模式:
主动模式:client和server控制连接建立好后,client通过控制通道告诉服务器使用主动模式,服务器则主动向客户端建立数据通道;
被动模式:client和server控制连接建立好后,client通过控制通道告诉服务器使用被动模式,客户端则主动向服务器建立数据通道。
主动模式下,客户端告诉服务器,客户端用于建立数据通道的地址和端口号(控制通道中的载荷数据),等待服务器的主动连接;
被动模式下,服务器告诉客户端,服务器用于建立数据通道的地址和端口号(控制通道中的载荷数据),等待客户端的主动连接。
在非NAT环境下,载荷数据不会发生改变,但在NAT环境中,载荷数据如果不发生改变,会导致数据通道建立失败。
下面详细介绍几种情形(本文中的NAT设备都是指cisco路由器):
一、FTP 客户端和FTP服务器同在一个局域网,无NAT(主动模式)
二、FTP 客户端和FTP服务器同在一个局域网,无NAT(被动模式)
三、FTP 客户端在内网,FTP服务器在外网,有NAT(主动模式)
此情形下,处于公网的服务器主动去和一个私网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 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(被动模式)
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(主动模式)
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(被动模式)
此情形下,处于公网的客户端主动去和一个私网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)
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服务器在内网,双NAT(被动模式)
总结: 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地址一样,但是端口号不同,随机的)。