使用主动 FTP 模式代替被动模式的风险

Num*_*our 1 security linux firewall ftp

在服务器上,我使用 Perl 脚本,该脚本计划使用 FTP 从另一台服务器定期下载一些文件。不幸的是,Perl FTP 模块中存在一些问题,导致脚本不时失败并意外终止。我发现这个问题可以通过从被动模式切换到主动模式来轻松解决。

如果我正确理解了这两种 FTP 模式之间的区别,那么使用主动模式将意味着我需要在防火墙内打开某个端口范围。我认为这会带来一些安全风险。所以我的问题是是否有一些解决方法或好的做法,以便我可以在我的服务器上以不会导致任何额外风险的方式使用活动模式。

loo*_*ver 6

简而言之:

  • FTP 连接由两个流组成:命令(控制)和数据
  • 当一个套接字被打开并且代码没有明确绑定到一个端口时,操作系统将在其临时端口范围内消耗一个高编号的端口 ( sysctl -a | grep ip_local_port_range)
  • 非 root 进程必须使用 >1024 的端口

主动模式FTP

客户端通过端口 21 连接到服务器并建立命令流:

client:32198 -> server:21

客户端必须发送或接收一些数据,因此它通知服务器在某个端口上连接回它。为此,它会发送一个类似于以下内容的 PORT 命令:

PORT 1,2,3,4,5,6

这是客户端通知服务器服务器可以连接回客户端(在端口 (5 * 256) + 6 = 1286 上的地址 1.2.3.4。

server:20 -> client:1286

通常,这是您看到主动模式 FTP 会话终止的地方;对于防火墙和负载均衡器,通常从客户端 -> 服务器流出的流量是预期的,但是服务器发起到客户端的连接经常被拒绝(负载均衡器通常足够聪明,可以将此数据流与现有命令流相关联) )。

您对需要在防火墙上打开端口范围以促进此行为的理解是绝对正确的。

被动模式FTP

在这种情况下,客户端像以前一样建立命令会话:

client:56221 -> server:21

但是当数据被传送时,客户端发送一个PASV命令原语。服务器使用客户端应该连接回的 IP:Port 组合进行响应(与PORT之前的请求格式类似。因此,客户端然后按如下方式连接到服务器:

client:12347 -> server:4566

这绕过了上述主动模式的防火墙问题,因为连接是以传统和预期的方式建立的。

被动模式的缺点是它在服务器上消耗更多的套接字。PASV在重载环境中频繁发布原语最终可能导致端口耗尽。(套接字将在TIME_WAIT操作系统定义的一段时间内保持某种状态(我认为在 Redhat 系统上大约为 2 分钟)。

关于你的问题

除非您真的遇到端口耗尽问题,否则被动模式会失败而主动模式会更频繁地成功是非常不寻常的。通常是相反的。如果您能够发布更多关于偶尔收到的错误的信息,我们可以进一步调试。

我建议尽可能使用被动模式,因此我建议在承认使用主动模式 FTP 之前查看被动模式特定的故障以找到问题的根本原因。