浅谈FTP协议

#团队 介绍#

我们是光大科技有限公司智能云计算部基础设施团队,致力于规划、设计、运维管理集团基础设施环境,保障集团基础设施环境稳定运行,我们团队拥有经验丰富的网络,应用交付,安全专家。将不定期分享网络运维技巧,分析各种网络协议,提供应用交付及安全案例。将与大家共同探索金融行业基础架构发展趋势。

/   ///

浅谈FTP协议

FTP协议是我们工作中常用的文件传输协议,但是你知道它是如何工作的吗?它又包含了哪些特殊的地方呢?我们就聊聊FTP一些有趣的事情。

在讲技术之前,先讲一个之前处理的小问题。某天小编被业务部门找到要查询一个系统文件备份传输失败的问题,故障问题是系统平台在每天凌晨会进行定时的文件上传FTP服务器操作。但是从某天开始,文件上传总是报错,然而第二天上班后通过手动执行备份动作,上传备份竟然又成功了。在跟业务部门了解数据备份的具体情况后,开始回溯抓取故障时间点的数据包分析。如图。

故障当时,FTP服务器回复了如下告警信息:

500 OOPS: vsf_sysutil_bind

当时也是不清楚该报错含义,于是求助度娘,查到了如下信息:

浅谈FTP协议

FTP用户数量多时会出现如下错误:
500 OOPS: vsf_sysutil_bind

可能原因是PASV端口数量少(原只开60000一个端口)

修改/etc/vsftpd/vsftpd.conf,增加端口
pasv_min_port=10021
pasv_max_port=10121

按照教程提示,报错含义是FTP的数据端口资源数量太少导致。FTP的传输任务量大时,端口资源耗尽导致数据传输报错。

后续申请变更修改的FTP服务器的被动端口服务数量,问题解决。

读者可能很奇怪了,FTP为什么使用自定义的数据端口,怎么会发生端口资源不够的情况?下面我们就逐步揭开FTP协议的神秘面纱。

FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。

FTP两类链接

 #   控制链接

控制链接是建立在客户端和服务器端之间用于交换命令与应答的传输通道,用于完成两端的控制命令的传输,例如登录、创建和切换目录、退出等控制动作。

FTP默认控制链接的端口为TCP21,客户端使用随机端口连接服务端的21端口,进行控制链接的请求。

 #   数据链接

数据链接,顾名思义是用来进行数据传输的链接通道,实现数据的上传或者下载。

浅谈FTP协议

数据链接示意图

FTP两种传输模式

两种传输模式指的是在数据链接层面,如果是服务器主动发起数据链接的请求,则是主动模式;如果客户端主动发起数据链接的请求,则是被动模式。下面我们着重讲讲两种模式的区别。

 #   主动模式

Standard (PORT模式,主动模式)。

浅谈FTP协议

在主动模式下,FTP客户端向服务器发出PORT 命令,告诉服务端客户端采用主动模式并开放了端口。FTP服务器接收到PORT命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口,进行数据传输。

浅谈FTP协议

读者此时会有疑问,服务器端怎么确定要主动连接客户端的哪个随机端口呢?答案是在控制链接里面已经商定好了,请看下图:

浅谈FTP协议

在客户端向FTP服务器端返回参数的时候,包含了数据链路建立连接时客户端提供的端口号,如上图所示,计算方式为 228*256+134=58502,这个端口就是服务端使用20端口主动建立连接的目的端口号。

 #   被动模式

为了解决服务端发起到客户端的连接问题,人们开发了一种不同的FTP连接方式,这就是所谓的被动方式,或者叫做PASV方式,当客户端通知服务端它处于被动模式时才启用。

浅谈FTP协议

在被动模式中,控制链接和数据链接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。与主动方式不同在于,客户端不会提交PORT命令允许服务器回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(该端口是在服务端预先配置的一段端口范围),并发送PORT 命令给客户端,然后客户端发起从本地端口到服务器端口的连接用来传送数据。

浅谈FTP协议

在上图的数据连接过程中,红色字体代表客户端发送数据,蓝色字体代表服务端发送数据,此时服务器端告知本次的数据连接使用自己的117*256+125=30077端口。

接下来客户端就会发起新的数据连接,去请求服务器的30077端口。

浅谈FTP协议

其中需要注意的是,在被动模式下,服务端的数据端口是预先自定义的,如果设置的端口范围很小,当出现客户端大量数据传输请求的时候,容易导致端口资源耗尽,使新的FTP数据连接无法建立,开篇出现的故障问题就是这个原因。

服务段在配置文件体现端口设置范围如下:

pasv_enable=YES

#开启被动传输模式
pasv_min_port=30000

#被动传输端口最小值

pasv_max_port=30100

#被动传输端口最大值

max_per_ip=3

#每个ip地址最多允许开3个线程

 #   两种模式的区别

两种模式在控制链接层面都是相同的,都是客户端主动请求建立链接。不同之处,在于数据链接层面,站在服务器的角度考虑,如果是自己主动发起数据的请求,则是主动模式,如果是客户端发起数据链接的请求,则是被动模式。主动模式对于客户端测的安全防护不利,因为客户端要生成新的数据端口,提供服务端进行数据访问;而被动模式对服务端的安全防护不利,因为服务端需要生成新的端口,提供客户端访问。

但是如果在中间网络传输链路中,存在防火墙设备,那怎么才能检测出两种传输模式中使用的数据传输端口呢?这就需要中间防火墙设备支持应用层网关检测功能,能够主动检测出该策略是FTP应用,并主动检测到使用的端口访问策略。

网络防火墙对FTP协议支持

针对FTP数据传输的特殊性,网络层防火墙需要能够识别FTP的应用特性。现在多数防火墙支持应用层识别,识别到FTP的数据传输模式,并临时开放对应的数据传输端口访问。

浅谈FTP协议

山石防火墙应用层网关支持类型

并且在防火墙对应接口下面,使用应用识别,如下图所示:

FTP响应代码

相对于HTTP协议,FTP协议也有自己一套响应码,响应码由服务端返回客户端,提示各类问题原因。

响应码用三位数字编码表示:

 #   第一个数字表示命令状态的一般性指示,比如响应成功、失败或不完整。

1 表示服务器正确接收信息,还未处理。

2 表示服务器已经正确处理信息。

3 表示服务器正确接收信息,正在处理。

4 表示信息暂时错误。

5 表示信息永久错误。

 #   第二个数字表示响应类型的分类。

0 表示语法。

1 表示系统状态和信息。

2 表示连接状态。

3 表示与用户认证有关的信息。

4 表示未定义。

5 表示与文件系统有关的信息。

 #   第三个数字表示更加详细的信息。

以下是常用的FTP响应码:
200:命令成功
212:目录状态
214:帮助信息
215:名字系统类型 
220:新用户服务准备好了 
221:服务关闭控制连接,可以退出登录 
225:数据连接打开,无传输正在进行 
226:关闭数据连接,请求的文件操作成功 
230:用户登录 
250:请求的文件操作完成 
257:创建\”PATHNAME\” 
331:用户名正确,需要口令

结束语

FTP是我们日常工作经常会用到的文件传输工具,熟悉并了解它的工作原理,对于分析解决出现的各类问题有很大的帮助。同时,对于FTP服务器性能优化也提供了很多的指导。在部署的同时需要考虑网络防火墙对FTP应用识别的能力。

留言板///

浅谈FTP协议 留言区

往期回顾

////

  • 统一监控管理平台Prometheus驱动的实现

  • 浅谈Go语言内存管理

  • 设计模式在项目实战中的应用

  • 浅谈数据安全

欢迎关注EBCloud!

作者 | 李坤

原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/32908.html

Like (0)
EBCloud的头像EBCloud
Previous 2024年4月2日 下午3:29
Next 2024年4月2日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注