FTP支持两种模式,主动模式(standard模式,也称PORT方式)和被动模式(Passive模式,也称PASV方式),主动模式FTP的客户端发送PORT命令到FTP服务器,被动模式FTP的客户端发送PASV命令到FTP服务器。
主动模式FTP的客户端首先用一个大于1024的端口N和FTP服务器的TCP21 命令端口建立连接,通过该通道发送PORT命令,命令包含了客户端用什么端口(一般是N+1端口)接受数据或发送数据,客户端同时开放另一端口N+1,在传送数据时,服务器端通过自己的20数据端口连接客户端的N+1端口,发送数据或者接受数据。FTP服务器必须和客户端建立一个新的连接来传送数据,即:我客户端主动告知你服务器我用哪个端口来发送或者接受数据,等待服务器来连接客户端,换言之,FTP服务器主动连接客户端。(此时有可能因为客户端身处防火墙后,N+1不能被服务器的20端口连接到。)
被动模式在建立控制通道时候和主动模式类似,但客户端通过端口N(也是大于1024)发送的是PASV命令,并同时打开N+1端口监听,此时FTP服务器打开一个位于1024到5000之间的一个随机端口通知客户端,然后通过该随机数据端口连接客户端的N+1的端口,此时FTP服务器不需要和客户端建立一个新的客户端连接,即我客户端被动的等待你服务器告知我用那个端口发送或者接受数据,客户端再来连接服务器,换言之,FTP服务器被动等待客户端连接。(此时有可能因为服务器的防火墙阻止客户端端口N+1连接服务器的数据端口,造成FTP连接不能工作。)
很多局域网防火墙在设置的时候都不允许接受外部发起的连接,所以FTP的主动模式在内部网络的机器通过防火墙访问外部FTP服务器的时候受到了限制,因为从FTP服务器TCP20端口无法和内部网络的客户端建立一个连接,造成无法工作。
当然如果非要这样,可以设置成功,首先分别设置允许内部IP连接外部IP的21端口,以及禁止外部TCP20端口连接内部IP的小于1024的端口,这是为了防止外部IP连接内部的常规端口,最后还得验证ACK是否是1。
如果不这样设置就得使用PASV模式,因为此时不用建立新连接,但此时服务器端会开放一个范围很大的随机端口,有的FTP端口范围都可以设置到1024到65535,如果没有防火墙的保护,被动模式使用起来会不安全。建议用主动模式。
另:linux里vsftpd如果要支持passive被动模式,需要添加
pasv_enable=YES
pasv_min_port=3000 #端口范围
pasv_max_port=4000
到/etc/vsftpd/vsftpd.conf