FTP-主动模式和被动模式的分析

二叶草
二叶草
二叶草
1214
文章
0
评论
2020年3月22日09:14:50 评论 502

FTP,很多人都非常熟悉了。很多FTP实现的软件使用主动模式来传输数据,那主动模式和被动模式的区别在哪呢?

为啥有了主动模式还有被动模式呢?

借助wireshark来分析FTP主动模式和被动模式的区别。

FTP对应的最新RFC是RFC959,在RFC959里面,有1张图片,很形象地描述了FTP的工作原理。

FTP-主动模式和被动模式的分析

从图1中看出,FTP的客户端和服务器建立了两个TCP连接,一个用来传输命令和响应,一个用来传输数据,很明显,两个连接不会使用同一个端口。

FTP服务器用来传输命令的默认端口是21,而用来传输数据的端口是20(主动模式),用wireshark来深入学习下。

认证

FTP-主动模式和被动模式的分析

1、2、3号数据包用来与FTP服务器建立TCP连接。

[4]FTP Server:服务器已经准备好了。

当建立连接后,服务器会主动告知客户端,FTP服务已经准备好了,这个数据包可能包括FTP服务器的信息,比如用的什么服务器软件,如果是filezilla server,里面会包括filezilla的字样。

[5]FTP Client:我是ultrain。

5号数据包告诉FTP服务器,自己的用户名,用来认证。从数据包详细看,FTP命令格式很简单,USER ultrain,显示命令,然后是命令的参数。

服务器收到USER命令后,会查看是否存在这个用户,如果存在,就向客户端索要该用户的密码,向客户端发送约定的代码和一个字符串,这个代码范围从200到532,不是连续的。看下部分代码的含义。

FTP-主动模式和被动模式的分析

可以想到,6号数据包的代码是331。

6号包的具体内容:

FTP-主动模式和被动模式的分析

为了与客户端向服务器发送的命令格式对应,服务器的响应格式,331 描述,这样方便处理。

有些FTP服务器在处理后面的字符串参数时,并没有校验长度,导致缓冲区溢出。比如USER命令,后面的用户名如果发送过长,假如FTP服务器没有正确处理,可能会导致服务器崩溃或缓冲区溢出攻击,当然,这是另外一个问题了。

[6]FTP Server:名字是OK的,需要密码。

[7]FTP Client:密码是654312。

[8]FTP Server:用户登录进来了。

认证过程很简单,这里省略了TCP的ACK确认包,所以数据包数量比你真实抓到的数据包少。然后,用户名和密码都是明文的,这是一个比较大的安全隐患。

数据传输

接下来是数据的传输过程。

FTP-主动模式和被动模式的分析

[19]FTP Client:当前目录是什么(PWD)?

[20]FTP Server:"/"是当前目录。

服务器好敷衍啊。。。其实不是,还没开始传输数据。接着看。

[21]FTP Client:我的IP地址和端口是192.168.17.128和1057。

[22]FTP Server:PORT命令执行成功。

PORT命令用来通知FTP服务器,传输数据时,客户端监听的端口。通常我们的理解,客户端是主动去连接服务器,服务器等着客户端来连接。而这里不一样,在传输数据时,服务器来主动连接客户端,太阳打北边出来了,这是放下身段了。

你可能会问,端口1057怎么来的,明明是433。这里有一个公式,但是我不写,写公式可能会降低阅读量。如何计算呢?就是4*256+33=1057,不信你可以用手机算下。至于为什么这么做,我就不知道了,知道是规定就行了。

22和23号数据包是客户端告知服务器,使用什么传输模式。

FTP-主动模式和被动模式的分析

25、26及27号数据包,服务器使用20端口主动与客户端的1057端口建立连接,28和29号数据包传输FTP数据。我把光标放在了30号数据包上,当然是想引起你们的注意。

30号数据包是对28、29号数据包的确认,一般来说,TCP中,每发送一个数据包,都会收到一个确认的ACK包,而这里服务器发了两个TCP包,却收到了一个ACK确认,怎么看出来30号数据包是对28和29号数据包的确认,从ACK号可以看出,30号ACK是1529,27号的seq是1,28和29的长度加起来是1460+68=1528,所以30号是1529。

把两个数据包的确认包合并成1个包,看起来像累积确认,其实是SACK协议,选择确认协议,这个不是本文重点,不能走在跑题的不归路上。

31、32、33、34是TCP的4次挥手,传输命令的连接没有断开,而数据通道一旦发送完数据,连接就断开了,可以回过头看下,第1张图的注意2,数据连接不需要一直存在。假如有段时间不需要传输数据,如果一直保持着数据连接,就会占用资源。

到这里我觉得文章很长了,但是还没介绍完。上面的过程是FTP的主动模式,FTP的被动模式与主动模式不同(这一句是废话),FTP的主动模式与被动模式,是站在服务器的角度上,主动模式:数据连接中,服务器主动连接客户端。被动模式:数据连接中,服务器被动接受服务器的连接。

看下被动模式PASV,这是另外一个数据包。

FTP-主动模式和被动模式的分析

[23]FTP Client:请开启被动模式PASV。

[24]FTP Server:进入被动模式,我监听的端口是1388,数据传输时,你来连接这个端口。

26、27和28号数据包,是服务器被动接受来自客户端的连接,和主动模式对比,主动模式是服务器用20端口,主动与客户端的1057端口建立连接。

还记得文章开头的问题吗?为啥还存在被动模式呢,这是因为从FTP服务器与客户端建立数据连接时,可能会被防火墙等边界设备过滤掉,或者在边界设备上,假如做了NAT,FTP服务器无法主动连接客户端(不知道说的对不对)。

至此,结束。

但是,我使用filezillaServer作为FTP服务器,设置支持被动模式,用windows自带的ftp客户端连接,输入命令literal pasv,传输数据时依然使用的主动模式,貌似windows的ftp客户端不支持被动模式。如果你知道原因,请告诉我。

本文来源于:FTP-主动模式和被动模式的分析-变化吧门户
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧门户观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

转载请注明:{{title}}-变化吧
  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 赞助本站
  • 支付宝扫一扫
  • weinxin
二叶草
linux下FTP安装及调优 ftp工具

linux下FTP安装及调优

前言: 在之前交换平台的开发中,FTP的各种操作算是核心功能点。 在FTP的开发中,遇到了不少坑。 如FTP需要设置被动模式,否则10M以上的包可能会上传失败。 如FTP需要设置囚牢模式,否则访问的文...