我很难理解为什么所有FTP服务器都需要为被动模式数据通道使用端口范围,而不是仅对所有传入数据通道连接使用一个数据端口。
FTP服务器在端口21上处理许多同时连接的客户端。Web服务器在端口80上处理许多同时连接的客户端。
那么,为什么FTP服务器不能仅将一个数据通道端口用于所有传入的被动数据连接(并且仍然能够处理该端口上许多同时连接的客户端,例如端口1024)?
可以吗
我有兴趣了解无法或不建议这样做的技术细节。
我很难理解为什么所有FTP服务器都需要为被动模式数据通道使用端口范围,而不是仅对所有传入数据通道连接使用一个数据端口。
FTP服务器在端口21上处理许多同时连接的客户端。Web服务器在端口80上处理许多同时连接的客户端。
那么,为什么FTP服务器不能仅将一个数据通道端口用于所有传入的被动数据连接(并且仍然能够处理该端口上许多同时连接的客户端,例如端口1024)?
可以吗
我有兴趣了解无法或不建议这样做的技术细节。
Answers:
当我将数据端口锁定到一个端口时,对于多个并发FTP会话问题,有一个清晰而技术上的解释,这是我最想知道的。什么时候可以使用,什么时候不可以使用,为什么不推荐使用,等等。
这是一个疯狂的猜测,因为我尚未测试过,您应该自己尝试一下,看看是否还有其他我可能错过的问题。
我想您可以将被动端口范围限制为一个端口。实际上,您可以在此问题中看到实际使用的端口范围很小。从理论上讲,要支持多个并发连接,您只需要4个值:本地IP,本地端口,远程IP,远程端口是唯一的。这是您区分不同连接的方式。
如果将服务器上的端口锁定为一个单一值,则剩下的唯一变量是客户端使用的端口。只要客户端有足够大的免费临时端口池可供选择,这就不成问题。除非它正在执行一些繁重的NAT,否则您不必为此担心。现在,请注意,这纯粹是理论上的事情:如果您在服务器上使用了多个端口,则可以通过启用以下功能来假设虚拟并发连接数number of ports in range
每个端口客户端的连接数。但这在实践中不会发生,因为我怀疑是否有FTP客户端的实现会支持此操作(因为它没有多大意义)。另外,如果客户必须以这种方式共享他的临时端口,而又不能仅仅打开一个新端口,那么他将面临更多更严重的问题要处理。因此,从这个角度来看,使用单个端口应该完全安全。
让我们考虑一下为什么一个端口可能不够用。
首先,我想出一种情况,一个真正有问题的FTP服务器实现仅使用本地端口号作为识别客户端数据传输的方式。再说一次,我认为没有任何像样的FTPd可以做到这一点。
真正的问题(是的,您可以忽略以上所有内容,作为主要的论题;-))是被动端口范围处于非特权范围内。
这意味着您选择的端口号 本身并不是保留的,实际上,任何用户进程(不需要root特权)都可以在您的FTP服务器之前获取它。如果您有大量端口可供选择,则只需随机选择一个免费端口即可。如果您必须使用唯一的一个,并且已经使用过,则将无法正确处理传输。
抱歉,如果答案似乎过于投机。老实说,我努力寻找不使用单个端口的原因,除了最后一点,我想不出任何有力的证据来反对它。然而,您提出了一个有趣且具有挑战性的问题。
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会话数。请测试以确保。
FTP服务器可能能够仅基于源IP,而不是基于所使用的端口号,将客户端的数据端口连接与其控制端口连接进行匹配。
这会破坏FXP(这可能不是一件坏事),其中客户端连接到两台服务器(一个处于被动模式),然后在接收到被动服务器的PORT信息后,将其作为PORT命令传递给主动模式服务器,以便主动模式服务器连接到被动模式服务器。
我怀疑许多服务器在客户端请求被动模式之前不会创建数据套接字。在这种情况下,如果两个客户端同时请求被动模式,则创建的套接字将需要唯一的端口号。
编辑:考虑到FTP服务器不这样做的另一个原因:服务器无法告诉多个具有相同IP地址的用户。
在端口21或80(与所有众所周知的端口一样)上,有一个设置的协议,客户端用来告诉它想要什么。这样服务器就知道您要连接什么。在数据连接端口上,没有协议。服务器所知道的-关于该连接唯一的唯一信息-是您连接到的端口号。
如果您每次都连接到同一端口,则服务器将无法确定您要连接的文件。端口号用作控制连接上的传输请求和数据连接之间的链接。
如果两个客户端同时请求传输,则服务器在单个端口上接受连接时,服务器将无法告知要传输的文件。当然,服务器可以使用客户端IP进行决策(出于安全性考虑,实际上许多FTP服务器确实会验证客户端IP与控制连接上使用的IP匹配)。
但这不适用于:
另请参见FTP数据连接重用。
我在这里没有看到此内容,因此将其放入其中。端口范围分配本来是一种安全功能,其中您无法监视一个端口的数据流量,数据是通过一个随机端口发送的。范围,很难确定。默默无闻的安全性。
听起来您已经了解控制端口和数据端口,所以我将继续进行介绍。控制端口本质上是突发通信,就像网站的端口80一样。他们可以处理许多不同的请求(不能同时处理,但由于它们是如此之快地完成,所以无法完成)。另一方面,FTP是神奇的数据端口。如果将自己限制为一个数据端口,则一次只能进行一次数据传输。考虑大文件传输。打开单个数据端口后,传输完成之前,其他数据将无法移动。这意味着在传输时,第二个用户甚至无法列出ftp文件夹的目录内容。当然,他们将能够成功登录,但是其行为与数据端口完全未打开的行为相同。如果可以的话 一个端口将非常适合您。请记住,默认情况下,某些ftp客户端(我可以马上想到1个)在单个会话中设置多个连接进行下载。因此,对于此客户端,在单端口方案中,请考虑批量传输1个大文件和4个小文件。
客户端会为第一个大文件(所有文件都是海克)发起传输。然后,在进行传输时,它将启动第二个文件。没有骰子。然后是第三个,也是zilch(技术术语)。最后,日志应显示1次成功传输和4次失败传输。解决方法是将每个会话的客户端限制为一个连接,然后您就可以开始使用了(假设在一个传输完成后的很微秒内,其他人没有进入他们的门,而另一个传输还没有开始。 )