作者:ccmmm | 来源:互联网 | 2023-06-19 09:15
1.主动FTP模式
最初的FTP规范中使用的就是传统的主动模式的FTP。在这种模式下,客户端从一个临时端口(大于1024的端口号)连接到FTP服务器的命令控制端口(端口21),当客户端准备好传输数据时,FTP服务器从其数据端口(端口21)打开一个到该IP地址和客户端提供的临时端口的连接。这里的关键是不向服务器发起真实的数据连接,而是告诉服务器他自己的端口号(通过执行port命令);然后服务器连接回到客户端指定的端口。在这种模式中服务器被认为是执政党(或者说是发起者)。
对于防火墙之后的客户端,主动模式的FTP会有点小问题。客户端的防火墙可能不允许来自Internet的专门的服务端口(即数据端口20)初始化到客户端提供的非专门服务端口的连接。
2.被动FTP模式
FTP客户端执行pasv命令表明它希望以被动模式来访问数据,服务器响应以其IP地址和一个客户端可以连接来传输数据的临时端口。客户端运行的pasv命令告诉服务器监听一个非正常端口(即端口20)的数据端口,然后等待客户端的连接,而不是自己发起新连接。这里的关键区别在于客户端初始化到服务器所提供的IP地址和端口的连接。在这种关系中,服务器被认为是数据通讯的被动者(在野党)。
对于防火墙之后的FTP服务器,被动模式的FTP会有点小问题。因为防火墙的本能会禁止从Internet向它所保护的内部系统的临时端口发起连接。这种情况下的一个通常的症状就是客户端看起来可以连接到服务器,但是当尝试传输数据的时候,连接好像就被挂起了。
对于FTP和防火墙相关的问题,大多数的防火墙多可以在应用级别实现FTP代理,他会追踪FTP请求的连接并按需打开那些高端的端口号来从远程站点接收数据。
最近做一个项目用到FTP和其它系统进行文件传输,结果在FTP网络连接的问题上花了很多时间,由于太久没搞多FTP,忘记了FTP不单单开放21端口,客户端采用不同连接模式对网络有不同。在此重温一下FTP的主动模式和被动模式的相关知识。
在使用FTP时,如果客户端机器和FTP服务器双方之间的所有端口都是开放的,那连接不存在问题。如果客户端与服务器之间有防火墙,如果没配置好防火策略和采用合适的连接模式,会导致登录成功,但无法List列表的问题。要避免出现这样的问题,首先要了解FTP的工作模式。
1.FTP的PORT(主动模式)和PASV(被动模式)
(1) PORT(主动模式)
PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据,原理如下图:
(2) PASV(被动模式)
PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输,原理如下图:
2.两种模式的比较
从上面的运行原来看到,主动模式和被动模式的不同简单概述为: 主动模式传送数据时是“服务器”连接到“客户端”的端口;被动模式传送数据是“客户端”连接到“服务器”的端口。
主动模式需要客户端必须开放端口给服务器,很多客户端都是在防火墙内,开放端口给FTP服务器访问比较困难。
被动模式只需要服务器端开放端口给客户端连接就行了。
3.不同工作模式的网络设置
我在实际项目中碰到的问题是,FTP的客户端和服务器分别在不同网络,两个网络之间有至少4层的防火墙,服务器端只开放了21端口, 客户端机器没开放任何端口。FTP客户端连接采用的被动模式,结果客户端能登录成功,但是无法LIST列表和读取数据。很明显,是因为服务器端没开放被动模式下的随机端口导致。
由于被动模式下,服务器端开放的端口随机,但是防火墙要不能全部开放,解决的方案是,在ftp服务器配置被动模式下开放随机端口在 50000-60000之间(范围在ftp服务器软件设置,可以设置任意1024上的端口段),然后在防火墙设置规则,开放服务器端50000-60000之间的端口端。
主动模式下,客户端的FTP软件设置主动模式开放的端口段,在客户端的防火墙开放对应的端口段。
4.如何设置 工作模式?
哈哈,有人可能会问FTP服务器如何设置工作模式?实时上FTP服务器一般都支持主动和被动模式,连接采用何种模式是有FTP客户端软件决定。