首先,介绍一下ftp关于主动模式与被动模式的原理:
这一部分有什么作用? 如果你是在内网搭建一个ftp服务器进行测试,那么不必关注,那是很容易的,内网的机子
之间一般没有防火墙所以无关于主动模式和被动模式,但是在生产环境中,ftp服务器与客户端之间一般不止一个
防火墙,所以有必要弄清楚这个原理。
FTP是File Transfer Protocol(文件传输协议)的缩写,用来在两台计算机之间互相传送文件。相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。
FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
概括一下就是:
主动模式:服务器向客户端敲门,然后客户端开门
被动模式:客户端向服务器敲门,然后服务器开门
所以,如果你是如果通过代理上网的话,就不能用主动模式,因为服务器敲的是上网代理服务器的门,而不是敲客户端的门
而且有时候,客户端也不是轻易就开门的,因为有防火墙阻挡,除非客户端开放大于1024的高端端口
 
说一下生产环境中ftp的搭建:
基于上面的主动模式与被动模式的介绍,来说一下生产环境中ftp的搭建:
首先生产环境中的ftp应该采用被动模式,因为被动模式是始终是客户端向服务端去请求连接,而主动模式需要服务器去去连接客户端的端口,连接客户端的端口,如果客户端是公网ip且没有防火墙的话就没问题,但是现在的问题是
客户端一般都是经过nat地址转换的,服务器要连到客户端的时候连到的根本不是客户端,而是提供nat服务的那个设备,所以不能使用主动模式。

使用被动模式,如果使用被动模式的话,那么客户端在连接到服务端的21号端口后,需要传输数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
但是在生产环境中,不要忘记在服务器前面一般都要有防火墙设备的,而且默认策略都是disable,一般都是开启仅有的几个端口,其他端口就都关掉了,客户端连接服务器提供出来的那个端口时,会被防火墙就在中间拒绝掉了,
为了避免这种情况,需要在ftp服务器配置文件里把被动模式时开放的端口做一下限制,这样就可以限制危险
 

比如 vsftp的设置
编辑vsftpd的配置文件 /etc/vsftpd/vsftpd.conf

添加
pasv_max_port=3000
pasv_min_port=3020
# 此两行意思规定服务器在被动模式下开放端口时并不是在大于1024的端口中随机开放,而是开放这个范围内规定的端口
针对防火墙的改动:

除了记得开放21端口外还要记得在防火墙上开放3000--3020 这些端口

 
如果是iptables:
iptables -I INPUT -p tcp --dport 3000:3020 -j ACCEPT
如果是用防火墙设备,那么请在防火期设备上开启对提供ftp服务的主机的ip的3000-3020这些端口的访问,这样应该就没问题了