FTP的客户端和服务器端都处在防火墙(NAT)后面如何通信?

首先来介绍一些基础知识:
1、一般我们说的连接FTP服务器的哪个端口,是指的FTP服务器的指令端口,其实数据的传送还需要其他端口辅助;为了简单,我们将其成为指令端口和数据端口;

2、FTP数据传输分两种模式,主动模式和被动模式;



下图中FTP客户端是A,服务器端是B,网络上直通:



主动模式:
A通过一个随机端口连接B的指令端口(默认为21,well-konwn port),有数据需要传输的时候,A通过PORT命令告知B自己开启了另外一个随机数据端口,此时B从数据端口(默认为20)主动发起连接到A,完成数据传输
例如:PORT 211,1,2,3,17,24,意思是A开通了211.1.2.3的4376端口等待B来链接

被动模式:
A通过一个随机端口连接B的指令端口,有数据需要传输的时候,B通过227命令告知A自己开了另外一个随机数据端口,此时A也开启另外一个随机数据端口连接B,B是被动等待连接
例如:227 Entering Passive Mode (211,1,2,3,31,166),意思是B开通了211.1.2.3的8102端口等待A来链接

上述随机端口一般是大于1024的端口



明白了主动和被动的原理之后,再来看看如果A、B都在防火墙后面,与公网通信都依靠NAT实现,要如何才能完成整个通信和数据传输过程;通常如果不做特殊设置,一般表现为可以登录,但是不能传输数据或者列目录信息,出现超时等错误




主动模式:
1、对于B侧防火墙,需要开通公网地址到内网FTP服务器地址指令端口的映射,一般是21;因为数据端口20是B主动发起,可通过NAT机制完成,因此不需要开通端口映射;
2、对于A侧防火墙,需要开通公网地址到内网FTP客户端大于1024的数据端口映射,或者把这个客户端地址设置为防火墙的DMZ,即全部公网地址的请求都转发到此客户端

被动模式:
1、对于B侧防火墙,需要开通公网地址到内网FTP服务器地址指令端口的映射和大于1024的数据端口映射
2、对于A,无特殊要求



看了上面的要求都很复杂,特别是大于1024的数据端口映射全开,在很多管理下面都是不允许的,只能按需开放,这里就需要利用FTP服务器端的特殊功能来解决,这里以ServU为例,其他的软件就要看是否有类似功能了。



这里介绍的方法只能采用被动模式:
1、对于B侧防火墙,需要开通公网地址到内网FTP服务器地址指令端口的映射和大于1024的一个或者一段数据端口映射,例如8101-8102

2、对于A,无特殊要求

3、对于ServU软件,需要做一下两个配置:
3.1、设置被动端口范围,这个是解决被动端口需要开放端口太多的问题

3.2、设置防火墙对应映射的公网IP,这个是解决由于服务器端放置在防火墙内部,一般是一个私网地址,在发送227指令的时候会将私网地址填进去,这样对于客户端来说是无法连接到的
这个配置不做有一些FTP客户端和IE浏览器无法传输数据,不过我发现FlashFXP似乎“智能”一些,设不设没影响



4、对于客户端软件,要设置为强制使用被动模式,以FlashFXP为例: