为什么 FTP 被动模式需要一个端口范围而不是只需要一个端口?

为什么 FTP 被动模式需要一个端口范围而不是只需要一个端口?

我很难理解为什么所有 FTP 服务器都需要使用端口范围用于被动模式数据通道,而不是仅使用一个数据端口进行所有传入数据通道连接。

FTP 服务器在端口 21 上处理许多同时连接的客户端。Web 服务器在端口 80 上处理许多同时连接的客户端。等等。

那么为什么 FTP 服务器不能只使用一个数据通道端口来处理所有传入的被动数据连接(并且仍然能够处理该端口上同时连接的多个客户端,比如端口 1024)?

或者可以吗?

我有兴趣了解为什么这是不可能的或者不推荐的技术细节。

答案1

我最想深入了解的是,当将数据端口锁定到一个端口时,多个并发 FTP 会话的问题是否能得到清晰的技术解释。什么时候可以工作,什么时候不能工作,为什么不推荐这样做,等等。

这将是一个大胆的猜测,因为我还没有测试过,你应该亲自尝试一下,看看是否还有我可能错过的其他问题。

我想你可以将被动端口范围限制为一个端口。事实上你可以看到这个问题实践中会使用较小的端口范围理论上,支持多个并发连接只需要这4个值:本地IP,本地端口,远程IP,远程端口独一无二。这就是你如何区分不同的连接。

如果你将服务器上的端口锁定为一个值,那么剩下的唯一变量就是客户端使用的端口。这不是问题,只要客户端有足够大的空闲池短暂的端口可供选择。除非要进行一些繁重的 NAT,否则您不必担心这一点。现在,请注意,这只是纯粹的理论:如果您在服务器上使用了多个端口,则可以通过number of ports in range在客户端启用每个端口的连接来增加假设的并发连接数。但这在实践中不会发生,因为我怀疑是否有任何 FTP 客户端实现会支持这一点(因为这没有多大意义)。此外,如果客户端必须以这种方式共享其临时端口,而不能直接打开一个新端口,那么他将面临更严重的问题。因此,从这个角度来看,使用单个端口应该是完全安全的。

让我们想想为什么单个端口可能不够用

首先,我可以想象这样一种情况:一个真正存在问题的 FTP 服务器实现仅使用本地端口号来识别客户端数据传输。再说一次,我认为任何像样的 FTPd 都不会这样做。

真正的问题是的,你可以忽略以上所有内容,因为它们都是题外话;-)) 就是它被动端口范围处于非特权范围内

这意味着你的选定的端口号未被保留 本身,实际上任何用户进程(不需要特权用户(具有特权的用户)可以在 FTP 服务器之前抢占它。如果您有大量端口可供选择,您可以随机抢占一个空闲端口。如果您必须使用唯一的端口,而该端口已经被使用,那么您将无法正确处理传输。

抱歉,如果答案看起来有点太过推测。说实话,我努力寻找一个理由为什么你不应该使用单个端口除了最后一点,我想不出任何确凿的证据来反对它。不过,你提出的问题很有趣,也很有挑战性。

答案2

FTP 依赖于两个独立的连接,一个用于控制或命令流,另一个用于传递数据文件和其他信息(如目录列表)。控制流通过传统的 TCP 连接传输。客户端绑定到高非特权端口,并向绑定到端口 21 的 FTP 服务器发送连接请求。此连接用于传递命令。

在端口或主动模式下,客户端会告诉服务器它将监听哪个次要的非特权端口。然后服务器会从端口 20 启动到客户端指定的非特权端口的数据连接。

被动模式是一种较新的机制,当客户端是 Web 浏览器时,它是默认模式。服务器不再绑定到端口 20,而是告诉客户端使用哪个高端口进行数据传输。然后,数据通过客户端和服务器之间的非特权端口进行传输。

更多详情请参阅:

https://www.rfc-editor.org/rfc/rfc959

编辑

至于将服务器锁定到特定的单个端口,在某些服务器中可能是可行的。例如在 vsftpd 中,您有以下配置选项。

   pasv_max_port
          The maximum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

   pasv_min_port
          The minimum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

如果您将两个端口设置为相同,例如 pasv_max_port=12345、pasv_min_port=12345,您可能能够获得想要的结果。我怀疑这会限制您的服务器支持的并发 FTP 会话数量。请进行测试以确保无误。

答案3

FTP 服务器可能能够仅根据源 IP(而不是基于使用的端口号)将客户端的数据端口连接与其控制端口连接进行匹配。

这会破坏外汇交易平台(这可能不是坏事)客户端连接到两个服务器(一个处于被动模式),然后在收到被动服务器的 PORT 信息后,将其作为 PORT 命令传递给主动模式服务器,以便主动模式服务器连接到被动模式服务器。

怀疑许多服务器直到客户端请求被动模式时才创建数据套接字。在这种情况下,如果两个客户端同时请求被动模式,则创建的套接字将需要唯一的端口号。

编辑:想到了 FTP 服务器不这样做的另一个原因:服务器无法区分具有相同 IP 地址的多个用户。

答案4

我没有看到这里提到这一点,所以我就把它放进去。端口范围分配是一种安全功能,您无法监视一个端口的数据流量,数据会发送到范围内的随机端口,这不容易确定。通过隐蔽性实现安全性。

相关内容