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


34

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

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

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

可以吗

我有兴趣了解无法或不建议这样做的技术细节。


1
您可能对此感兴趣:w3.org/Protocols/rfc959
Matt Simmons

1
谢谢马特。是的,我已经阅读了RFC 959的大部分内容,但是我觉得我当时并不能从中得到明确的答案。Karol Piczak的答案更多是我在寻找的信息。
库尔特(Kurt)

Answers:


20

当我将数据端口锁定到一个端口时,对于多个并发FTP会话问题,有一个清晰而技术上的解释,这是我最想知道的。什么时候可以使用,什么时候不可以使用,为什么不推荐使用,等等。

这是一个疯狂的猜测,因为我尚未测试过,您应该自己尝试一下,看看是否还有其他我可能错过的问题。

我想您可以将被动端口范围限制为一个端口。实际上,您可以在此问题中看到实际使用的端口范围很小。从理论上讲,要支持多个并发连接,您只需要4个值:本地IP,本地端口,远程IP,远程端口是唯一的。这是您区分不同连接的方式。

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

让我们考虑一下为什么一个端口可能不够用

首先,我想出一种情况,一个真正有问题的FTP服务器实现仅使用本地端口号作为识别客户端数据传输的方式。再说一次,我认为没有任何像样的FTPd可以做到这一点。

真正的问题是的,您可以忽略以上所有内容,作为主要的论题;-))是被动端口范围处于非特权范围内

这意味着您选择的端口号 本身并不是保留的,实际上,任何用户进程(不需要root特权)都可以在您的FTP服务器之前获取它。如果您有大量端口可供选择,则只需随机选择一个免费端口即可。如果您必须使用唯一的一个,并且已经使用过,则将无法正确处理传输。

抱歉,如果答案似乎过于投机。老实说,我努力寻找不使用单个端口的原因,除了最后一点,我想不出任何有力的证据来反对它。然而,您提出了一个有趣且具有挑战性的问题。


顺便说一句,请随时在这里评论遗漏的点和不一致之处。即使是我自己,我也好像在想一个简单的答案-是的,可以。;-)
Karol J. Piczak 2011年

非常感谢Karol!这是我一直在寻找(实际上在其他任何地方都找不到)的信息的地点。我问这个问题的主要原因是,我想知道在Windows Azure中设置FTP服务器并将被动模式锁定为仅1个端口是否安全(因为Azure限制了端点)。我已经尝试过,它可以正常工作,并且通过您的信息,我也感到安全。但是剩下的唯一问题是,Azure负载平衡器在文件传输过程中1分钟后会断开控制连接(因为它处于空闲状态),因此我正在使用保持活动状态的TCP隧道进行修复。
库尔特(Kurt)

1
我相信真正的原因是数据通道协议没有识别信息。服务器仅根据端口号知道从哪个客户端传输的文件。
Monstieur

4

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

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

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

有关更多详细信息,请参见:

http://tools.ietf.org/html/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会话数。请测试以确保。


1
感谢您的回复。但是我有兴趣知道的是为什么在被动模式下ftp服务器不能告诉所有客户端使用相同的端口作为数据通道(例如端口1024),而不是给每个客户端一个随机的端口。指定的端口范围?有什么技术原因(如果有),为什么不能或不建议在FTP服务器端口范围配置中仅指定一个数据端口?我认为ftp服务器即使仅在一个数据通道端口上也可以处理很多/很多同时连接,不是吗?
库尔特(Kurt)

1
因为FTP是魔鬼,需要最终消亡。:D

1
感谢您进行的有关将服务器锁定到特定单个端口的编辑。我实际上已经考虑过该方法(这就是我要完成的工作),但是我不太了解的是为什么这会限制服务器可以支持的并发FTP会话的数量。在这种情况下,阻止服务器支持多个并发FTP会话的确切原因是什么?因为任何FTP服务器显然都支持端口21上的多个并发连接,所以为什么不支持端口12345(从您的示例中得出)?我将不得不对此进行更深入的测试。
库尔特(Kurt)

它可能不会限制并发连接的数量。这实际上取决于服务器如何跟踪多个会话之间的连接。试一试!
dmourati 2011年

顺便说一句,我将不得不等待将任何答案标记为可接受的答案,因为将数据端口锁定为一个端口时,有关多个并发FTP会话问题的清晰而技术性的解释是我最想知道的。它什么时候可以工作,什么时候不起作用,为什么不推荐使用,等等
Kurt

1

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

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

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

编辑:考虑到FTP服务器不这样做的另一个原因:服务器无法告诉多个具有相同IP地址的用户。


谢谢。我想我不明白的是,如果两个或多个客户端同时请求被动模式,为什么那些数据通道套接字需要一个唯一的端口(在服务器上)?因为我在想,两个或多个客户端显然可以同时连接到端口21,所以为什么不同时说1024端口(用于数据通道)呢?我觉得这可能是一个愚蠢的问题,但是我的免责声明是我已经醒了太久了:)
Kurt

套接字本身必须是唯一的。您可以创建一个侦听端口的套接字,并从该套接字接受任意数量的连接,也可以为每个用户在不同端口上创建一个套接字,并从每个套接字接受一个连接。如果您将服务器设计为每个用户只能使用一个套接字,那么实际上您将重写所有内容以另一种方式对其进行更改,最后,共享主机上或位于同一IP地址后面的人将无法执行此操作。同时连接,因为无法区分它们的数据连接。
2011年

谢谢。我很高兴收到关于该主题的所有答案,我想现在我已经开始很好地处理了。
库尔特(Kurt)

0

在端口21或80(与所有众所周知的端口一样)上,有一个设置的协议,客户端用来告诉它想要什么。这样服务器就知道您要连接什么。在数据连接端口上,没有协议。服务器所知道的-关于该连接唯一的唯一信息-是您连接到的端口号。

如果您每次都连接到同一端口,则服务器将无法确定您要连接的文件。端口号用作控制连接上的传输请求和数据连接之间的链接。

如果两个客户端同时请求传输,则服务器在单个端口上接受连接时,服务器将无法告知要传输的文件。当然,服务器可以使用客户端IP进行决策(出于安全性考虑,实际上许多FTP服务器确实会验证客户端IP与控制连接上使用的IP匹配)。

但这不适用于:

  • 来自同一台计算机的多个连接(大多数FTP客户端确实支持并行传输/队列)。
  • 来自具有相同外部IP的同一(公司)网络中不同计算机的连接。

另请参见FTP数据连接重用


-1

我在这里没有看到此内容,因此将其放入其中。端口范围分配本来是一种安全功能,其中您无法监视一个端口的数据流量,数据是通过一个随机端口发送的。范围,很难确定。默默无闻的安全性。


1
您对此主张有参考吗?
Martin Prikryl

-2

听起来您已经了解控制端口和数据端口,所以我将继续进行介绍。控制端口本质上是突发通信,就像网站的端口80一样。他们可以处理许多不同的请求(不能同时处理,但由于它们是如此之快地完成,所以无法完成)。另一方面,FTP是神奇的数据端口。如果将自己限制为一个数据端口,则一次只能进行一次数据传输。考虑大文件传输。打开单个数据端口后,传输完成之前,其他数据将无法移动。这意味着在传输时,第二个用户甚至无法列出ftp文件夹的目录内容。当然,他们将能够成功登录,但是其行为与数据端口完全未打开的行为相同。如果可以的话 一个端口将非常适合您。请记住,默认情况下,某些ftp客户端(我可以马上想到1个)在单个会话中设置多个连接进行下载。因此,对于此客户端,在单端口方案中,请考虑批量传输1个大文件和4个小文件。

客户端会为第一个大文件(所有文件都是海克)发起传输。然后,在进行传输时,它将启动第二个文件。没有骰子。然后是第三个,也是zilch(技术术语)。最后,日志应显示1次成功传输和4次失败传输。解决方法是将每个会话的客户端限制为一个连接,然后您就可以开始使用了(假设在一个传输完成后的很微秒内,其他人没有进入他们的门,而另一个传输还没有开始。 )


2
什么?这是完全不正确的。TCP套接字由4元组(源IP,源端口,目标端口,目标IP)定义。可以从同一目标端口:IP映射同时创建和服务许多TCP套接字。FTP服务器进程可以同时为两个和来自任意数量的网络客户端的数据提供服务。
EEAA
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.