FTP可以在Active和passive两种模式下运行。
在后台,FTP实际上在客户端和服务器之间使用两个通道,命令和数据通道,它们实际上是单独的 TCP连接。
命令通道用于命令和响应,而数据通道用于实际传输文件。
将命令信息和数据分离到单独的通道是一种向服务器发送命令而不必等待当前数据传输完成的好方法。根据RFC,这只对命令的一个子集是强制的,比如退出、中止当前传输和获取状态。
在活跃的模式中,客户端建立命令通道,而服务器负责建立数据通道。这实际上是一个问题,例如,如果客户端机器受到防火墙的保护,不允许来自外部的未经授权的会话请求。
在被动模式下,客户端建立这两个通道。我们已经知道它在活动模式下建立命令通道,在这里它也做同样的事情。
然而,它随后请求服务器(在命令通道上)在端口上启动听(由服务器自行决定),而不是试图建立回客户端的连接。
作为此操作的一部分,服务器还将它选择用于侦听的端口号返回给客户机,以便客户机知道如何连接到它。
一旦客户端知道了这一点,它就可以成功地创建数据通道并继续。
更多细节可在RFC: https://www.ietf.org/rfc/rfc959.txt中找到
我最近在工作中遇到了这个问题,所以我想我应该在这里多说一些。我将使用image来解释FTP是如何工作的,作为前面答案的额外来源。
活跃的模式:
被动模式:
所以你最好配置服务器来支持被动模式FTP。然而,被动模式会使您的系统容易受到攻击,因为客户端应该连接到随机的服务器端口。因此,要支持这种模式,不仅您的服务器必须有多个可用端口,您的防火墙还应该允许到所有这些端口的连接通过!
为了降低风险,一个好的解决方案是在服务器上指定一个端口范围,然后在防火墙上只允许该范围的端口。
有关更多信息,请阅读官方文件。
我的文章的修订版本FTP连接模式(主动vs被动):
FTP连接模式(主动或被动),决定如何建立数据连接。在这两种情况下,客户端都会创建到FTP服务器命令端口21的TCP控制连接。这是一个标准的外向连接,与任何其他文件传输协议(SFTP, SCP, WebDAV)或任何其他TCP客户端应用程序(例如web浏览器)一样。因此,在打开控制连接时通常没有问题。
与其他文件传输协议相比,FTP协议更复杂的地方是文件传输。当其他协议使用相同的连接进行会话控制和文件(数据)传输时,FTP协议使用单独的连接进行文件传输和目录列表。
在活跃的模式下,客户端开始在一个随机端口上监听来自服务器的传入数据连接(客户端发送FTP命令PORT来通知服务器它正在侦听哪个端口)。如今,典型的情况是客户端位于防火墙(例如内置Windows防火墙)或NAT路由器(例如ADSL调制解调器)之后,无法接受传入的TCP连接。
PORT
出于这个原因,被动模式被引入,并被广泛使用。使用被动模式是可取的,因为大多数复杂的配置只在服务器端由有经验的管理员完成一次,而不是在客户端由(可能)没有经验的用户单独完成。
在被动模式中,客户端使用控制连接向服务器发送PASV命令,然后从服务器接收服务器IP地址和服务器端口号,然后客户端使用服务器IP地址和服务器端口号打开到服务器IP地址和服务器端口号的数据连接。
PASV
使用被动模式,大部分配置负担在服务器端。服务器管理员应该按照下面的描述设置服务器。
FTP服务器端的防火墙和NAT必须配置,不仅允许/路由FTP端口21上的传入连接,而且还必须为传入的数据连接配置一系列端口。通常,FTP服务器软件有一个配置选项来设置服务器将使用的端口范围。并且必须在防火墙/NAT上打开/路由相同的范围。
当FTP服务器在NAT后面时,它需要知道它的外部IP地址,这样它就可以在PASV命令的响应中提供给客户端。
使用活跃的模式,大部分配置负担在客户端。
客户端的防火墙(例如Windows防火墙)和NAT(例如ADSL调制解调器路由规则)必须配置为允许/路由传入数据连接的端口范围。要在Windows中打开端口,请转到控制面板>系统和安全> Windows防火墙>高级设置>入站规则>新建规则。关于NAT上的端口路由(如果有),请参考其文档。
当您的网络中存在NAT时,FTP客户端需要知道自己的外部IP地址,该IP地址是WinSCP通过PORT命令提供给FTP服务器的。这样服务器才能正确地连接回客户端以打开数据连接。有些FTP客户端能够自动检测外部IP地址,有些则需要手动配置。
一些防火墙/ nat试图通过检查FTP控制连接和/或转换控制连接流量中的数据连接IP地址来自动打开/关闭数据端口。
使用这样的防火墙/NAT,上面的配置对于普通的未加密FTP是不必要的。但这不能用于FTPS,因为控制连接流量是加密的,防火墙/NAT不能检查或修改它。
主动模式——客户端向服务器发出一个PORT命令,表示它将“主动”提供一个IP和端口号,以便向客户端打开数据连接。
被动模式——客户端发出PASV命令,表示它将“被动地”等待服务器提供IP和端口号,之后客户端将创建到服务器的数据连接。
上面有很多很好的答案,但这篇博客文章包括一些有用的图形,并给出了一个相当可靠的解释:https://titanftp.com/2018/08/23/what-is-the-difference-between-active-and-passive-ftp/