ITPub博客

首页 > 数据库 > 数据库开发技术 > 一文说清楚vsftpd主动模式和被动模式

一文说清楚vsftpd主动模式和被动模式

原创 数据库开发技术 作者:步步运维步步坑 时间:2024-01-03 11:30:00 0 删除 编辑

FTP使用两个端口,一个用于命令传输(命令端口,默认是21端口),另一个用于数据传输(数据端口,默认是20端口)。在主动模式下,FTP客户端连接到服务器的命令端口,然后服务器通过数据端口连接到客户端的指定数据端口。要支持主动模式FTP,需要考虑防火墙的设置。

主动模式

在主动模式中,FTP客户端选择一个随机的非特殊端口(通常大于1023),并监听在该端口上等待服务器连接。然后,客户端通过命令端口通知服务器要连接的数据端口(客户端选择的随机端口)。服务器随后通过命令端口通知客户端使用20端口连接数据。

因此,要支持主动模式FTP,服务器端的防火墙需要允许以下交互中使用到的端口:

  1. 允许客户端连接到服务器的命令端口(通常是21端口): 用于客户端与服务器建立FTP命令通信。

  2. 允许服务器连接到客户端的数据端口(客户端选择的随机端口): 用于数据传输。

  3. 允许服务器连接到客户端的命令端口(客户端选择的随机端口): 在某些情况下,服务器需要通过命令端口向客户端发送一些信息。

为了实现这些,防火墙需要配置成允许相关端口的进出流量。在防火墙配置中,需要考虑FTP服务器和客户端的地址以及端口范围。

FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
FTP服务器数据(20)端口到客户端端口(>1023)(服务器初始化数据连接到客户端数据端口)
FTP服务器数据(20)端口接受客户端端口(>1023)(客户端发送ACK包到服务器的数据端口)

用图表示如下:

在主动方式的FTP中,客户端首先与FTP服务器的命令端口(通常是21端口)建立连接,并发送一个指令,比如“PORT 1027”(这里假设客户端选择的数据端口是1027)。接着,FTP服务器在命令端口上向客户端发送一个“ACK”确认。

然后,在第三步,FTP服务器主动地发起一个从它自己的数据端口(通常是20端口)到客户端之前指定的数据端口(1027)的连接。这就是主动模式FTP的关键问题所在:从服务器端向客户端发起连接。在客户端的防火墙中,通常会阻止外部系统建立到内部客户端的连接。

这一问题的原因在于,客户端在告知服务器它的数据端口时,并没有真正建立一个连接,而是仅仅通知了一个端口号。FTP服务器在接收到这个信息后,会主动地尝试连接客户端的数据端口。这就导致了一个与通常的网络连接方向相反的情况,从而可能遇到防火墙的限制。

总的来说,主动方式FTP在现代网络环境中可能会受到防火墙的限制,因此被动方式FTP更为常见。在被动模式中,数据连接是由客户端发起的,从而避免了服务器向客户端发起连接的问题。

被动模式FTP

在被动模式FTP中,命令连接和数据连接都由客户端负责建立,从而避免了服务器主动连接到客户端的问题。当客户端启用FTP连接时,它会打开两个任意的非特权本地端口(N > 1024 和 N+1)。第一个端口连接到服务器的命令端口(通常是21端口),但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器回连到它的数据端口。相反,客户端发送PASV命令。

服务器在收到PASV命令后,会随机开启一个非特权端口(P > 1024),并将这个端口信息发送给客户端,通常通过一个类似于"227 Entering Passive Mode (h1,h2,h3,h4,p1,p2)"的响应。然后,客户端发起从本地端口N+1到服务器的端口P的连接,用来进行数据传输。

总的来说,在被动模式FTP中,客户端负责建立数据连接,通过避免服务器主动连接到客户端的方式,解决了由于防火墙等原因导致的数据端口入方向连接被阻塞的问题。

对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:

FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
FTP服务器数据端口(>1023)接受客户端端口(>1023)(客户端初始化数据连接到服务器指定的任意端口)
FTP服务器数据端口(>1023)到客户端端口(>1023)(服务器发送ACK响应和数据到客户端的数据端口)

用图表示如下:

在被动方式FTP中,连接的建立方式经历了以下步骤:

  1. 建立命令连接: 客户端与服务器的命令端口(通常是21端口)建立连接,并发送PASV命令,告知服务器它希望使用被动模式。

  2. 服务器返回数据端口信息: 服务器收到PASV命令后,返回一个类似于"PORT 2024"的命令,告知客户端使用哪个端口进行数据连接。

  3. 客户端初始化数据连接: 客户端收到服务器返回的端口信息后,在自己的端口范围内选择一个非特权端口,初始化一个从该端口到服务器指定的数据端口的数据连接。

  4. 服务器发送确认响应: 服务器在建立数据连接后,向客户端的数据端口发送一个"ACK"确认响应。

被动方式FTP解决了客户端的一些问题,但引入了新的问题。其中一个问题是服务器需要允许来自任意远程终端的连接到其高位端口,这可能涉及到防火墙的配置。另一个问题是不同的FTP客户端支持被动模式的程度不同,有些可能不支持被动模式,因此需要服务器提供解决方案。这种情况下,服务器可能需要配置一个允许同时支持主动和被动模式的策略。

特别是在使用Web浏览器作为FTP客户端时,大多数浏览器仅在访问以ftp://开头的URL时支持被动模式。这对服务器和防火墙的配置提出了一些挑战。

*注意:当 NAT(Network Address Translation)设备以主动模式访问FTP服务器时,由于NAT设备自动的变更FTP包中的IP地址,从而会导致无法访问服务器


总结

主动FTP:

命令连接:客户端 >1023端口 -> 服务器 21端口
数据连接:客户端 >1023端口 < - 服务器 20端口

被动FTP:

命令连接:客户端 >1023端口 -> 服务器 21端口
数据连接:客户端 >1023端口 -> 服务器 >1023端口

主动FTP对于FTP服务器的管理是有利的,因为服务器可以主动地与客户端建立数据连接,从而更容易控制和监视连接的建立和关闭。然而,它在客户端方面的管理不利,因为客户端的防火墙可能会阻塞服务器尝试连接到客户端的随机高位端口。

相反,被动FTP对FTP客户端的管理更为有利,因为客户端负责建立数据连接,可以更容易地通过防火墙。然而,对于FTP服务器的管理可能不够灵活,因为服务器需要允许来自客户端的连接到其高位端口,而这可能涉及到防火墙的配置。

为了解决这些问题,可以采取一种折衷的方法。FTP服务器可以通过指定一个有限的端口范围来减小服务器高位端口的曝露,从而降低潜在的安全风险。这样,服务器可以更好地控制哪些端口是开放的,而不是对所有的高位端口都开放。尽管这并不能完全消除潜在的危险,但可以显著减少对服务器的威胁。这种方式既兼顾了服务器的管理需求,又提高了客户端的连接成功率。


添加博主

微信号|yfq940-

原文作者:步步运维步步坑;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-10-08

  • 博文量
    100
  • 访问量
    51724