我正在研究 ftp 模式的类型,主动和被动,我对当前场景中的一些问题感到困惑
设想: 我有 Android 设备作为客户端,将由组织使用,并且该组织非常关心其服务器或其上的数据或其他任何东西的安全性,一个很好的例子就是银行服务器。
现在他们可以拥有 1000-1500 台 Android 设备。每台设备都会获得一个下载项列表,然后每台设备都会逐一遍历该列表并下载该项目并为每个项目创建一个新的连接。
现在来看看对安全性的担忧以及上述 FTP 用例的设备数量。我有以下问题。
主动模式: 根据我的理解,我认为我应该使用主动模式,它处理组织对在服务器上打开多个端口的担忧,因为客户端android设备将启动命令和数据连接。但另一方面,服务器是否可以设法发送或打开数据通道以在主动模式下从单个端口发送1000-1500个设备?它不会失败吗?
被动模式: 如果我考虑被动模式,那么我们必须寻找在安全严密的组织上打开多个端口的问题。并且在最坏的情况下,我们应该为 1000-1500 个 Android 设备打开多少个被动模式端口。上面提到了下载文件的场景。
答案1
FTP 使用 1 个控制 TCP 连接和一个或多个数据连接。
控制连接用于在客户端和服务器之间传输有关要做什么和正在做什么的消息。数据连接用于传输数据。本质上:客户端在控制连接上告诉服务器:给我那个文件,服务器将文件的字节发送到数据连接。
由于您的问题与安全有关,我将在此深入探讨一下:客户端向服务器发送 TCP SYN 即可“打开”TCP 连接。这些 SYN 通常是防火墙规则的主题。示例:允许 <ALL_IPS_IN_THE_INTERNET> 连接到端口 21 上的 <MY_FTP_SERVER>。
FTP主动模式是客户端打开控制连接并告诉服务器应该向哪个IP和PORT打开数据连接。
FTP 被动模式是当客户端打开控制连接时,服务器告诉客户端应该向哪个 IP 和端口打开数据连接。
当客户端位于 NAT 路由器后面时,FTP 主动模式会出现问题,因为 NAT 路由器在多个客户端之间共享一个公共 IP 地址。客户端只知道它的私有 IP 地址,即使它可以找出路由器的公共 IP 并将其发送到 FTP 服务器,当服务器尝试连接到该 IP 时,请求将到达路由器,后面有许多客户端,它不知道应该将 SYN 转发给哪个客户端。
这个问题的一个解决方案是深度数据包检测。路由器将识别出控制连接将通向端口 21,因此它将检查该连接,当客户端告诉服务器应该打开哪个端口的数据连接时,路由器将为来自 ftp 服务器的数据包添加该端口的临时端口转发。当控制连接关闭时,路由器将禁用端口转发。
只要你不关心安全问题,这很棒,也很好 - 意思是:这很糟糕。在验证或传输敏感数据时,请始终使用加密。
当您加密时,路由器无法再进入控制连接,因此无法为主动模式下的 ftp 客户端创建动态端口转发。
该问题通过 FTP 被动模式得到解决,因为两个连接均由客户端打开。
但这又带来了另一个问题 - 不是客户端的问题,而是可怜的服务器防火墙管理员的问题。由于客户端在被动模式下连接的端口有点随机,因此产生的防火墙规则如下所示:允许 <ALL_IPS_IN_THE_INTERNET> 连接到 <MY_FTP_SERVER> 的端口 21 和端口 1024-65535。如果您有一个不错的 ftp 服务器守护程序,您可以配置用于数据连接的端口范围,从而使防火墙更好一些:允许 <ALL_IPS_IN_THE_INTERNET> 连接到 <MY_FTP_SERVER> 的端口 21 和端口 20000 到 21500 - 这将为您提供 1500 个并发数据连接。
你可以这样做,但我不建议这么做。FTP 有更好的替代方案:HTTP。
- HTTP 不使用控制和数据连接,这是一种优点,并没有带来真正的缺点。
- HTTP 得到了安全设备/防火墙/Web 应用程序防火墙等的良好支持 - 这些产品甚至可以中间人控制其客户端 SSL 连接并对 HTTPS 执行内容过滤
- 大多数 HTTP 服务器都可以配置为服务器目录列表。
- 所有 HTTP 服务器都支持下载,大多数甚至支持续传。
- HTTP 客户端库已在 Android 和 iPhone 设备上可用
因此我将像这样实现客户端:
- 获取配置为列出所有可下载文件的 URL 目录列表
- 下载文件
HTTP 甚至支持上传和上传失败恢复。
我希望我可以在这里成功推销 HTTP,因为 FTP 是邪恶的!
编辑:我正在添加一个链接到一篇精彩的帖子,显示 vsftpd 的 PASV 模式行为中的最大连接数:https://serverfault.com/questions/563582/connections-number-of-vsftp-in-passive-mode